DATABASE_JOIN
๐ DB ( DataBase )
๐ JOIN
JOIN ์ด๋ ๋ฌด์์ธ๊ฐ?
- ๋ ์ด์์ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ํ ์ด๋ธ์ ํฉ์ณ SELECT ํ๋ ๋ฐฉ๋ฒ์ด Join์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์กฐ์ธ ์กฐ๊ฑด์ ํฌํจํ๋ WHERE ์ ์ ์์ฑํด์ผ ํ๋ค.
- ์กฐ์ธ ์กฐ๊ฑด์ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ํ ์ด๋ธ์ PK ๋ฐ FK ํค๋ก ๊ตฌ์ฑ๋๋ค.
JOIN ์ฃผ์ํ ์
- ์กฐ์ธ์ ์ฒ๋ฆฌ๋ ์ด๋ ํ ์ด๋ธ์ ๋จผ์ ์ฝ์์ง ๊ฒฐ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ( ์ฒ๋ฆฌํ ์์ ๋์ด ์๋นํ ๋ฌ๋ผ์ง๋ค. )
- INNER JOIN
์ด๋ ํ ์ด๋ธ์ ๋จผ์ ์ฝ์ด๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์์ MYSQL ์ตํฐ๋ง์ด์ ๊ฐ ์กฐ์ธ์ ์์๋ฅผ ์กฐ์ ํด์ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ ํ๋ฅผ ํ ์ ์๋ค. - OUTER JOIN
๋ฐ๋์ OUTER๊ฐ ๋๋ ํ ์ด๋ธ์ ๋จผ์ ์ฝ์ด์ผ ํ๋ฏ๋ก ์ตํฐ๋ง์ด์ ๊ฐ ์กฐ์ธ ์์๋ฅผ ์ ํํ ์ ์๋ค. - ํ ์ด๋ธ์ JOIN ํ๋ ค๋ฉด ์ต์ 1๊ฐ ์ด์์ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.
- ๋ชจ๋ ์ปฌ๋ผ์ ์ฐธ์กฐ๋ ๋ช ํํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค.
INNER JOIN
- ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ JOIN ์ข ๋ฅ ( JOIN์ Default ์ด๋ค )
- ๊ต์งํฉ
- tabel1 ๊ณผ tabel2์ key ๊ฐ์ด ๊ฐ์ ๊ฒ๋ค์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
- ๋๋ฑ ์กฐ์ธ ( Equi-Join ) ์ด๋ผ๊ณ ๋ ํ๋ฉฐ, N๊ฐ์ ํ ์ด๋ธ ์กฐ์ธ ์ N-1 ๊ฐ์ ์กฐ์ธ ์กฐ๊ฑด์ด ํ์ํ๋ค.
select col1, col2 ..
from table1 INNER JOIN table2
ON table1.column = table2.column;
INNER JOIN - ON์ ์ด์ฉํ์ฌ JOIN ์กฐ๊ฑด ์ง์
- on์ ์๋ join์ ์กฐ๊ฑด
- where์ ์๋ ์ผ๋ฐ ์กฐ๊ฑด
select col1, col2 ..
from table1 INNER JOIN table2
ON table1.column = table2.column
where col1=100;
INNER JOIN - USING์ ์ด์ฉํ์ฌ JOIN ์กฐ๊ฑด ์ง์
- ์กฐ์ธํ๊ณ ์ ํ๋ ๋ ํ ์ด๋ธ์ ์ปฌ๋ผ๋ช ์ด ๊ฐ์ ๊ฒฝ์ฐ USING์ ์ ์ด ๊ฐ๋จํ ์ ์ ์ ์๊ฒ ํด์ค๋ค.
- USING ์ ์์๋ table ์ด๋ฆ์ด๋ alias๋ฅผ ๋ช ์ํ๋ฉด ์๋๋ค.
select col1, col2 ..
from table1 JOIN table2
using (๊ณตํตcolumn) -- ๊ณตํต์ ์ธ ์ปฌ๋ผ๋ช
( ๋ ํ
์ด๋ธ์ )
where col1=100;
NATURAL JOIN
- ๋ ํ ์ด๋ธ ๊ฐ์ ๋์ผํ ์ด๋ฆ์ ๊ฐ๋ ๋ชจ๋ ์ปฌ๋ผ์ ๋ํด INNER JOIN์ ์ํํ๋ค.
select col1, col2 ..
from table1 NATURAL JOIN table2;
LEFT OUTER JOIN
select col1, col2 ..
from table1 LEFT OUTER JOIN table2
ON or USING;
RIGHT OUTER JOIN
- ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก JOIN ์กฐ๊ฑด์ ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ๊น์ง ์ถ๋ ฅํ๋ค.
select col1, col2 ..
from table1 RIGHT OUTER JOIN table2
ON or USING;
FULL OUTER JOIN
- ์์ชฝ ํ ์ด๋ธ์ ๊ธฐ์ค์ผ๋ก JOIN ์กฐ๊ฑด์ ์ผ์นํ์ง ์๋ ๋ฐ์ดํฐ๊น์ง ์ถ๋ ฅํ๋ค.
- MYSQL์ ์ง์ํ์ง ์๋๋ค.
select col1, col2 ..
from table1 FULL OUTER JOIN table2
ON or USING;
SELF JOIN
- ๊ฐ์ ํ ์ด๋ธ ๋ผ๋ฆฌ JOIN
- ๊ฐ์ ํ
์ด๋ธ ์์์ ๋ค๋ฅธ ์ ๋ณด๋ฅผ ์ด์ฉํ๊ณ ์ถ์ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์๋ฅผ ๋ค๋ฉด, ๋ชจ๋ ์ง์์ด ์๋ ํ ์ด๋ธ์์ ์ง์๋ค์ ์๊ด์ ์ถ๋ ฅํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ค.
select col1, col2 ..
from table1 a INNER JOIN table1 b
on a.col1 = b.col1;
NONE-EQUI JOIN
EQUI JOIN ์ด๋
- ๋ ํ ์ด๋ธ ๊ฐ์ ์นผ๋ผ ๊ฐ๋ค์ด ์ ํํ ์ผ์นํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค.
- ๋๋ถ๋ถ PK<->FK ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ๊ทธ๋ฌ๋ ๋ฐ๋์ PK<->FK ๊ด๊ณ๋ก๋ง EQUI JOIN์ด ์ฑ๋ฆฝํ๋ ๊ฒ์ ์๋๋ค.
- ์ด ๊ธฐ๋ฅ์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์์ ํฐ ์ฅ์ ์ด๋ค.
- JOIN์ ์กฐ๊ฑด์ WHERE(ON) ์ ์ ๊ธฐ์ ํ๊ฒ ๋๋๋ฐ โ=โ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ํํํ๋ค.
NONE-EQUI JOIN ์ด๋
- table์ PK,FK๊ฐ ์๋ ์ผ๋ฐ column์ join ์กฐ๊ฑด์ผ๋ก ์ง์
- ๋ ํ ์ด๋ธ ๊ฐ์ ์นผ๋ผ ๊ฐ๋ค์ด ์๋ก ์ ํํ๊ฒ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ ๋๋ค.
-
โ=โ ์ฐ์ฐ์๊ฐ ์๋ โbetween, >, >=, <, <= ๋ฑโ ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ JOIN์ ์ํํ๋ค.
์๋ฅผ ๋ค๋ฉด, ์๊ธ์ ๋ฐ๋ผ ๋ฑ๊ธ์ ๋๋ ๋ ์ฌ์ฉํ๋ค.
select e.employee_id, e.salary, s.grade
from employees e join salgrades s
where e.salary between s.losal and s.hisal;
--> salgrades ํ
์ด๋ธ์ losal, hisal ๋ฒ์ ๊ฐ์ ๋ฑ๊ธ์ด ๋๋์ด์ ธ ์๋ค.
DATABASE JOIN ๋ง๋ฌด๋ฆฌ
DB์ ๊ฝ์ธ JOIN์ ๋ฐฐ์๋ณด์๋ค.
SQL๋ฌธ์ ์์ฑํ ๋ ์์๋๋ก ์๊ฐํ๋ฉฐ ์์ฑํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ตญ์ด ! ๋ฅผ ์ํด์ผํ๋ค.. ใ
ใ
ํ
์ด๋ธ์ ๊ตฌ์กฐ๋ ์ ์์์ผํ๊ณ .. ๊ทธ๋์ผ JOIN๋ฌธ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.
DB table์ ์ง์ ๊ตฌ์ํ๊ณ ๋ง๋ค๊ณ JAVA๋ ์ฐ๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ค์ ๋ค๋ค๋ด์ผ ๊ทธ ๋์์ผ DB๋ฅผ ํ ์ค ์๋ค .. ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
๋นจ๋ฆฌ ํด๋ณด๊ณ ์ถ๋ค !!
JOIN๋ฌธ์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ ์ค ํ๋๋๊น ๊ผญ !! ์ ์์๋๊ณ ๋ง์ด SQL๋ฌธ์ ์์ฑํด๋ด์ผ ํ๋ค !!
์๋ธ์ฟผ๋ฆฌ ์ค์ ๋ฌด์์ ์จ์ผ๋๋ ํ๋ฉด MYSQL 5.5๊น์ง๋ ์ฌ๋งํ๋ฉด JOIN์ผ๋ก ํ๋ผ๊ณ ํ์์ง๋ง 5.6๋ถํฐ SUBQUERY๊ฐ ๋ํญ ์ต์ ํ ๋๋ฉด์ ์๊ด์ด ํฌ๊ฒ ์์ด์ก๋ค. ๋น๊ตํ ๊ฒ์ ๋์ผ๋ก ๋ณด๊ณ ์ถ์ผ๋ฉด https://jojoldu.tistory.com/520 ์ด ๋ธ๋ก๊ทธ๋ฅผ ํ ๋ฒ ์ฐธ๊ณ ํด๋ ์ข์ ๊ฒ ๊ฐ๋ค. ์์ฃผ ์น์ ํ๊ฒ ๋ค ๋น๊ตํด๋์๋ค.
๐ ์ฐธ์กฐ
https://yongku.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4DB-JOININNER-JOIN-LEFT-JOIN-RIGHT-JOIN-OUTER-JOIN-%EC%A0%95%EB%A6%AC
https://devfunny.tistory.com/316