๐SQL ๋ฌธ๋ฒ - ์กฐ์ธ(JOIN)

๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ํ
์ด๋ธ์ ๋๋ ์ค๊ณํ๊ณ ,
ํ์ํ ๋ ์กฐ์ธ(JOIN) ์ผ๋ก ์ฐ๊ฒฐํด ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ!
์ด๋ฒ ๊ธ์์๋ INNER JOIN, OUTER JOIN, NATURAL JOIN ๋ฑ์ ๊ฐ๋ ์ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
โ JOIN์ด๋?
JOIN์ ๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ ๊ณตํต๋ ์ปฌ๋ผ(ํค) ์ ๊ธฐ์ค์ผ๋ก ์ฐ๊ฒฐํด
ํ๋์ ๊ฒฐ๊ณผ ํ
์ด๋ธ๋ก ๋ง๋๋ SQL ๋ฌธ๋ฒ์
๋๋ค.
๐ ํ์ค์ ์:
๊ณ ๊ฐ ์ ๋ณด๋Customer
, ์ฃผ๋ฌธ ์ ๋ณด๋Orders
์ ๋ฐ๋ก ์ ์ฅ
โ ๊ณ ๊ฐ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ํ ์ด๋ธ์ ์กฐ์ธํ์ฌ "๋๊ฐ ๋ฌด์์ ์ฃผ๋ฌธํ๋๊ฐ"๋ฅผ ์ ์ ์์!
๐ ๊ธฐ๋ณธ JOIN ๋ฌธ๋ฒ
1. ๋ช ์์ JOIN (๊ถ์ฅ)
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ1
JOIN ํ
์ด๋ธ2 ON ์กฐ๊ฑด;
2. ์์์ JOIN (๊ณผ๊ฑฐ ๋ฐฉ์)
SELECT ์ปฌ๋ผ๋ช
FROM ํ
์ด๋ธ1, ํ
์ด๋ธ2
WHERE ์กฐ๊ฑด;
3. ์์ ํ ์ด๋ธ
๐ธ INNER JOIN
โข ์์ชฝ ํ
์ด๋ธ์์ ์กฐ๊ฑด์ ๋ง๋ ํ๋ง ์ฐ๊ฒฐ
โข ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๋ง์ด ์ฌ์ฉ๋จ
SELECT C.name, O.book
FROM Customer C
JOIN Orders O ON C.custid = O.custid;

โข Customer์ Orders ๋ ๋ค custid๊ฐ ์กด์ฌํ๋ ํ๋ง ์ถ๋ ฅ
โข custid = 3 (๋ฐ๋ฏผ์)์ ์ฃผ๋ฌธ ๊ธฐ๋ก์ด ์์ด์ ์ ์ธ๋จ
โข custid = 5๋ Orders์ ์์ง๋ง Customers์ ์์ด์ ์ ์ธ๋จ
๐ธ OUTER JOIN
์กฐ๊ฑด์ ๋ง์ง ์๋๋ผ๋ ํ์ชฝ ํ
์ด๋ธ์ ํ์ ์ ์งํ๋ JOIN
โ ๋๋ฝ๋ ์ ๋ณด๊น์ง ํฌํจํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
JOIN ์ข ๋ฅ | ๊ธฐ์ค ํ ์ด๋ธ ์ ์ง | ์กฐ์ธ ์กฐ๊ฑด ๋ถ์ผ์น | ํฌํจ ์ฌ๋ถ | ์ค๋ช |
LEFT OUTER JOIN | ์ผ์ชฝ ํ ์ด๋ธ | ์ค๋ฅธ์ชฝ NULL ์ฑ์ | โ (์ผ์ชฝ ๊ธฐ์ค) | ์ผ์ชฝ ๋ฐ์ดํฐ๋ ๋ฌด์กฐ๊ฑด ํฌํจ |
RIGHT OUTER JOIN | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ | ์ผ์ชฝ NULL ์ฑ์ | โ (์ค๋ฅธ์ชฝ ๊ธฐ์ค) | ์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ๋ ๋ฌด์กฐ๊ฑด ํฌํจ |
FULL OUTER JOIN | ์์ชฝ ๋ชจ๋ | ์๋ก NULL ์ฑ์ | โ (์ ์ฒด ์ ์ง) | ์์ชฝ ํ ์ด๋ธ ๋ชจ๋ ์ ์ง (DBMS์ ๋ฐ๋ผ ์ ํ) |
1) LEFT OUTER JOIN ๊ฒฐ๊ณผ (๋ชจ๋ ๊ณ ๊ฐ ์ ์ง)
SELECT C.name, O.book
FROM Customer C
LEFT OUTER JOIN Orders O ON C.custid = O.custid;
โข Customer์ ์๋ ๋ชจ๋ ๊ณ ๊ฐ์ด ๊ธฐ์ค์ด ๋จ
โข ์ฃผ๋ฌธ์ด ์๋ ๊ณ ๊ฐ(๋ฐ๋ฏผ์, ์ ์๋ฆฐ)๋ ๊ฒฐ๊ณผ์ ํฌํจ๋จ
โข ๋์ ์ฐ๊ฒฐ๋ ์ฃผ๋ฌธ์ด ์์ผ๋ฏ๋ก book์ NULL๋ก ๋์ด
2) RIGHT OUTER JOIN ๊ฒฐ๊ณผ (๋ชจ๋ ์ฃผ๋ฌธ ์ ์ง)
SELECT C.name, O.book
FROM Customer C
RIGHT OUTER JOIN Orders O ON C.custid = O.custid;

โข Orders ํ ์ด๋ธ์ ๋ชจ๋ ์ฃผ๋ฌธ์ ๊ธฐ์ค์ผ๋ก
โข ๊ณ ๊ฐ ์ ๋ณด๊ฐ ์๋ ์ฃผ๋ฌธ(custid = 5)๋ ๊ฒฐ๊ณผ์ ํฌํจ
โข ํด๋น ๊ณ ๊ฐ์ด ์์ผ๋ฏ๋ก name์ NULL
๐ธ NATURAL JOIN
โข ๊ณตํต๋ ์์ฑ๋ช
์ด ์์ผ๋ฉด ์๋์ผ๋ก ์กฐ์ธ
โข ์ค๋ณต๋ ์ปฌ๋ผ์ 1๊ฐ๋ก ์ถ๋ ฅ๋จ (์ง๊ด์ ์ด์ง๋ง ์์ธก ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ์์)
SELECT *
FROM Book
NATURAL JOIN Orders;

bookid๊ฐ ์์ชฝ ํ ์ด๋ธ์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ด ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก JOINํจ
์ค๋ณต๋ bookid๋ ๊ฒฐ๊ณผ์ ํ ๋ฒ๋ง ์ถ๋ ฅ๋จ
๐ธ SELF JOIN
ํ๋์ ํ ์ด๋ธ์ ์๊ธฐ ์์ ๊ณผ ์กฐ์ธํ ๋ ์ฌ์ฉ
์ฃผ๋ก ๊ณ์ธต ๊ตฌ์กฐ(๋ถ์, ์์ฌ-์ง์ ๊ด๊ณ) ๋ฅผ ํํํ ๋ ์ฐ์
SELECT E.name AS ์ง์, M.name AS ์์ฌ
FROM Employee E
JOIN Employee M ON E.managerid = M.empid;

Employee ํ ์ด๋ธ์ E, M ๋ ๋ฒ ์ฌ์ฉํด์
E์ managerid = M์ empid ์ธ ๊ฒฝ์ฐ ์กฐ์ธ
์ฆ, โ์ด ์ง์์ ์์ฌ๋ ๋๊ตฌ์ธ๊ฐ?โ๋ฅผ ํํํ ์
โ ์ค์ ์์ ๋ชจ์
-- ๊ณ ๊ฐ ์ด๋ฆ๊ณผ ์ฃผ๋ฌธํ ๋์์ ์ด๋ฆ
SELECT C.name, B.bookname
FROM Customer C
JOIN Orders O ON C.custid = O.custid
JOIN Book B ON O.bookid = B.bookid;
-- ์ฃผ๋ฌธํ์ง ์์ ๊ณ ๊ฐ๋ ํฌํจ (LEFT OUTER JOIN)
SELECT C.name, O.orderid
FROM Customer C
LEFT OUTER JOIN Orders O ON C.custid = O.custid;
๐ง ๋ง๋ฌด๋ฆฌ
JOIN ์ข ๋ฅ | ์ค๋ช | ๋๋ฝ ๋ฐ์ดํฐ ํฌํจ ์ฌ๋ถ |
INNER JOIN | ์์ชฝ ํ ์ด๋ธ ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํ๋ง ๋ฐํ | โ |
LEFT OUTER JOIN | ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ + ๋งค์นญ๋๋ ์ค๋ฅธ์ชฝ ํ | โ (์ผ์ชฝ ๊ธฐ์ค) |
RIGHT OUTER JOIN | ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ + ๋งค์นญ๋๋ ์ผ์ชฝ ํ | โ (์ค๋ฅธ์ชฝ ๊ธฐ์ค) |
FULL OUTER JOIN | ์์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ํฌํจ (๋งค์นญ ์ ๋ผ๋ ํฌํจ) | โ (์์ชฝ ๋ค ์ ์ง) |
NATURAL JOIN | ๊ณตํต ์์ฑ ์๋ ์กฐ์ธ, ์ค๋ณต ์์ฑ์ 1๊ฐ๋ก ์ ๋ฆฌ๋จ | ์กฐ๊ฑด ์๋ ์ถ๋ก |
SELF JOIN | ์๊ธฐ ์์ ๊ณผ ์กฐ์ธํ์ฌ ๊ณ์ธต์ /๊ด๊ณ์ ๊ตฌ์กฐ ํํ | - |
๐ ํ์ต ํ
โข INNER JOIN์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด์ ์์ ํ ์ ํ
โข OUTER JOIN์ ๋ฐ์ดํฐ ๋๋ฝ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๊ณ ์ถ์ ๋
โข JOIN์ด ๋ง์์ง๋ฉด ์์์ ON ์กฐ๊ฑด์ ์ ํํ ํ์ธํด์ผ ํจ
โข ๋ณ์นญ(alias)์ ์ ํ์ฉํ๋ฉด ๊ฐ๋ ์ฑ์ด ๋์์ง