# SQL JOIN๋ฌธ
written by sohyeon, hyemin ๐ก
# 1. JOIN๋ฌธ
๋ ๊ฐ ์ด์์ ํ
์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฐ์ฌ์, From์ ์ JOIN ํํ์ ๋ฐ๋ผ 4๊ฐ์ง๋ก ๋๋์ด์ง๋ค.
์ฐ์ฐ์์ ๋ฐ๋ฅธ ๋ถ๋ฅ
- EQUI JOIN
- Non-EQUI JOIN
From์ ์ JOIN ํํ์ ๋ฐ๋ผ
- INNER JOIN
- OUTER JOIN
# 2. INNER JOIN
# 1) EQUI JOIN
- ์กฐ์ธ ๋์ ํ ์ด๋ธ์ ์นผ๋ผ ๊ฐ๋ค์ด ์๋ก ์ ํํ๊ฒ ์ผ์นํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ
WHERE
์ ์=
(Equality Condition)์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ์กฐ๊ฑด์ ๋ช ์- EQUI JOIN์ ์ฑ๋ฅ์ ๋์ด๋ ค๋ฉด INDEX ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ ํ ์ด๋ธ์ ์ฐ๊ฒฐํ ๋ Hash JOIN์ ํ์ฉํ๋ ํน์ง์ด ์๋ค.
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1, ํ
์ด๋ธ๋ช
2
WHERE ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
= ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
# INNER JOIN ๊ตฌ๋ฌธ
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1
INNER JOIN ํ
์ด๋ธ๋ช
2
ON ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
= ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
# 2) NATURAL JOIN
- EQUI JOIN์์
=
์กฐ๊ฑด์ด ์ฑ๋ฆฝํ ๋ ๋์ผํ ์์ฑ์ด ๋๋ฒ ๋ํ๋๊ฒ ๋๋๋ฐ, ์ค๋ณต์ ์ ๊ฑฐํด ํ๋ฒ๋ง ํ๊ธฐํ๊ฒ ํ๋ ๋ฐฉ์์ด๋ค. - ๋ ํ ์ด๋ธ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง๋ ์นผ๋ผ์ด ๋ชจ๋ JOIN
- ๋์ผํ ์นผ๋ผ์ ๋ด๋ถ์ ์ผ๋ก ์ฐพ๊ฒ ๋๋ฏ๋ก ํ ์ด๋ธ ๋ณ์นญ์ ์ฃผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 NATURAL JOIN ํ
์ด๋ธ๋ช
2
NATURAL JOIN๋ง ์คํํ๋ฉด ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์นผ๋ผ์ ๋ชจ๋ ์กฐ์ธ๋๋๋ฐ,
USING์ ์ ํ์ฉํ๋ฉด ์นผ๋ผ์ ์ ํํด ์กฐ์ธํ ์ ์๋ค.
USING์ ์์ ํฌํจ๋๋ ์นผ๋ผ์ ๋ณ์นญ์ ์ง์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1
JOIN ํ
์ด๋ธ๋ช
2
USING(์์ฑ๋ช
)
# 3) NON EQUI JOIN
- BETWEEN AND, IS NULL, IS NOT NULL, NOT IN, <, >, >=, <= ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1, ํ
์ด๋ธ๋ช
2..
WHERE (NON EQUI JOIN ์กฐ๊ฑด)
# 4) SELF JOIN
- ๊ฐ์ ํ ์ด๋ธ์์ 2๊ฐ์ ์์ฑ์ ์ฐ๊ฒฐํ์ฌ EQUI JOIN์ ํ๋ค.
-- ๋ฐฉ๋ฒ1
SELECT [๋ณ์นญ1.]์์ฑ๋ช
, [๋ณ์นญ2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 AS ๋ณ์นญ1, ํ
์ด๋ธ๋ช
2 AS ๋ณ์นญ2
WHERE ๋ณ์นญ1.์์ฑ๋ช
= ๋ณ์นญ2.์์ฑ๋ช
-- ๋ฐฉ๋ฒ2
SELECT [๋ณ์นญ1.]์์ฑ๋ช
, [๋ณ์นญ2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 AS ๋ณ์นญ1
JOIN ํ
์ด๋ธ๋ช
2 AS ๋ณ์นญ2
ON ๋ณ์นญ1.์์ฑ๋ช
= ๋ณ์นญ2.์์ฑ๋ช
# 5) CROSS JOIN
ํ ์ด๋ธ A์์ ์กฐํ๋๋ ํ๋์ ํ์ ํ ์ด๋ธ B์์ ์กฐํ๋๋ ๋ชจ๋ ํ์ ์ฐ๊ฒฐํ์ฌ ์กฐ์ธํ๋ค.
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 CROSS JOIN ํ
์ด๋ธ๋ช
2
# 3. OUTER JOIN
์ผ๋ฐ์ ์ธ INNER JOIN๊ณผ ๋น์ทํ์ง๋ง ํ ์ชฝ์ ๋ฐ์ดํฐ์์ JOIN์กฐ๊ฑด์ ์ผ์นํ์ง ์๋ ๊ฐ๊น์ง ๋ชจ๋ ๊ฐ์ ธ์ ์กฐํํ๋ค.
# 1) LEFT OUTER JOIN
JOIN ์ํ ์ ์ผ์ชฝ์ ํ๊ธฐ๋ ํ ์ด๋ธ์ JOIN์กฐ๊ฑด์ ์ผ์นํ์ง ์๋ ๊ฐ๊น์ง ๋ชจ๋ ์กฐํ๋๋ค.
-- ๋ฐฉ๋ฒ1
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 LEFT OUTER JOIN ํ
์ด๋ธ๋ช
2..
ON ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
= ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
-- ๋ฐฉ๋ฒ2
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1, ํ
์ด๋ธ๋ช
2
WHERE ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
= ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
(+)
# 2) RIGHT OUTER JOIN
JOIN ์ํ ์ ์ค๋ฅธ์ชฝ์ ํ๊ธฐ๋ ๋ฐ์ด๋ธ์ JOIN์กฐ๊ฑด์ ์ผ์นํ์ง ์๋ ๊ฐ๊น์ง ๋ชจ๋ ์กฐํ๋๋ค.
-- ๋ฐฉ๋ฒ1
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 RIGHT OUTER JOIN ํ
์ด๋ธ๋ช
2..
ON ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
= ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
-- ๋ฐฉ๋ฒ2
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1, ํ
์ด๋ธ๋ช
2
WHERE ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
(+) = ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
# 3) FULL OUTER JOIN
์กฐ์ธ ์ํ ์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๊ฐ์ ์ฝ์ด JOIN์ ์ํํ๋ค. LEFT OUTER JOIN๊ณผ RIGHT OUTER JOIN์ ๊ฒฐ๊ณผ๋ฅผ ํฉ์งํฉ์ผ๋ก ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ์ ๋์ผํ๋ค.
SELECT [ํ
์ด๋ธ๋ช
1.]์์ฑ๋ช
, [ํ
์ด๋ธ๋ช
2.]์์ฑ๋ช
....
FROM ํ
์ด๋ธ๋ช
1 FULL OUTER JOIN ํ
์ด๋ธ๋ช
2..
ON ํ
์ด๋ธ๋ช
1.์์ฑ๋ช
= ํ
์ด๋ธ๋ช
2.์์ฑ๋ช
โ RDBMS์ NoSQL