SQL/Join

[SQL] SQL JOIN ์™„์ „ ์ •๋ฆฌ (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)

U__q 2026. 3. 10. 01:08
728x90

๐Ÿ“ SQL JOIN ์™„์ „ ์ •๋ฆฌ (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์กฐํšŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ JOIN์ž…๋‹ˆ๋‹ค.

JOIN์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ์กฐํšŒํ•˜๋Š” SQL ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค.

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” SQL์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” JOIN ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“ JOIN์ด ํ•„์š”ํ•œ ์ด์œ 

์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

EMP (์‚ฌ์› ํ…Œ์ด๋ธ”)

EMPNO ENAME DEPTNO
7369 SMITH 20
7499 ALLEN 30
7521 WARD 30

DEPT (๋ถ€์„œ ํ…Œ์ด๋ธ”)

DEPTNO DNAME
10 ACCOUNTING
20 RESEARCH
30 SALES

์‚ฌ์›์˜ ์ด๋ฆ„๊ณผ ๋ถ€์„œ ์ด๋ฆ„์„ ํ•จ๊ป˜ ์กฐํšŒํ•˜๋ ค๋ฉด
EMP ํ…Œ์ด๋ธ”๊ณผ DEPT ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด JOIN์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“ INNER JOIN

INNER JOIN์€ ๋‘ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒํ•˜๋Š” JOIN ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

SELECT E.ENAME, D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

ํŠน์ง•

  • ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ณตํ†ต๋œ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ
  • ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” JOIN ๋ฐฉ์‹

 

๐Ÿ“ LEFT JOIN

LEFT JOIN์€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” JOIN ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ NULL์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

SELECT E.ENAME, D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

ํŠน์ง•

  • ์™ผ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€ ์กฐํšŒ
  • ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด NULL

 

๐Ÿ“ RIGHT JOIN

RIGHT JOIN์€ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์™€ ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” JOIN ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

SELECT E.ENAME, D.DNAME
FROM EMP E
RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

ํŠน์ง•

  • ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€ ์กฐํšŒ
  • ์™ผ์ชฝ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด NULL

 

๐Ÿ“ FULL OUTER JOIN

FULL OUTER JOIN์€ ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” JOIN ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์กฐ๊ฑด์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋Š” NULL๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

SELECT E.ENAME, D.DNAME
FROM EMP E
FULL OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

ํŠน์ง•

  • LEFT JOIN + RIGHT JOIN ๊ฒฐ๊ณผ
  • ์–‘์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์กฐํšŒ

 

๐Ÿ“ CROSS JOIN

CROSS JOIN์€ ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์กฐํ•ฉํ•˜๋Š” JOIN ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

  • EMP ํ…Œ์ด๋ธ” : 3๊ฐœ ๋ฐ์ดํ„ฐ
  • DEPT ํ…Œ์ด๋ธ” : 3๊ฐœ ๋ฐ์ดํ„ฐ

์ด๋ผ๋ฉด ๊ฒฐ๊ณผ๋Š” 3 × 3 = 9๊ฐœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

SELECT *
FROM EMP
CROSS JOIN DEPT;

 

๐Ÿ“ SELF JOIN

SELF JOIN์€ ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”์„ ์ž๊ธฐ ์ž์‹ ๊ณผ JOINํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ฃผ๋กœ ์ง์›๊ณผ ๊ด€๋ฆฌ์ž ๊ด€๊ณ„๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

SELECT A.ENAME AS ์ง์›,
B.ENAME AS ๊ด€๋ฆฌ์ž
FROM EMP A
JOIN EMP B
ON A.MGR = B.EMPNO;

 

๐Ÿ“ ANSI JOIN vs Oracle JOIN

JOIN์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฌธ๋ฒ• ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ANSI JOIN (ํ‘œ์ค€ SQL)

SELECT *
FROM EMP E
JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
 

Oracle JOIN

SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
 

์ฐจ์ด์ 

  • ANSI JOIN → SQL ํ‘œ์ค€ ๋ฐฉ์‹
  • Oracle JOIN → Oracle์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹

ํ˜„์žฌ๋Š” ANSI JOIN ์‚ฌ์šฉ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿ“ JOIN ์ •๋ฆฌ

JOIN ์ข…๋ฅ˜์„ค๋ช…

INNER JOIN ๊ณตํ†ต ๋ฐ์ดํ„ฐ ์กฐํšŒ
LEFT JOIN ์™ผ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€
RIGHT JOIN ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ” ๊ธฐ์ค€
FULL OUTER JOIN ์–‘์ชฝ ํ…Œ์ด๋ธ” ๋ชจ๋‘ ์กฐํšŒ
CROSS JOIN ๋ชจ๋“  ์กฐํ•ฉ ์ƒ์„ฑ
SELF JOIN ์ž๊ธฐ ์ž์‹ ๊ณผ JOIN

 

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ

JOIN์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” SQL ๋ฌธ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ์‹ค๋ฌด์—์„œ๋Š” ๋‹ค์Œ JOIN์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • INNER JOIN
  • LEFT JOIN

JOIN์„ ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค !

728x90