๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ์ถ์ถํ๊ฑฐ๋ ๋ถ์ํ ๋ ์ข ์ข ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํด์ผ ํฉ๋๋ค. ์ด๋ JOIN์ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. MariaDB์์ JOIN์ ์ฌ์ฉํ๋ฉด ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ํจ๊ณผ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
โฃ ๋ชฉ์ฐจ
ํ
์ด๋ธ ์์ฑ, ์ ๋ณด ์กฐํ, ์์ , ์กฐํ, ์ญ์ ์ ๊ดํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
INNER JOIN๐
INNER JOIN์ ๋ ํ ์ด๋ธ ๊ฐ์ ์ผ์นํ๋ ํ๋ง์ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ด๋ จ ๋ฐ์ดํฐ๋ง์ ๊ฐ์ ธ์ฌ ์ ์์ด ๋ฐ์ดํฐ์ ์ ํ์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
SELECT *
FROM ํ
์ด๋ธ1
INNER JOIN ํ
์ด๋ธ2 ON ํ
์ด๋ธ1.์ด = ํ
์ด๋ธ2.์ด;
LEFT JOIN๐
LEFT JOIN์ ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ํ์ ๋ฐํํฉ๋๋ค. ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ํ์ด ์๋ ๊ฒฝ์ฐ์๋ NULL ๊ฐ์ ๋ฐํํฉ๋๋ค.
SELECT *
FROM ์ผ์ชฝํ
์ด๋ธ
LEFT JOIN ์ค๋ฅธ์ชฝํ
์ด๋ธ ON ์ผ์ชฝํ
์ด๋ธ.์ด = ์ค๋ฅธ์ชฝํ
์ด๋ธ.์ด;
RIGHT JOIN๐
RIGHT JOIN์ LEFT JOIN๊ณผ ๋ฐ๋๋ก ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ์ผ์ชฝ ํ ์ด๋ธ์ ์ผ์นํ๋ ํ์ ๋ฐํํฉ๋๋ค.
SELECT *
FROM ์ผ์ชฝํ
์ด๋ธ
RIGHT JOIN ์ค๋ฅธ์ชฝํ
์ด๋ธ ON ์ผ์ชฝํ
์ด๋ธ.์ด = ์ค๋ฅธ์ชฝํ
์ด๋ธ.์ด;
CROSS JOINโ๏ธ
CROSS JOIN์ ๋ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์กฐํฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ฒซ ๋ฒ์งธ ํ ์ด๋ธ์ ํ ์์ ๋ ๋ฒ์งธ ํ ์ด๋ธ์ ํ ์๋ฅผ ๊ณฑํ ๋งํผ์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋ฉ๋๋ค. ๋ณดํต, ๋ ํ ์ด๋ธ ๊ฐ์ ๋ชจ๋ ๊ฐ๋ฅํ ์กฐํฉ์ ์์ฑํ ๋ ์ฌ์ฉํฉ๋๋ค.
SELECT *
FROM ํ
์ด๋ธ1
CROSS JOIN ํ
์ด๋ธ2;
์๋ฅผ ๋ค์ด, 3๊ฐ์ ์ ํ๊ณผ 2๊ฐ์ ์นดํ ๊ณ ๋ฆฌ๊ฐ ์์ ๋, ๋ชจ๋ ์ ํ๊ณผ ์นดํ ๊ณ ๋ฆฌ์ ์กฐํฉ์ ๋ฐํํฉ๋๋ค.
SELF JOIN๐
SELF JOIN์ ๊ฐ์ ํ ์ด๋ธ์ ๋ ๋ฒ ์ฐธ์กฐํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ฃผ๋ก ๊ณ์ธต์ ๋ฐ์ดํฐ ๋๋ ์๊ธฐ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค.
SELECT A.์ด, B.์ด
FROM ํ
์ด๋ธ A, ํ
์ด๋ธ B
WHERE A.๊ธฐ์ค์ด = B.๊ธฐ์ค์ด;
์๋ฅผ ๋ค์ด, ์ง์ ํ ์ด๋ธ์์ ๊ฐ ์ง์์ ๋งค๋์ ์ ๋ณด๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
NATURAL JOIN๐ฟ
NATURAL JOIN์ ๋ ํ ์ด๋ธ ๊ฐ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ด์ ์๋์ผ๋ก ๊ธฐ์ค์ผ๋ก ์ผ์ JOIN์ ์ํํฉ๋๋ค. ๋์ผํ ์ด์ ๋ช ์์ ์ผ๋ก ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
SELECT *
FROM ํ
์ด๋ธ1
NATURAL JOIN ํ
์ด๋ธ2;
NATURAL JOIN์ ๋์ผํ ์ด๋ฆ์ ์ด์ด ์ฌ๋ฌ ๊ฐ ์์ ๋ ํนํ ์ ์ฉํฉ๋๋ค.
USING ์ ๐ ๏ธ
USING ์ ์ JOIN์์ ํน์ ์ด์ ๊ธฐ์ค์ผ๋ก ๋ ํ ์ด๋ธ์ ๊ฒฐํฉํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค.
SELECT *
FROM ํ
์ด๋ธ1
INNER JOIN ํ
์ด๋ธ2 USING(์ด);
USING ์ ์ SQL ๋ฌธ์ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
ON ์ ๐
ON ์ ์ JOIN ์กฐ๊ฑด์ ๋ช ์ํ ๋ ์ฌ์ฉ๋๋ฉฐ, ๋ณด๋ค ์ ์ฐํ ์กฐ๊ฑด์ ์ง์ ํ ์ ์์ต๋๋ค.
SELECT *
FROM ํ
์ด๋ธ1
INNER JOIN ํ
์ด๋ธ2 ON ํ
์ด๋ธ1.์ด = ํ
์ด๋ธ2.์ด;
ON ์ ์ ์๋ก ๋ค๋ฅธ ์ด๋ฆ์ ์ด์ ๊ธฐ์ค์ผ๋ก JOIN์ ์ํํ ๋ ์ ์ฉํฉ๋๋ค.
์ค์ ์์ฉ ์์ ๐ก
๋ง๋ฆฌ์DB์์ JOIN์ ํ์ฉํ์ฌ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๊ฒฐํฉํ๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ฃผ๋ฌธ ํ ์ด๋ธ๊ณผ ๊ณ ๊ฐ ํ ์ด๋ธ์ ์๋ก ๋ค์ด, INNER JOIN, LEFT JOIN, RIGHT JOIN์ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฐ์ , ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์์ ๋ฐ์ดํฐ
์ฐ์ , ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๊ณ ๊ฐ ํ ์ด๋ธ (customers)
๊ณ ๊ฐID | ์ด๋ฆ | ๋์ |
---|---|---|
1 | ํ๊ธธ๋ | ์์ธ |
2 | ์ด์์ | ๋ถ์ฐ |
3 | ์ฅ๋ณด๊ณ | ์ ์ฃผ |
4 | ์ด์์ | ๋๊ตฌ |
์ฃผ๋ฌธ ํ ์ด๋ธ (orders)
์ฃผ๋ฌธID | ๊ณ ๊ฐID | ์ ํ๋ช | ๊ธ์ก |
---|---|---|---|
101 | 1 | ๋ ธํธ๋ถ | 1500 |
102 | 2 | ์ค๋งํธํฐ | 800 |
103 | 1 | ํ๋ธ๋ฆฟ | 600 |
104 | 3 | ์ค๋งํธ์์น | 200 |
INNER JOIN ์์
INNER JOIN์ ์ฌ์ฉํ์ฌ ๊ณ ๊ฐ์ ์ด๋ฆ๊ณผ ํด๋น ๊ณ ๊ฐ์ด ์ฃผ๋ฌธํ ์ ํ๋ช ์ ์กฐํํฉ๋๋ค.
SELECT `customers`.`์ด๋ฆ`, `orders`.`์ ํ๋ช
`
FROM `customers`
INNER JOIN `orders` ON `customers`.`๊ณ ๊ฐID` = `orders`.`๊ณ ๊ฐID`;
๊ฒฐ๊ณผ
์ด๋ฆ | ์ ํ๋ช |
---|---|
ํ๊ธธ๋ | ๋ ธํธ๋ถ |
์ด์์ | ์ค๋งํธํฐ |
ํ๊ธธ๋ | ํ๋ธ๋ฆฟ |
์ฅ๋ณด๊ณ | ์ค๋งํธ์์น |
LEFT JOIN ์์
LEFT JOIN์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ณ ๊ฐ์ ์ด๋ฆ๊ณผ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค. ์ฃผ๋ฌธ ์ ๋ณด๊ฐ ์๋ ๊ณ ๊ฐ๋ ํฌํจ๋ฉ๋๋ค.
SELECT `customers`.`์ด๋ฆ`, `orders`.`์ ํ๋ช
`
FROM `customers`
LEFT JOIN `orders` ON `customers`.`๊ณ ๊ฐID` = `orders`.`๊ณ ๊ฐID`;
๊ฒฐ๊ณผ
์ด๋ฆ | ์ ํ๋ช |
---|---|
ํ๊ธธ๋ | ๋ ธํธ๋ถ |
ํ๊ธธ๋ | ํ๋ธ๋ฆฟ |
์ด์์ | ์ค๋งํธํฐ |
์ฅ๋ณด๊ณ | ์ค๋งํธ์์น |
๊น์ ์ | NULL |
RIGHT JOIN ์์
RIGHT JOIN์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ฃผ๋ฌธ๊ณผ ํด๋น ๊ณ ๊ฐ์ ์ด๋ฆ์ ์กฐํํฉ๋๋ค. ๊ณ ๊ฐ ์ ๋ณด๊ฐ ์๋ ์ฃผ๋ฌธ๋ ํฌํจ๋ฉ๋๋ค.
SELECT `customers`.`์ด๋ฆ`, `orders`.`์ ํ๋ช
`
FROM `customers`
RIGHT JOIN `orders` ON `customers`.`๊ณ ๊ฐID` = `orders`.`๊ณ ๊ฐID`;
๊ฒฐ๊ณผ
์ด๋ฆ | ์ ํ๋ช |
---|---|
ํ๊ธธ๋ | ๋ ธํธ๋ถ |
์ด์์ | ์ค๋งํธํฐ |
ํ๊ธธ๋ | ํ๋ธ๋ฆฟ |
์ฅ๋ณด๊ณ | ์ค๋งํธ์์น |
CROSS JOIN ์์
๋ ํ ์ด๋ธ ๊ฐ์ ์ซ์ ์กฐํฉ์ ์์ฑํ๋ ๊ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด, 1๋ถํฐ 3๊น์ง์ ์ซ์๋ฅผ ํฌํจํ๋ ํ ์ด๋ธ๊ณผ ์ํ๋ฒณ A๋ถํฐ C๊น์ง์ ๋ฌธ์๋ฅผ ํฌํจํ๋ ํ ์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.
์ซ์ ํ ์ด๋ธ (numbers)
์ซ์ |
---|
1 |
2 |
3 |
์ํ๋ฒณ ํ ์ด๋ธ (letters)
์ํ๋ฒณ |
---|
A |
B |
C |
์ด์ CROSS JOIN์ ์ฌ์ฉํ์ฌ ๋ ํ
์ด๋ธ ๊ฐ์ ๋ชจ๋ ์กฐํฉ์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
SELECT `numbers`.`์ซ์`, `letters`.`์ํ๋ฒณ`
FROM `numbers`
CROSS JOIN `letters`;
์์ ์ฟผ๋ฆฌ๋ ์ซ์ ํ ์ด๋ธ๊ณผ ์ํ๋ฒณ ํ ์ด๋ธ์ CROSS JOINํ์ฌ ๋ชจ๋ ์ซ์์ ๋ชจ๋ ์ํ๋ฒณ์ ์กฐํฉ์ ์์ฑํฉ๋๋ค.
๊ฒฐ๊ณผ
์ซ์ | ์ํ๋ฒณ |
---|---|
1 | A |
1 | B |
1 | C |
2 | A |
2 | B |
2 | C |
3 | A |
3 | B |
3 | C |
์์ ๊ฒฐ๊ณผ์์๋ ์ซ์์ ์ํ๋ฒณ์ ๋ชจ๋ ์กฐํฉ์ด ๋์ด๋ฉ๋๋ค. ์ด๋ ๊ฐ ์ซ์์ ๋ชจ๋ ์ํ๋ฒณ์ ์กฐํฉํ์ฌ ์์ฑ๋๋ ์นดํฐ์ ๊ณฑ(Cartesian Product)์ ๋๋ค.
SELF JOIN ์์
SELF JOIN์ ์ฌ์ฉํ์ฌ ๊ฐ์ ํ ์ด๋ธ ๋ด์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ง์ ํ ์ด๋ธ์์ ๊ฐ ์ง์์ ๋งค๋์ ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
์ง์ ํ ์ด๋ธ (employees)
์ง์ID | ์ด๋ฆ | ์์ฌID |
---|---|---|
1 | Alice Lee | 3 |
2 | Bob Smith | 3 |
3 | Carol Brown | NULL |
4 | David Kim | 2 |
5 | Emily Park | 2 |
์ด์ SELF JOIN์ ์ฌ์ฉํ์ฌ ๊ฐ ์ง์์ ์์ฌ๋ฅผ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
SELECT `e1`.`์ด๋ฆ` AS `์ง์`, COALESCE(`e2`.`์ด๋ฆ`, '์์') AS `์์ฌ`
FROM `employees e1`
LEFT JOIN `employees e2` ON `e1`.`์์ฌID` = `e2`.`์ง์ID`;
์์ ์ฟผ๋ฆฌ๋ employees ํ ์ด๋ธ์ ๋ ๋ฒ ์ฐธ์กฐํ์ฌ e1๊ณผ e2๋ผ๋ ๋ณ์นญ์ ์ฌ์ฉํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฐธ์กฐ(e1)์์๋ ๊ฐ ์ง์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ณ , ๋ ๋ฒ์งธ ์ฐธ์กฐ(e2)์์๋ ์์ฌ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ต๋๋ค. LEFT JOIN์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ง์์ ๊ฐ์ ธ์ค๋ฉด์ ์์ฌ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฌ์ ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค. ์์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ '์์'์ด ํ์๋ฉ๋๋ค.
๊ฒฐ๊ณผ
์ง์ | ์์ฌ |
---|---|
Alice Lee | Carol Brown |
Bob Smith | Carol Brown |
Carol Brown | ์์ |
David Kim | Bob Smith |
Emily Park | Bob Smith |
์์ ๊ฒฐ๊ณผ์์๋ ๊ฐ ์ง์์ ์ด๋ฆ๊ณผ ํด๋น ์ง์์ ์์ฌ์ ์ด๋ฆ์ด ํ์๋ฉ๋๋ค. ๋ง์ฝ ์์ฌ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ '์์'์ผ๋ก ํ์๋ฉ๋๋ค.
NATURAL JOIN ์์
NATURAL JOIN์ ๋ ํ
์ด๋ธ ์ฌ์ด์์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ด์ ๊ธฐ์ค์ผ๋ก ์๋์ผ๋ก ์กฐ์ธํ๋ ์ ํ์ ์กฐ์ธ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ ํ
์ด๋ธ์ด ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ด์ ๊ฐ์ง๊ณ ์๊ณ , ํด๋น ์ด์ ๊ธฐ์ค์ผ๋ก ์กฐ์ธํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ ์ ๋ณด์ ๋ถ์ ์ ๋ณด๊ฐ ์๋ ๋ ๊ฐ์ ํ ์ด๋ธ์ด ์์ต๋๋ค.
์ฌ์ ํ ์ด๋ธ (employees)
์ฌ์ID | ์ด๋ฆ | ๋ถ์ID |
---|---|---|
1 | Alice | 101 |
2 | Bob | 102 |
3 | Carol | 103 |
๋ถ์ ํ ์ด๋ธ (departments)
๋ถ์ID | ๋ถ์๋ช |
---|---|
101 | IT |
102 | Sales |
103 | HR |
์ด์ NATURAL JOIN์ ์ฌ์ฉํ์ฌ ๋ ํ ์ด๋ธ์ ์กฐ์ธํด๋ณด๊ฒ ์ต๋๋ค.
SELECT *
FROM `employees`
NATURAL JOIN `departments`;
์์ ์ฟผ๋ฆฌ๋ ๋ ํ ์ด๋ธ ๊ฐ์ NATURAL JOIN์ ์ํํฉ๋๋ค. ์ด๋ ๋ ํ ์ด๋ธ ์ฌ์ด์์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ด์ ๊ธฐ์ค์ผ๋ก ์๋์ผ๋ก ์กฐ์ธ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ "๋ถ์ID"๋ผ๋ ์ด์ด ๋์ผํ๊ฒ ์กด์ฌํ๋ฏ๋ก ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋์ผ๋ก ์กฐ์ธ์ด ์ด๋ฃจ์ด์ง๋๋ค.
๊ฒฐ๊ณผ
์ฌ์ID | ์ด๋ฆ | ๋ถ์ID | ๋ถ์๋ช |
---|---|---|---|
1 | Alice | 101 | IT |
2 | Bob | 102 | Sales |
3 | Carol | 103 | HR |
์์ ๊ฒฐ๊ณผ์์๋ ์ฌ์ ํ ์ด๋ธ๊ณผ ๋ถ์ ํ ์ด๋ธ ์ฌ์ด์์ ๋ถ์ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์กฐ์ธํ์ฌ ์ฌ์ ์ ๋ณด์ ํด๋น ๋ถ์์ ๋ถ์๋ช ์ ๋ํ๋ ๋๋ค.
ํต์ฌ ๋ด์ฉ๐