๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Oracle/sql

[๐Ÿ“š sql ๋ฌธ๋ฒ•์„ ๊ณต๋ถ€ํ•˜์ž ๐Ÿ“š] JOIN(INNER ,LEFT, RIGHT, FULL, NATURAL...

by ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์€ ๊ฐ์ž 2023. 4. 18.

SQL์„ ์ด์šฉํ• ๋•Œ ๋‘๊ฐœ์˜ ํ…Œ์ด๋ธ”์„ ํ•ฉ์ณ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ณ  ์‹ถ์„๋•Œ๊ฐ€ ์žˆ๋‹ค! ๊ทธ๋•Œ ์“ฐ์ด๋Š”๊ฒƒ์ด ๋ฐ”๋กœ JOIN์ด๋‹ค. 

์˜ค๋Š˜์€ JOIN์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

JOIN์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. JOIN์„ ์‚ฌ์šฉํ•˜๋ฉด ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ JOIN ์ข…๋ฅ˜๋Š” INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘์—์„œ INNER JOIN์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ JOIN ์œ ํ˜•์ด๋ฉฐ, ๋‹ค๋ฅธ JOIN ์œ ํ˜•์€ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

 

INNER JOIN

INNER JOIN ์‚ฌ์šฉ๋ฐฉ๋ฒ•

SELECT *
FROM ํ…Œ์ด๋ธ”1
INNER JOIN ํ…Œ์ด๋ธ”2
ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ํ…Œ์ด๋ธ”1๊ณผ ํ…Œ์ด๋ธ”2 ๊ฐ„์˜ ๊ณตํ†ต ์—ด์„ ๊ธฐ์ค€์œผ๋กœ INNER JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฃผ๋ฌธ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ…Œ์ด๋ธ”๊ณผ ์ œํ’ˆ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํ…Œ์ด๋ธ”์ด ์žˆ์„ ๊ฒฝ์šฐ, ๋‘ ํ…Œ์ด๋ธ”์—์„œ ์ œํ’ˆ ID ์—ด์„ ๊ณตํ†ต ์—ด๋กœ ์‚ฌ์šฉํ•˜์—ฌ INNER JOIN์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ด๋ธ”1: ์ฃผ๋ฌธ ์ •๋ณด

 

OrderID   ProductID   CustomerID   OrderDate
----------------------------------------------
1         100         1            2022-01-01
2         200         1            2022-01-02
3         100         2            2022-01-03
4         300         3            2022-01-04

ํ…Œ์ด๋ธ”2: ์ œํ’ˆ ์ •๋ณด

 

ProductID   ProductName   ProductPrice
-------------------------------------
100         ์ œํ’ˆ1         10000
200         ์ œํ’ˆ2         20000
300         ์ œํ’ˆ3         30000

์œ„์˜ ๋‘ ํ…Œ์ด๋ธ”์—์„œ INNER JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ์—ด์ธ ProductID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

SELECT *
FROM ์ฃผ๋ฌธ์ •๋ณด
INNER JOIN ์ œํ’ˆ์ •๋ณด
ON ์ฃผ๋ฌธ์ •๋ณด.ProductID = ์ œํ’ˆ์ •๋ณด.ProductID;

-- ๊ฒฐ๊ณผ
OrderID   ProductID   CustomerID   OrderDate    ProductName   ProductPrice
------------------------------------------------------------------------
1         100         1            2022-01-01   ์ œํ’ˆ1         10000
2         200         1            2022-01-02   ์ œํ’ˆ2         20000
3         100         2            2022-01-03   ์ œํ’ˆ1         10000
4         300         3            2022-01-04   ์ œํ’ˆ3         30000

LEFT JOIN

LEFT JOIN์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ ๊ณตํ†ต ์—ด ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ์™€ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. LEFT JOIN์„ ์‚ฌ์šฉํ•˜๋ฉด ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

LEFT JOIN ์‚ฌ์šฉ๋ฐฉ๋ฒ•

SELECT *
FROM ํ…Œ์ด๋ธ”1
LEFT JOIN ํ…Œ์ด๋ธ”2
ON ํ…Œ์ด๋ธ”1.์—ด = ํ…Œ์ด๋ธ”2.์—ด;

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ์™ผ์ชฝ ํ…Œ์ด๋ธ”์ธ ํ…Œ์ด๋ธ”1์˜ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ, ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์ธ ํ…Œ์ด๋ธ”2์—์„œ ํ…Œ์ด๋ธ”1๊ณผ ๊ณตํ†ต ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. JOIN ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ ˆ์ฝ”๋“œ๋Š” NULL ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.  ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ด๋ธ”1: ์ฃผ๋ฌธ ์ •๋ณด

OrderID   ProductID   CustomerID   OrderDate
----------------------------------------------
1         100         1            2022-01-01
2         200         1            2022-01-02
3         100         2            2022-01-03
4         300         3            2022-01-04

 

ํ…Œ์ด๋ธ”2: ์ œํ’ˆ ์ •๋ณด

ProductID   ProductName   ProductPrice
-------------------------------------
100         ์ œํ’ˆ1         10000
200         ์ œํ’ˆ2         20000

 

์œ„์˜ ๋‘ ํ…Œ์ด๋ธ”์—์„œ LEFT JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ์—ด์ธ ProductID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT *
FROM ์ฃผ๋ฌธ์ •๋ณด
LEFT JOIN ์ œํ’ˆ์ •๋ณด
ON ์ฃผ๋ฌธ์ •๋ณด.ProductID = ์ œํ’ˆ์ •๋ณด.ProductID;

-- ๊ฒฐ๊ณผ
OrderID   ProductID   CustomerID   OrderDate    ProductName   ProductPrice
------------------------------------------------------------------------
1         100         1            2022-01-01   ์ œํ’ˆ1         10000
2         200         1            2022-01-02   ์ œํ’ˆ2         20000
3         100         2            2022-01-03   ์ œํ’ˆ1         10000
4         300         3            2022-01-04   NULL         NULL

 

์œ„์˜ ๊ฒฐ๊ณผ์—์„œ INNER JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. INNER JOIN์„ ์‚ฌ์šฉํ•˜๋ฉด ProductID ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ๋‘ ํ…Œ์ด๋ธ”์„ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ฃผ๋ฌธ ์ •๋ณด์™€ ์ œํ’ˆ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

RIGHT JOIN

RIGHT JOIN์€ JOIN ์กฐ๊ฑด์— ๋งž๋Š” ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ ์ค‘์—์„œ ์™ผ์ชฝ ํ…Œ์ด๋ธ”๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ํ•จ๊ป˜ ์ถœ๋ ฅํ•˜๋Š” JOIN ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, RIGHT JOIN์€ LEFT JOIN๊ณผ ๋ฐ˜๋Œ€๋กœ ์˜ค๋ฅธ์ชฝ ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

RIGHT JOIN ์‚ฌ์šฉ๋ฐฉ๋ฒ•

SELECT *
FROM ํ…Œ์ด๋ธ”1
RIGHT JOIN ํ…Œ์ด๋ธ”2
ON ํ…Œ์ด๋ธ”1.์—ด์ด๋ฆ„ = ํ…Œ์ด๋ธ”2.์—ด์ด๋ฆ„;

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ํ…Œ์ด๋ธ”2๋ฅผ ๊ธฐ์ค€์œผ๋กœ RIGHT JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ…Œ์ด๋ธ”2์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ํ…Œ์ด๋ธ”1์—์„œ๋Š” ํ…Œ์ด๋ธ”2์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์™€์„œ ํ•จ๊ป˜ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”1๊ณผ ํ…Œ์ด๋ธ”2์—์„œ ์—ด ์ด๋ฆ„์ด ๊ฐ™์€ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

 

RIGHT JOIN์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์™ผ์ชฝ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ถœ๋ ฅ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” LEFT JOIN๊ณผ RIGHT JOIN์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, UNION์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ JOIN ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

students ํ…Œ์ด๋ธ”:

| id | name      | age | gender |
|----|-----------|-----|--------|
| 1  | John      | 18  | M      |
| 2  | Jane      | 19  | F      |
| 3  | Michael   | 20  | M      |
| 4  | Rachel    | 18  | F      |
| 5  | David     | 19  | M      |

grades ํ…Œ์ด๋ธ”:

| student_id | grade |
|------------|-------|
| 1          | 80    |
| 2          | 90    |
| 3          | 85    |
| 5          | 95    |

์œ„ ๋‘ ํ…Œ์ด๋ธ”์—์„œ RIGHT JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ "students" ํ…Œ์ด๋ธ”๊ณผ "grades" ํ…Œ์ด๋ธ”์„ JOINํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SELECT *
FROM grades
RIGHT JOIN students
ON grades.student_id = students.id;

์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

| student_id | grade | id  | name     | age | gender |
|------------|-------|-----|----------|-----|--------|
| 1          | 80    | 1   | John     | 18  | M      |
| 2          | 90    | 2   | Jane     | 19  | F      |
| 3          | 85    | 3   | Michael  | 20  | M      |
| 5          | 95    | 5   | David    | 19  | M      |
| NULL       | NULL  | 4   | Rachel   | 18  | F      |

๊ฒฐ๊ณผ์ ์œผ๋กœ "grades" ํ…Œ์ด๋ธ”๊ณผ "students" ํ…Œ์ด๋ธ”์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ "student_id"์™€ "id" ์—ด์„ ๊ธฐ์ค€์œผ๋กœ RIGHT JOIN์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, "grades" ํ…Œ์ด๋ธ”์—๋Š” ์žˆ๋Š”๋ฐ "students" ํ…Œ์ด๋ธ”์—๋Š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” NULL๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๊ฒฐ๊ณผ์—์„œ๋Š” "students" ํ…Œ์ด๋ธ”์—์„œ id๊ฐ€ 4์ธ Rachel ๋ฐ์ดํ„ฐ๊ฐ€ JOIN๋˜์ง€ ์•Š์•˜์ง€๋งŒ, RIGHT JOIN์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

FULL OUTER JOIN

FULL OUTER JOIN์€ LEFT OUTER JOIN๊ณผ RIGHT OUTER JOIN์„ ํ•ฉ์ณ ๋†“์€ JOIN ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‘ ํ…Œ์ด๋ธ” ์ค‘ ์–ด๋А ํ•œ ์ชฝ์—๋งŒ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

 

FULL OUTER JOIN ์‚ฌ์šฉ๋ฐฉ๋ฒ•

SELECT *
FROM ํ…Œ์ด๋ธ”1
FULL OUTER JOIN ํ…Œ์ด๋ธ”2
ON ํ…Œ์ด๋ธ”1.์—ด์ด๋ฆ„ = ํ…Œ์ด๋ธ”2.์—ด์ด๋ฆ„;

 

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ํ…Œ์ด๋ธ”1๊ณผ ํ…Œ์ด๋ธ”2 ๋ชจ๋‘๋ฅผ ๊ธฐ์ค€์œผ๋กœ FULL OUTER JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ํ…Œ์ด๋ธ”์—์„œ ์–ด๋А ํ•œ ์ชฝ์—๋งŒ ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋„ ๋ชจ๋‘ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ์—ด ์ด๋ฆ„์ด ๊ฐ™์€ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

FULL OUTER JOIN์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ƒ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ์—๋Š” LEFT OUTER JOIN ๋˜๋Š” RIGHT OUTER JOIN์„ ์กฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, UNION์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ JOIN ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

employees ํ…Œ์ด๋ธ”:

| emp_id | first_name | last_name | salary |
|--------|------------|-----------|--------|
| 1      | John       | Smith     | 50000  |
| 2      | Sarah      | Johnson   | 60000  |
| 3      | David      | Lee       | 70000  |
| 4      | Rachel     | Kim       | 80000  |

orders ํ…Œ์ด๋ธ”:

| order_id | order_date | emp_id | amount |
|----------|------------|--------|--------|
| 101      | 2022-01-01 | 1      | 1000   |
| 102      | 2022-02-01 | 3      | 2000   |
| 103      | 2022-03-01 | 2      | 3000   |

์œ„ ๋‘ ํ…Œ์ด๋ธ”์—์„œ FULL OUTER JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ "employees" ํ…Œ์ด๋ธ”๊ณผ "orders" ํ…Œ์ด๋ธ”์„ JOINํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SELECT *
FROM employees
FULL OUTER JOIN orders
ON employees.emp_id = orders.emp_id;

์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

| emp_id | first_name | last_name | salary | order_id | order_date | amount |
|--------|------------|-----------|--------|----------|------------|--------|
| 1      | John       | Smith     | 50000  | 101      | 2022-01-01 | 1000   |
| 2      | Sarah      | Johnson   | 60000  | 103      | 2022-03-01 | 3000   |
| 3      | David      | Lee       | 70000  | 102      | 2022-02-01 | 2000   |
| 4      | Rachel     | Kim       | 80000  | NULL     | NULL       | NULL   |
| NULL   | NULL       | NULL      | NULL   | 104      | 2022-04-01 | 5000   |

์œ„ ๊ฒฐ๊ณผ์—์„œ๋Š” "employees" ํ…Œ์ด๋ธ”๊ณผ "orders" ํ…Œ์ด๋ธ”์—์„œ ๋ชจ๋‘ ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ™์€ "emp_id" ์—ด์„ ๊ธฐ์ค€์œผ๋กœ FULL OUTER JOIN์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, "employees" ํ…Œ์ด๋ธ”์—๋Š” ์žˆ๋Š”๋ฐ "orders" ํ…Œ์ด๋ธ”์—๋Š” ์—†๋Š” ๋ฐ์ดํ„ฐ์™€, "orders" ํ…Œ์ด๋ธ”์—๋Š” ์žˆ๋Š”๋ฐ "employees" ํ…Œ์ด๋ธ”์—๋Š” ์—†๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋˜์–ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ "orders" ํ…Œ์ด๋ธ”์—๋Š” ์žˆ๋Š”๋ฐ "employees" ํ…Œ์ด๋ธ”์—๋Š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” "employees" ํ…Œ์ด๋ธ”์˜ ๊ฐ’์ด NULL๋กœ ํ‘œ์‹œ๋˜๊ณ , "employees" ํ…Œ์ด๋ธ”์—๋Š” ์žˆ๋Š”๋ฐ "orders" ํ…Œ์ด๋ธ”์—๋Š” ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” "orders" ํ…Œ์ด๋ธ”์˜ ๊ฐ’์ด NULL๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. 

๊ทธ๋ ‡๋‹ค๋ฉด ๋งค๋ฒˆ ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜๊ณ  ํ•ด์•ผ๋งŒ JOIN ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค!

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ NATURAL JOIN์ด๋‹ค.

NATURAL JOIN

NATURAL JOIN์€ JOIN ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์„ JOIN ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. NATURAL JOIN์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์—ด์„ ์ž๋™์œผ๋กœ ์ฐพ์•„์„œ JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, NATURAL JOIN์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ํ…Œ์ด๋ธ”์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์—ด์„ ์ฐพ์•„์„œ ํ•ด๋‹น ์—ด์„ ๊ธฐ์ค€์œผ๋กœ INNER JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. NATURAL JOIN์€ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ JOIN์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ์—ด ์ด๋ฆ„์ด ์—†๋Š” ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. 

 

NATURAL JOIN ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

SELECT *
FROM ํ…Œ์ด๋ธ”1
NATURAL JOIN ํ…Œ์ด๋ธ”2;

์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ํ…Œ์ด๋ธ”1๊ณผ ํ…Œ์ด๋ธ”2์—์„œ ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ์—ด์„ ์ฐพ์•„์„œ NATURAL JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ด ์ด๋ฆ„์ด ๊ฐ™์€ ์—ด์„ ๊ธฐ์ค€์œผ๋กœ INNER JOIN์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ์—ด ์ด๋ฆ„์ด ์—†๋Š” ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. 

 

NATURAL JOIN์€ ์‚ฌ์šฉํ•˜๊ธฐ ๊ฐ„ํŽธํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€๋งŒ, ์—ด ์ด๋ฆ„์ด ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž๋™์œผ๋กœ JOIN ์กฐ๊ฑด์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฒฐ๊ณผ๊ฐ€ ์˜ˆ์ธก๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

employees ํ…Œ์ด๋ธ”:

| emp_id | first_name | last_name | dept_id |
|--------|------------|-----------|---------|
| 1      | John       | Smith     | 2       |
| 2      | Jane       | Doe       | 1       |
| 3      | Jack       | Jones     | 2       |
| 4      | Jill       | Smith     | 3       |

departments ํ…Œ์ด๋ธ”:

| dept_id | dept_name |
|---------|-----------|
| 1       | Sales     |
| 2       | Marketing |
| 3       | HR        |

์œ„ ๋‘ ํ…Œ์ด๋ธ”์—์„œ NATURAL JOIN์„ ์‚ฌ์šฉํ•˜์—ฌ "employees" ํ…Œ์ด๋ธ”๊ณผ "departments" ํ…Œ์ด๋ธ”์„ JOINํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

SELECT *
FROM employees
NATURAL JOIN departments;

์œ„ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. 

| emp_id | first_name | last_name | dept_id | dept_name |
|--------|------------|-----------|---------|-----------|
| 2      | Jane       | Doe       | 1       | Sales     |
| 1      | John       | Smith     | 2       | Marketing |
| 3      | Jack       | Jones     | 2       | Marketing |
| 4      | Jill       | Smith     | 3       | HR        |

๊ฒฐ๊ณผ์ ์œผ๋กœ "employees" ํ…Œ์ด๋ธ”๊ณผ "departments" ํ…Œ์ด๋ธ”์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ "dept_id" ์—ด์„ ๊ธฐ์ค€์œผ๋กœ INNER JOIN์ด ์ˆ˜ํ–‰๋˜๋ฉฐ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ค‘๋ณต๋˜๋Š” ์—ด ์ด๋ฆ„์ด ์—†๋Š” ์ƒˆ๋กœ์šด ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ NATURAL JOIN์„ ์‚ฌ์šฉํ•˜๋ฉด JOIN ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์—ด ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ JOIN์ด ์ˆ˜ํ–‰๋˜์–ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. 

์˜ค๋Š˜์€ ์ด๋ ‡๊ฒŒ JOIN์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค! 

๋‹ค์Œ Sql ๋ฌธ๋ฒ• ๊ณต๋ถ€๋„ ์—ด์‹ฌํžˆ ํ•ด๋ด์š”! ๐Ÿง๐Ÿง