๐Ÿ“ŒSQL ๋ฌธ๋ฒ• - ์กฐ์ธ(JOIN)

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ  ์„ค๊ณ„ํ•˜๊ณ ,ํ•„์š”ํ•  ๋•Œ ์กฐ์ธ(JOIN) ์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ!์ด๋ฒˆ ๊ธ€์—์„œ๋Š” INNER JOIN, OUTER JOIN, NATURAL JOIN ๋“ฑ์˜ ๊ฐœ๋…์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
avatar
2025.04.07
ยท
9 min read

4667

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ  ์„ค๊ณ„ํ•˜๊ณ ,
ํ•„์š”ํ•  ๋•Œ ์กฐ์ธ(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. ์˜ˆ์‹œ ํ…Œ์ด๋ธ”

  • 4656



๐Ÿ”ธ INNER JOIN

โ€ข ์–‘์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์— ๋งž๋Š” ํ–‰๋งŒ ์—ฐ๊ฒฐ
โ€ข ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋จ

SELECT C.name, O.book
FROM Customer C
JOIN Orders O ON C.custid = O.custid;
4657

โ€ข 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;
4658

โ€ข Orders ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์ฃผ๋ฌธ์„ ๊ธฐ์ค€์œผ๋กœ
โ€ข ๊ณ ๊ฐ ์ •๋ณด๊ฐ€ ์—†๋Š” ์ฃผ๋ฌธ(custid = 5)๋„ ๊ฒฐ๊ณผ์— ํฌํ•จ
โ€ข ํ•ด๋‹น ๊ณ ๊ฐ์ด ์—†์œผ๋ฏ€๋กœ name์€ NULL


๐Ÿ”ธ NATURAL JOIN

โ€ข ๊ณตํ†ต๋œ ์†์„ฑ๋ช…์ด ์žˆ์œผ๋ฉด ์ž๋™์œผ๋กœ ์กฐ์ธ
โ€ข ์ค‘๋ณต๋œ ์ปฌ๋Ÿผ์€ 1๊ฐœ๋กœ ์ถœ๋ ฅ๋จ (์ง๊ด€์ ์ด์ง€๋งŒ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์Œ)

SELECT *
FROM Book
NATURAL JOIN Orders;
4659

bookid๊ฐ€ ์–‘์ชฝ ํ…Œ์ด๋ธ”์— ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ด ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ JOINํ•จ
์ค‘๋ณต๋œ bookid๋Š” ๊ฒฐ๊ณผ์— ํ•œ ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋จ


๐Ÿ”ธ SELF JOIN

  • ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์ž๊ธฐ ์ž์‹ ๊ณผ ์กฐ์ธํ•  ๋•Œ ์‚ฌ์šฉ

  • ์ฃผ๋กœ ๊ณ„์ธต ๊ตฌ์กฐ(๋ถ€์„œ, ์ƒ์‚ฌ-์ง์› ๊ด€๊ณ„) ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์“ฐ์ž„

    4660
SELECT E.name AS ์ง์›, M.name AS ์ƒ์‚ฌ
FROM Employee E
JOIN Employee M ON E.managerid = M.empid;
4661

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)์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง







- ์ปฌ๋ ‰์…˜ ์•„ํ‹ฐํด