728x90
๐คJOIN์ด๋?
- ์ฌ๋ฌ ํ ์ด๋ธ ๊ฐ์ ์ฐ๊ฒฐ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๊ณ ๊ฒฐํฉํ๋ ๊ฒ์ ์๋ฏธ
- ๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ ์ ๋ณด๋ฅผ ํจ๊ป ๊ฐ์ ธ์์ ํ์ํ ์ ๋ณด๋ฅผ ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ํฉ์น๋ ๊ฒ์ ๋ชฉ์
๐คJOIN์ ์ฌ์ฉํ๋ ์ด์ ?
- ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ตฌ์กฐ์ ํน์ง์ผ๋ก ์ ๊ทํ๋ฅผ ์ํํ๋ฉด ์๋ฏธ ์๋ ๋ฐ์ดํฐ์ ์งํฉ์ผ๋ก ํ ์ด๋ธ์ด ๊ตฌ์ฑ๋๊ณ , ๊ฐ ํ ์ด๋ธ๋ผ๋ฆฌ ๊ด๊ณ(Relationship)๋ฅผ ๊ฐ๊ฒ ๋๋ค.
- ์์ ํน์ง์ผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ์ฅ ๊ณต๊ฐ์ ํจ์จ์ฑ๊ณผ ํ์ฅ์ฑ์ด ํฅ์๋๋ค.
- ์๋ก ๊ด๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ ์ด๋ธ๋ก ๋๋์ด ์ ์ฅ๋๋ฏ๋ก, ๊ฐ ํ ์ด๋ธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฒ์ํ๊ธฐ ์ํด์ ์กฐ์ธ์ด ํ์ํ๋ค.
๐ฉJOIN ์ข ๋ฅ
โป๏ธ๋ด๋ถ ์กฐ์ธ(Inner Join)
- ๋ ํ
์ด๋ธ์์
๊ณตํต๋ ๊ฐ
์ ๊ฐ์ง๊ณ ์๋ ํ๋ค๋ง์ ๋ฐํ - ๊ทธ๋ฅ ์กฐ์ธ์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉด ๋ด๋ถ ์กฐ์ธ์ ์๋ฏธ
- ๋ช ์์ ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์กฐ์ธ ์กฐ๊ฑด์ด ๋ช ํํ๊ฒ ํํ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ฟผ๋ฆฌ์ ์๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์์ ํ๊ฑฐ๋ ์ ์ง ๋ณด์ํ๋ ๋ฐ ์์ด์๋ ์ฉ์ด
๋ช ์์ ์กฐ์ธ ํํ(explicit)
- Join ํค์๋์ ํจ๊ป ON ํค์๋ ์ฌ์ฉ
SELECT * FROM s_table
INNER JOIN d_table ON
s_table.id = d_table.id;
์์์ ์กฐ์ธ ํํ(implicit)
- Select ๊ตฌ๋ฌธ์ From์ ์์ ํ ์ด๋ธ์ ๋ถ๋ฆฌํ๋ ์ฝค๋ง(,)๋ฅผ ์ฌ์ฉ
SELECT * FROM s_table, d_table WHERE s_table.id = d_table.id;
โป๏ธ๊ต์ฐจ ์กฐ์ธ(Cross Join)
- ํ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ๊ณผ ๋ค๋ฅธ ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ์ ์กฐ์ธ์ํค๋ ๊ธฐ๋ฅ
- ์ ์ฒด ํ ๊ฐ์๋ ๋ ํ ์ด๋ธ์ ๊ฐ ํ์ ๊ฐ์๋ฅผ ๊ณฑํ ์๋งํผ ๋๋ค.
SELECT tableA.key, tableB.key
FROM tableA
CROSS JOIN tableB;
โป๏ธ์ ํ ์กฐ์ธ(Self Join)
- ํ ํ ์ด๋ธ์์ ์๊ธฐ ์์ ์ ์กฐ์ธ์ ์ํค๋ ๊ฒ์ด๋ค.
- ๋ณ์นญ์ ์ ์ด์ฃผ์ด ํผ๋์ ๋ฐฉ์งํด์ผํ๋ค.
SELECT a.key b.key
FROM tableA a
JOIN tableA b ON a.key = b.key;
โป๏ธ์ธ๋ถ ์กฐ์ธ(Outer Join)
- ์กฐ์ธ ๋์ ํ ์ด๋ธ์์ ํน์ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ํ์ํ ์ํฉ์์ ์ธ๋ถ ์กฐ์ธ์ ํ์ฉํ์ฌ ํจ๊ณผ์ ์ผ๋ก ๊ฒฐ๊ณผ ์งํฉ์ ์์ฑํ ์ ์๋ค.
- ์กฐ๊ฑด์ ์ผ์นํ๋ ๋ฐ์ดํฐ์ ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ ๋ชจ๋ ๊ฐ์ง๊ณ ์จ๋ค. ์ค์ํ ๊ฑด '์ด๋ค ํ ์ด๋ธ์ ์ค์ฌ์ผ๋ก Join ํ ๊ฒ์ธ๊ฐ'์ด๋ค.
์ผ์ชฝ ์ธ๋ถ ์กฐ์ธ(Left Outer Join)
์ผ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ
๊ณผ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์์ ์ผ์ชฝ ํ ์ด๋ธ๊ณผ ๊ณตํต๋ ๊ฐ
์ ๊ฐ์ง๊ณ ์๋ ํ๋ค์ ๋ฐํ- ๋ง์ฝ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์์ ๊ณตํต๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ํ์ด ์๋ค๋ฉด
Null
์ ๋ฐํ
SELECT * FROM tableA a
LEFT JOIN tableB b ON a.key = b.key;
์ค๋ฅธ์ชฝ ์ธ๋ถ ์กฐ์ธ(Right Outer Join)
์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ํ
๊ณผ์ผ์ชฝ ํ ์ด๋ธ์์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ๊ณผ ๊ณตํต๋ ๊ฐ
์ ๊ฐ์ง๊ณ ์๋ ํ๋ค์ ๋ฐํ- ๋ง์ฝ ์ผ์ชฝ ํ
์ด๋ธ์์ ๊ณตํต๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ํ์ด ์๋ค๋ฉด
Null
์ ๋ฐํ
SELECT * FROM tableA a
RIGHT JOIN tableB b ON a.key = b.key;
์์ ์ธ๋ถ ์กฐ์ธ(Full Outer Join)
- ๋ ํ
์ด๋ธ์์
๋ชจ๋ ๊ฐ
์ ๋ฐํ - ๊ณตํต๋ ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์๋ ํ์ด ์๋ค๋ฉด
Null
์ ๋ฐํ
SELECT * FROM tableA a
FULL OUTER JOIN tableB b ON a.key = b.key;
โJoin ์ฅ์
- Join์ ์ฌ์ฉํ๋ฉด ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํตํฉํ์ฌ ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์ฆ, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ฑฐ๋ ์์ฝํ ์ ์๋ค.
- ๊ธฐ๋ณธ ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฅํ์ฌ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ป์ ์ ์๋ค.
โJoin ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- SQL ๋ฌธ์ฅ์ ์๋ฏธ๋ฅผ ์ ๋๋ก ํ์
- SQL์ ์ด๋ป๊ฒ ์์ฑํ๋๋์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ์ข์ฐ๋๋ค. ์ด๋ค ์ง์๋ฅผ ์ํํ ๊ฒ์ธ์ง๋ฅผ ๋ช ํํ๊ฒ ์ ์ํ ํ, ๋นํจ์จ ์ ๊ฑฐํ์ฌ ์ต์ ์ SQL์ ์์ฑํด์ผ ํ๋ค.
- ๋ช
ํํ ์กฐ์ธ ์กฐ๊ฑด ์ ๊ณต
- ์กฐ์ธ ์กฐ๊ฑด์ ๋ช
ํํ๊ฒ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ, ์๋์น ์๊ฒ
(Cross Join)
์ด ์ํ๋ ์ ์๋ค.
- ์กฐ์ธ ์กฐ๊ฑด์ ๋ช
ํํ๊ฒ ์ ๊ณตํ์ง ์์ ๊ฒฝ์ฐ, ์๋์น ์๊ฒ
โJoin ์ฌ์ฉ์ ๊ณ ๋ ค์ฌํญ
- ์กฐ์ธํ ๋์์ ์งํฉ์ ์ต์ํ
- ์งํฉ์ ์ต์ํํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด, ์กฐ๊ฑด์ ๋จผ์ ์ ์ฉํ์ฌ ๊ด๊ณ๋ฅผ ๋งบ์ ์งํฉ์ ์ต์ํํ ํ, ์กฐ์ธ์ ๋งบ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค.
- ํจ๊ณผ์ ์ธ ์ธ๋ฑ์ค ํ์ฉ
- ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ฉด, ์กฐ์ธ ์ฐ์ฐ์ ๋น์ฉ์ ๊ทน์ ์ผ๋ก ๋ฎ์ถ ์ ์๋ค.
๋๋ณด๊ธฐ
์ถ์ฒ
- https://velog.io/@ragnarok_code/DataBase-%EC%A1%B0%EC%9D%B8Join%EC%9D%B4%EB%9E%80
- https://parkmuhyeun.github.io/etc/database/2022-06-27-Join/
- https://github.com/WeareSoft/tech-interview/blob/master/contents/db.md#join
- https://hongong.hanbit.co.kr/sql-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95-joininner-outer-cross-self-join/
728x90
'๐์คํฐ๋ > ๋ฐ์ดํฐ๋ฒ ์ด์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐ์ดํฐ๋ฒ ์ด์ค] - DB Connection Pool (0) | 2024.04.04 |
---|---|
[๋ฐ์ดํฐ๋ฒ ์ด์ค] - B-Tree & B+Tree (0) | 2024.04.01 |
[๋ฐ์ดํฐ๋ฒ ์ด์ค] - ์ธ๋ฑ์ค (0) | 2024.03.31 |