๐Ÿ’พ SQL_

[SQL] MySQL - Foreign Key & Join

CodeLoge 2025. 2. 14. 18:59

#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 ์ด๋ผ๊ณ  ํ‘œ์‹œ

Foreign 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์€ ๋‘ ํ…Œ์ด๋ธ”์ด ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋‚ด์šฉ๋งŒ ๊ฐ€์ ธ์˜ด

์˜ˆ์ œ์— ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ” 3๊ฐœ

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(๋ณ„์นญ ์„ค์ •)์„ ํ†ตํ•ด ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ด