[SQL] MySQL - Foreign Key & Join
#1 Foreign Key
: ํ ํ ์ด๋ธ์ ์ปฌ๋ผ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ Primary Key ๋๋ Unique Key์ ์ฐ๊ฒฐ, ๋ฐ์ดํฐ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋๋ฐ ์ฌ์ฉ
// ํ
์ด๋ธ ์์ฑ๊ณผ ๋์์ FOREIGN KEY ์์ฑ
CREATE TABLE ํ
์ด๋ธ๋ช
(
์ด ๋ช
์นญ1, ํน์ฑ1 ...,
์ด ๋ช
์นญ2, ํน์ฑ2 ...,
์ด ๋ช
์นญ3, ํน์ฑ3 ...,
PRIMARY KEY(์ด๋ช
์นญ)
FOREIGN KEY(์ด๋ช
์นญ) REFERENCES ์ฐธ์กฐํ
์ด๋ธ๋ช
(์ด๋ช
์นญ)
FOREIGN KEY(์ด๋ช
์นญ) REFERENCES ์ฐธ์กฐํ
์ด๋ธ๋ช
(์ด๋ช
์นญ)
);
// ์์ฑ๋์ด ์๋ ํ
์ด๋ธ์ FOREIGN KEY ์ฐ๊ฒฐ
ALTER TABLE ํ
์ด๋ธ๋ช
ADD FOREIGN KEY(์ด๋ช
์นญ) REFERENCES ์ฐธ์กฐํ
์ด๋ธ๋ช
(์ด๋ช
์นญ)
;
: Foreign Key๋ ์ฌ๋ฌ๊ฐ๋ฅผ ์ค์ ๊ฐ๋ฅ
: ์ฐธ์กฐ๋๋ ํ ์ด๋ธ์ ์๋ ๊ฐ์ ์ถ๊ฐํ ์ ์์ → ์ ํ ์ด๋ธ์ ์๋ ๊ฐ์ FOREIGN KEY์ ๋ฃ์ ์ ์์ ⇒ NULL์ ๊ฐ๋ฅ
: FOREIGN KEY๋ DESC ํ ์ด๋ธ๋ช ; ์ ํตํด ์ ๋ณด๋ฅผ ๋ณผ๋, KEY๋ถ๋ถ์ MUL ์ด๋ผ๊ณ ํ์
: ์ ์ฌ์ง๊ณผ ๊ฐ์ด At_std_num๊ณผ At_co_code๋ ์ธ๋ํค๋ก ์ง์ ๋์ด ๋ค๋ฅธ ํ ์ด๋ธ๋ก ๋ถํฐ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
ERDCLOUD๋ฅผ ํตํด ์๊ฐ์ ์ผ๋ก ๊ด๊ณ๋ฅผ ๋ณผ ์ ์๊ฒ ์ค์
๋ ธ๋์ ์ด์ ๐ : ๊ฐ ํ ์ด๋ธ์ Primary Key
ํ์ ์ด์ ๐๏ธ : Foreign Key๋ก ์ค์ ๋ ๊ฐ
#2 JOIN
: ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ์ ๋ฌถ์ด ํ๋์ ํ ์ด๋ธ๋ก ์ฌ์ฉํ๋ ๊ฒ
: ์ํ๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ํ ์ด๋ธ์ ํฉ์ด์ ธ ์๋ ๊ฒฝ์ฐ JOIN์ ์ฌ์ฉ
: ๋ด๋ถ JOIN - INNER JOIN / ์ธ๋ถ JOIN - OUTER JOIN
: ์ผ๋ฐ์ ์ธ JOIN์ INNER JOIN → ๊ทธ๋ฅ JOIN๋ง ์์ฑ ์, INNER JOIN์ผ๋ก ์ธ์ง
// JOIN ๊ธฐ๋ณธ ๊ตฌ์กฐ
SELECT ์ด๋ชฉ๋ก FROM ํ
์ด๋ธ๋ช
(INNER) JOIN ์ฐธ์กฐํ
์ด๋ธ๋ช
ON ์กฐ์ธ์กฐ๊ฑด(FK์ฐ๊ฒฐ)
WHERE ์กฐ๊ฑด
GROUP BY ์ด
HAVING ์กฐ๊ฑด
ORDER BY ์ด
;
: INNER JOIN์ ๋ ํ ์ด๋ธ์ด ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๋ด์ฉ๋ง ๊ฐ์ ธ์ด
Ex 1)
Fํ์ ์ ๋ฐ์ ํ์ ๋ช ๋จ ์ถ๋ ฅํ๊ธฐ → ํ๋ฒ, ์ด๋ฆ, ํ๊ณผ
SELECT S.STD_NUM, S.STD_NAME, S.STD_MAJOR FROM STUDENT S
INNER JOIN ATTEND A
ON S.STD_NUM = A.AT_STD_NUM
WHERE A.AT_SOCRE = 'F'
;
: INNER JOIN์ ํ ๋ JOIN๊ณผ ํ ์ด๋ธ๋ช ์ฌ์ด์ FROM์ ๋ฃ์ผ๋ฉด ์ค๋ฅ๊ฐ ๊ณ์ ๋ฐ์ํจ → ๋ค์ ์์ฑ์ ํด๋ณด๋ฉด์ FROM์ ๋ฃ์๋๋ฐ ๊ณ์ ์ค๋ฅ๊ฐ ๋ฐ์ํจ
Ex 2)
Aํ์ ์ ๋ฐ์ ํ์ ๋ช ๋จ ์ถ๋ ฅํ๊ธฐ → ํ๋ฒ, ์ด๋ฆ, ๊ณผ๋ชฉ, ๊ต์๋ช
SELECT S.STD_NUM, S.STD_NAME, C.CO_NAME, C.CO_PROFESSOR FROM ATTEND A
INNER JOIN STUDENT S
ON S.STD_NUM = A.AT_STD_NUM
INNER JOIN COURSE C
ON C.CO_CODE = A.AT_CO_CODE
WHERE A.AT_SCORE = 'A';
: ์ถ๋ ฅํ๊ณ ์ถ์ ์ ๋ณด๋ฅผ SELECT๋ฌธ ๋ค์ ๊ธฐ์
: ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฌถ์ด์ผํ๋ฉด, SELECT์์ ์ค๊ฐ์ ํ ์ด๋ธ๋ก๋ถํฐ FROM ํ๋ ๊ฒ์ด ์ข์
: ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฌถ์ด์ผํ๋ฉด ๋ฌถ์ ํ ์ด๋ธ๋ค์ ๋ชจ๋ ๋ฐ๋ก INNER JOIN ํด์ฃผ๊ณ , ON์ ์ฌ์ฉํด ์ธ๋ํค๋ฅผ ํตํด ์ฐ๊ฒฐ์ ์์ผ์ผํจ
Ex 3)
Aํ์ ์ ๋ฐ์ ํ์๋ค์ ์ ๋ณด ์ถ๋ ฅ → ํ๋ฒ, ์ด๋ฆ, ๊ณผ๋ชฉ, (์ค๊ฐ+๊ธฐ๋ง+๊ณผ์ +์ถ์) AS ์ฑ์
SELECT S.STD_NUM, S.STD_NAME, C.CO_NAME, (A.AT_MID+A.AT_FINAL+A.AT_HW+A.AT_ATTEND) AS '์ฑ์ ' FROM ATTEND A
INNER JOIN STUDENT S
ON S.STD_NUM = A.AT_STD_NUM
INNER JOIN COURSE C
ON A.AT_CO_CODE = C.CO_CODE
WHERE A.AT_SCORE = 'A';
: ๊ณ์ฐ์์ SELECT ๊ตฌ๋ฌธ์ ์๊ดํธ()๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ์ ์ฐ์ฐ์๋ฅผ ํตํด ๊ณ์ฐ์ ํ๊ณ AS(๋ณ์นญ ์ค์ )์ ํตํด ๊ฐ์ ๋ถ๋ฌ์ด