
1. ์กฐ์ธ Join
๐พ ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์๋ก ๋ฌถ์ด์ ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ๋ง๋ค์ด๋ด๋ ๊ฒ
โก๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์ค๋ณต๊ณผ ๊ณต๊ฐ ๋ญ๋น๋ฅผ ํผํ๊ณ ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ํด ์ฌ๋ฌ ๊ฐ ํ ์ด๋ธ๋ก ๋ถ๋ฆฌํด ์ ์ฅ
โก๏ธ ๋ถ๋ฆฌ๋ ํ ์ด๋ธ์ ์๋ก ๊ด๊ณ Relation ๋ฅผ ๋งบ๊ณ ์๋๋ฐ, ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ด๊ณ๋ '1๋ ๋ค' ๊ด๊ณ
ex. ํ์ ํ ๋ช ์ด ์ฌ๋ฌ ๊ณผ๋ชฉ์ ํ์ ์ ๋ฐ๋ ๊ฒ, ํ ๊ฐ์ ์์ด๋๋ก ์ฌ๋ฌ ์ํ์ ์ฃผ๋ฌธํ๋ ๊ฒ
1) INNER JOIN (๋ด๋ถ ์กฐ์ธ)
SELECT <์ด ๋ชฉ๋ก>
FROM <์ฒซ ๋ฒ์งธ ํ
์ด๋ธ>
INNER JOIN <๋ ๋ฒ์งธ ํ
์ด๋ธ>
ON <์กฐ์ธ๋ ์กฐ๊ฑด>
[WHERE ๊ฒ์์กฐ๊ฑด]


ยท ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ ๊ตฌ๋งคํ ์ด๋ธ(buytbl), ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ํ์ํ ์ด๋ธ(usertbl)
SELECT * FROM buytbl
INNER JOIN usertbl
ON buytbl.userID = usertbl.userID
WHERE buytbl.userID = 'JYP';

๐ ์ถ์ถ ๊ณผ์
1. ๊ตฌ๋งค ํ ์ด๋ธ์ userID์ธ 'JYP'๋ฅผ ์ถ์ถํ๋ค.
2. 'JYP'์ ๋์ผํ ๊ฐ์ ํ์ ํ ์ด๋ธ์ userID์ด์์ ๊ฒ์ํ ํ ์ฐพ์ผ๋ฉด ๊ตฌ๋งค ํ ์ด๋ธ๊ณผ ํ์ ํ ์ด๋ธ์ ๋ ํ์ ๊ฒฐํฉ
๐ WHERE ์ ์ ์๋ตํ๋ฉด buytbl ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๋ํด์ ์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ถ์ถ

๐พ ํ์ํ ์ด๋ง ์ถ์ถํ๋ ๋ฐฉ๋ฒ
SELECT userID, name, prodName, addr, CONCAT(mobile1, mobile2) AS '์ฐ๋ฝ์ฒ'
FROM buytbl
INNER JOIN usertbl
ON buytbl.userID = usertbl.userID
ORDER BY num;
๐ ์์ ๊ตฌ๋ฌธ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ ์ฝ๋๊ฐ ๋ฌ๋ค.
Error Code: 1052. Column 'userID' in field list is ambiguous
๐ก userID์ ๊ฒฝ์ฐ ๋ ํ ์ด๋ธ ๋ชจ๋์ ๋ค์ด ์์ด ์ด๋ ํ ์ด๋ธ์ userID ์ถ์ถํ ์ง ๋ช ์ํด์ค์ผ ํจ
SELECT buytbl.userID, name, prodName, addr, CONCAT(mobile1, mobile2) AS '์ฐ๋ฝ์ฒ'
FROM buytbl
INNER JOIN usertbl
ON buytbl.userID = usertbl.userID
ORDER BY num;

๐พ ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด ๋ณต์กํด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ํ ์ด๋ธ์ '๋ณ์นญ Alias' ์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ
SELECT B.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '์ฐ๋ฝ์ฒ'
FROM buytbl B
INNER JOIN usertbl U
ON B.userID = U.userID
WHERE B.userID = 'JYP';
๐ ์์ ๊ฐ์ด FROM ์ ์ ๋์ค๋ ํ ์ด๋ธ์ ์ด๋ฆ ๋ค์ ๋ณ์นญ์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.

๐พ ์ธ ๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํ๋ ๋ฐฉ๋ฒ



ยท ์ฒซ ๋ฒ์งธ stdTbl(ํ์ํ ์ด๋ธ) / ๋ ๋ฒ์งธ stdclubTbl / ์ธ ๋ฒ์งธ clubTbl
-- ํ์ ํ
์ด๋ธ, ๋์๋ฆฌ ํ
์ด๋ธ, ํ์๋์๋ฆฌ ํ
์ด๋ธ์ ์ด์ฉํด์ ํ์์ ๊ธฐ์ค์ผ๋ก ํ์ ์ด๋ฆ/์ง์ญ/๊ฐ์
ํ ๋์๋ฆฌ/๋์๋ฆฌ๋ฐฉ์ ์ถ๋ ฅ
SELECT S.stdName, S.addr, C.clubName, C.roomNo
FROM stdTbl S
INNER JOIN stdclubTbl SC
ON S.stdName = SC.stdName
INNER JOIN clubTbl C
ON SC.clubName = C.clubName
ORDER BY S.stdName;

2) OUTER JOIN (์ธ๋ถ ์กฐ์ธ)
๐พ ์ฃผ์ข ๊ด๊ณ์ ์๋ ํ ์ด๋ธ์์ ์ฃผํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ถํ ์ด๋ธ์ ํ๋๋ฅผ ๊ฐ์ด ์ถ๋ ฅ
SELECT <์ด ๋ชฉ๋ก>
FROM <์ฒซ ๋ฒ์งธ ํ
์ด๋ธ(LEFT ํ
์ด๋ธ)>
<LEFT|RIGHT|FULL> OUTER JOIN <๋ ๋ฒ์งธ ํ
์ด๋ธ (RIGHT ํ
์ด๋ธ)>
ON <์กฐ์ธ๋ ์กฐ๊ฑด>
[WHERE ๊ฒ์์กฐ๊ฑด];
๐ ์ ์ฒด ํ์์ ๊ตฌ๋งค๊ธฐ๋ก ๊ตฌํ๊ธฐ (๋จ, ๊ตฌ๋งค ๊ธฐ๋ก ์๋ ํ์๋ ์ถ๋ ฅ)
SELECT U.userID, U.name, B.prodName, U.addr, CONCAT(U.mobile1, U.mobile2) AS '์ฐ๋ฝ์ฒ'
FROM usertbl U
LEFT OUTER JOIN buytbl B -- LEFT OUTER JOIN์ ์ผ์ชฝ ํ
์ด๋ธ(usertbl)์ ๊ฒ์ ๋ชจ๋ ์ถ๋ ฅ๋์ด์ผ ํ๋ค๋ ๋ป
ON U.userID = B.userID
ORDER BY U.userID;

๐ RIGHT OUTER JOIN์ ์ฌ์ฉํด์ ๋์ผํ ๊ฒฐ๊ณผ ๊ฐ์ ์ป์ผ๋ ค๋ฉด ๋จ์ํ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ ์์น๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ๋จ
๐ก FULL OUTER JOIN (์ ์ฒด ์กฐ์ธ) : LEFT JOIN + RIGHT JOIN
โก๏ธ ์ผ์ชฝ ํ ์ด๋ธ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ๋ฐํ. ์กฐ์ธ ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ํด๋น ํ ์ด๋ธ์ ์ด์๋ NULL ๊ฐ์ด ์ฑ์์ง
3) CROSS JOIN (์ํธ ์กฐ์ธ)
๐พ ํ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๋ค๊ณผ ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์กฐ์ธ์ํค๋ ๊ธฐ๋ฅ
โก๏ธ ๊ฒฐ๊ณผ ๊ฐ์๋ ๋ ํ ์ด๋ธ์ ๊ฐ์๋ฅผ ๊ณฑํ ๊ฐ์
๐พ ์นดํฐ์ ๊ณฑ Cartesian Product์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๐พ ON ๊ตฌ๋ฌธ ์ฌ์ฉ x, ์ฉ๋๋ ํ ์คํธ๋ก ์ฌ์ฉํ ๋ง์ ์ฉ๋์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ ์ฃผ๋ก ์ฌ์ฉ
๐ ํ์ ํ ์ด๋ธ๊ณผ ๊ตฌ๋งค ํ ์ด๋ธ์ CROSS JOIN ๊ตฌ๋ฌธ
SELECT COUNT(*) AS '๋ฐ์ดํฐ ๊ฐ์' FROM buytbl CROSS JOIN usertbl;

4) SELF JOIN (์์ฒด ์กฐ์ธ)
๐พ ์๊ธฐ ์์ ๊ณผ ์๊ธฐ ์์ ์ด ์กฐ์ธํ๋ค๋ ์๋ฏธ
๐พ ๋ํ์ ์ธ ์๊ฐ ์กฐ์ง๋์ ๊ด๋ จ๋ ํ ์ด๋ธ

-- ์ฐ๋๋ฆฌ ์๊ด์ ์ฐ๋ฝ์ฒ๋ฅผ ํ์ธ
SELECT A.emp AS '๋ถํ์ง์' , B.emp AS '์ง์์๊ด', B.empTel AS '์ง์์๊ด์ฐ๋ฝ์ฒ'
FROM empTbl A
INNER JOIN empTbl B
ON A.manager = B.emp
WHERE A.emp = '์ฐ๋๋ฆฌ';

[ ๋ด์ฉ ์ฐธ๊ณ : ์ฑ '์ด๊ฒ์ด MySQL'์ด๋ค ]
'Database > MySQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MySQL ์ ๊ณ์ ๋ง๋ค๊ธฐ (Mac ver) - terminal VS. MySQL ์ํฌ๋ฒค์น (0) | 2024.07.25 |
---|---|
[MySQL] JDBC ์์ (0) | 2024.02.25 |
[MySQL] JDBC ์ ์, ๋ก๋ฉ, ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ์ ์ฐจ (0) | 2024.02.25 |
[MySQL] ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง | ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ (1) | 2024.02.25 |
[MySQL] ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง | 1~3 ์ ๊ทํ, ์ญ์ ๊ทํ (1) | 2024.02.25 |