์กฐ์ธ
๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ๋ฌถ์ด ํ๋์ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋๋ ๊ฒ์ ๋งํ๋ค. ๋น๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MongoDB)์์๋ lookup์ด๋ ์ฟผ๋ฆฌ๋ก ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ฐ, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ณด๋ค ์ฑ๋ฅ์ด ๋จ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋๋ก ์ฌ์ฉํ์ง ์๋๋ค.
์กฐ์ธ(๋ ผ๋ฆฌ์ ์กฐ์ธ)์ ์ข ๋ฅ
๋ ผ๋ฆฌ์ ์กฐ์ธ์ด๋ ์ฌ์ฉ์๊ฐ SQL๋ฌธ์ ์ด์ฉํด ์ํ๋ ๋ฐ์ดํฐ ๊ฒฐํฉ ๋ฐฉ์์ ๊ธฐ์ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
- Inner Join (๋ด๋ถ ์กฐ์ธ): ์ผ์ชฝ ํ ์ด๋ธ๊ณผ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ ํ์ด ๋ชจ๋ ์ผ์นํ๋ ํ์ด ์๋ ๋ถ๋ถ๋ง ํ๊ธฐ
- Outer Join
- Left Join (์ผ์ชฝ ์กฐ์ธ): ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ด ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ํ๊ธฐ
- Right Join (์ค๋ฅธ์ชฝ ์กฐ์ธ): ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ด ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ํ๊ธฐ
- Full Outer Join (์ ์ฒด ์ธ๋ถ ์กฐ์ธ): ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ํ๊น์ง ๋ชจ๋ ํ๊ธฐ
- Cross Join (๊ต์ฐจ ์กฐ์ธ): ์กฐ์ธ ์กฐ๊ฑด ์์ด ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํฉ ํ๊ธฐ
- Self Join (์ ํ ์กฐ์ธ): ํ๋์ ํ ์ด๋ธ์์ ๋ฐ์ํ๋ ์กฐ์ธ(์๊ธฐ ์์ ๊ณผ ๊ฒฐํฉ)
- โ๏ธJOIN ์๊ฐํ ์ฌ์ดํธ
โInner Join (๋ด๋ถ ์กฐ์ธ)
๋ด๋ถ ์กฐ์ธ์ ์กฐ์ธํ๊ณ ์ ํ๋ ๋ ํ ์ด๋ธ์์ ๊ณตํต๋ ์์๋ค์ ํตํด ๊ฒฐํฉํ๋ ๋ฐฉ์์ด๋ค. ์์ ๊ฐ์ด
๋์(book)
ํ
์ด๋ธ๊ณผ ๋์๊ฐ๊ฒฉ(book_price)
ํ
์ด๋ธ์์ ๊ฐ์ ๋์ id
๋ฅผ ๊ฐ์ง ํ๋ผ๋ฆฌ ๊ฒฐํฉํ์ฌ ์ถ๋ ฅํ๋ค.
* MySQL์์๋ INNER๋ฅผ ์๋ต ๊ฐ๋ฅํ๋ค. ์ฆ, JOIN๋ฌธ์ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก ๋ด๋ถ ์กฐ์ธ ์ํ
-- MySQL
SELECT * FROM book A
INNER JOIN book_price B
ON A.id = B.id;
Outer Join (์ธ๋ถ ์กฐ์ธ)
์ธ๋ถ์กฐ์ธ์ ๋ด๋ถ์กฐ์ธ๊ณผ ๋ค๋ฅด๊ฒ, ๋ ํ ์ด๋ธ ์ฌ์ด ๊ณตํต๋ ๊ฐ๋ฟ๋ง ์๋๋ผ ์ผ์นํ์ง ์๋ ๊ฐ๋ ๊ฒฐ๊ณผ์ ํฌํจ์ํจ๋ค.
โLeft (Outer) Join ์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ
์ผ์ชฝ ์กฐ์ธ์ ์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์กฐ์ธ ์กฐ๊ฑด์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
๐ก ์ผ์ชฝ ํ ์ด๋ธ: "FROM" ์ ์ ํ ์ด๋ธ
๐ก ์ค๋ฅธ์ชฝ ํ ์ด๋ธ: "LEFT JOIN" ์ ์ ํ ์ด๋ธ
-- MySQL
SELECT * FROM book A
LEFT JOIN book_price B
ON A.id = B.id;
๋ง์ฝ ์ผ์ชฝ ํ
์ด๋ธ์๋ง ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ถ๋ค๋ฉด WHERE
์ ์ ์ด์ฉํ์ฌ ์ถ๋ ฅํ ์ ์๋ค. ์ ํ
์ด๋ธ์ ๊ณตํต์ ์ผ๋ก ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ ๊ฐ ํ
์ด๋ธ์ id
๊ฐ์ ๊ฐ์ง๊ณ ์์ง๋ง, ์ผ์ชฝ์๋ง ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ B.id
์ปฌ๋ผ์ Null
๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ด๋ฅผ ์ด์ฉํด WHERE
์ ์์ ์กฐ๊ฑด์ ๊ฑธ์ด ์ถ์ถํ๋ค.
-- MySQL
SELECT * FROM book A
LEFT JOIN book_price B
ON A.id = B.id
WHERE B.id IS NULL;
โRight (Outer) Join ์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ
์ค๋ฅธ์ชฝ ์กฐ์ธ์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ผ์ชฝ ํ ์ด๋ธ์ ์กฐ์ธ ์กฐ๊ฑด์ด ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
๐ก ์ผ์ชฝ ํ ์ด๋ธ: "FROM" ์ ์ ํ ์ด๋ธ
๐ก ์ค๋ฅธ์ชฝ ํ ์ด๋ธ: "RIGHT JOIN" ์ ์ ํ ์ด๋ธ
-- MySQL
SELECT * FROM book A
RIGHT JOIN book_price B
ON A.id = B.id;
๋ง์ฝ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์๋ง ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ถ๋ค๋ฉด WHERE ์ ์ ์ด์ฉํ์ฌ ์ถ๋ ฅํ ์ ์๋ค.
-- MySQL
SELECT * FROM book A
RIGHT JOIN book_price B
ON A.id = B.id
WHERE A.id IS NULL;
โFull Outer Join ์ ์ฒด ์ธ๋ถ ์กฐ์ธ
์ ์ฒด ์ธ๋ถ ์กฐ์ธ์ ์์ชฝ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๊ธฐ๋ฒ์ผ๋ก, ์ผ์ชฝ ์กฐ์ธ๊ณผ ์ค๋ฅธ์ชฝ ์กฐ์ธ์ ํฉ์น ๊ฒฐ๊ณผ์ ๊ฐ๋ค.
* MySQL์์๋ FULL JOIN๋ฌธ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ UNION ๊ตฌ๋ฌธ์ ํตํด ์ผ์ชฝ ์กฐ์ธ๊ณผ ์ค๋ฅธ์ชฝ ์กฐ์ธ์ ํฉํด์ค๋ค.
-- MySQL
(SELECT * FROM book A
LEFT JOIN book_price B
ON A.id = B.id)
UNION
(SELECT * FROM book A
RIGHT JOIN book_price B
ON A.id = B.id);
๋ง์ฝ ๊ณตํต๋ ๋ถ๋ถ์ ์ ์ธํ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๊ณ ์ถ๋ค๋ฉด WHERE
์ ์ ์ด์ฉํ์ฌ ์ถ๋ ฅํ ์ ์๋ค.
-- MySQL
(SELECT * FROM book A
LEFT JOIN book_price B
ON A.id = B.id
WHERE B.id IS NULL)
UNION
(SELECT * FROM book A
RIGHT JOIN book_price B
ON A.id = B.id
WHERE A.id IS NULL);
โCross Join ๊ต์ฐจ ์กฐ์ธ
๊ต์ฐจ์กฐ์ธ์ด๋ ์กฐ์ธ ์กฐ๊ฑด ์์ด ๋ชจ๋ ๋ฐ์ดํฐ ์กฐํฉ์ ์ถ์ถํ๋ ๊ธฐ๋ฒ์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํ ๊ฒฐํฉ์ ์งํํ๋ค. (ON
์ ํ์ ์์)
-- MySQL
SELECT * FROM book A
CROSS JOIN book_price B;
โSelf Join ์ ํ ์กฐ์ธ
์
ํ ์กฐ์ธ์ ์๊ธฐ ์ค์ค๋ก๋ฅผ ๊ฒฐํฉ์ํค๋ ์กฐ์ธ์ด๋ค. ์๋์ ๊ฐ์ด ๊ณผ๋ชฉ์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ subject
ํ
์ด๋ธ์ด ์์ ๋, ์ ์๊ณผ๋ชฉ ๊ฐ์๋ช
์ ์ถ๋ ฅํ๊ณ ์ ์
ํ ์กฐ์ธ์ ํ ์ ์๋ค.
-- MySQL
SELECT A.code, A.subject_name, B.code, B.subject_name FROM subject A
JOIN subject B
ON A.prerequisite_code = B.code;
'๐ CS > ๐ DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DB] ์ ๊ทํ ๊ณผ์ (1NF/2NF/3NF/BCNF) (0) | 2023.08.03 |
---|---|
[DB] Persistence Framework (SQL Mapper vs ORM) (6) | 2022.09.26 |
[DB] ํํฐ์ ๋ (6) | 2022.09.05 |
[DB] SQL (0) | 2022.09.01 |
[DB] ํธ๋์ญ์ (๊ฐ๋ /ํน์ฑ/์ฐ์ฐ/์ํ) (6) | 2022.08.22 |