์ด๋ฒ ํฌ์คํธ์์๋ Join์ ๋ํด ๋ค๋ฃฌ๋ค. Join์ ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์์ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ์ข ํฉํด ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ์ถ๋ ฅํ๋ ํค์๋๋ค. ์ ๋ณด๋ฅผ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋ถ๋ฆฌํด ๋ณด๊ดํ๋ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDBMS)์ ๋ ํ ์ด๋ธ ์ด์์ ์ ์ ํน์ ์ฐจ์ด์ ์์ ์ ์๋ฏธํ ์ธ์ฌ์ดํธ๋ฅผ ๋์ถํด๋ด๋ ์งํฉ์ ๋๋ ์ผ ๋ ์ ์๋ ์ฌ์ด๋ผ ํ๊ฒ ๋ค.
Join์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ํ ์ด๋ธ์ ๊ฐ๋ค ๋๊ณ ๊ธฐ์ค์ ๊ณผ ์ถ๋ ฅ ๋ฒ์๋ฅผ ์ด๋ป๊ฒ ๋๋์ ๋ฐ๋ผ ๋ค์ํ๊ฒ ์ธ๋ถํ๋์ด ์๊ณ ์ด๋ ์งํฉ์ ๊ฐ๋ ๊ณผ ๊ฑฐ์ ์ ์ฌํ๋ค. ๋ค๋ง ๊ต์งํฉ, ์ฐจ์งํฉ ๋ฑ ์ผ๋ถ ์งํฉ ๊ตฌํ ๊ธฐ๋ฅ์ mySQL์์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, exists ๊ตฌ๋ฌธ์ผ๋ก ์ง์ ๋ง๋ค์ด ๊ตฌํํด์ผ ํ๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ ์์์ ์ธ๊ธํ ๋ฌธ๋ฒ๋ค์ ์๋ ์์๋ก ๋ฐ์ดํฐ๋ฅผ ํตํด ๋์จํ๊ฒ ํบ์๋ณผ ๊ฒ์ด๋ค.
1) Inner Join
2) (Left/ Right) Outer Join
3) intersect/ minus
์ถ๊ฐ๋ก, ๋ฐ์ดํฐ๋ ๊ธ์ผ์ ๊ธฐ์ค 29cm์ ์ค์๊ฐ ๋ฒ ์คํธ๋ฅผ ํฌ๋กค๋งํ ๋ค, ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ต๋ํ ๊ตฌํํ ์ ์๋ ํ๊ฒฝ์ผ๋ก ๊ฐ๊ณตํด ์ฌ๋ ธ๋ค. (ํน์ ๊ถ๊ธํ์ ๋ถ์ด ์์ผ์ค๊น ํด์ ๋ง๋ถ์ด๋ฉด ํฌ๋กค๋ง์๋ listly, ํฌ๋กค๋ง ํ์ผ์ sql์ ๊ฐ๊ณต์๋ tableconvert.com๋ฅผ ์ฌ์ฉํ๋ค.) ์ฌ์ฉ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค.
select * from lrank; *์ํ์ฝ๋, ์ ํ์ ์ ์๊ฐ, ๋งค์ถ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค.
select * from linfo; *์นดํ
๊ณ ๋ฆฌ, ๋ธ๋๋, ์ํ๋ช
, ์ข์์ ์, ์ํํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๊ณ ์๋ค.
(์ํ์ฝ๋์ ์์๋ ๋ถ์์ ์ํด ๋ด๊ฐ ์์๋ก ๋ถ์ฌํ ๊ฐ์ด๋ค.)
1) Inner Join
Inner Join์ ๊ธฐ์ค ํ ์ด๋ธ์ ๋ํ ๊ต์งํฉ ๊ฐ๋ ์ด๋ค. (์๋ฐฉ ๊ต์งํฉ์ ์๋๋ค. ํด๋น ๊ฐ๋ ๊ด๋ จํด์๋ 3) intersect ํํธ๋ฅผ ๋ณด๋ฉด ๋๋ค.) on์ ์ง์ ํด ์ค ์ค์ฌ์ด ๋๋ ์ปฌ๋ผ(Primary Key, PK: ๊ธฐ๋ณธํค) ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ์ ๋ณด์ฌ ์ค๋ค. ๊ฐ์ฅ ์ต์๊ฐ์ผ๋ก Inner Join์ ์ ์ฉํด ๋ณธ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ๋์ค๊ณ ์ถ๋ ฅ๊ฐ์ ์๋์ ๊ฐ๋ค.
select * from linfo li
inner join lrank lr on li.์ํ์ฝ๋ = lr.์ํ์ฝ๋;
๋ฐ์ดํฐ๊ฐ ๋ง์ด ์ค์๋ค. ๋ ํ ์ด๋ธ์ ๋ณผ๋ฅจ ์ฐจ์ด ๋๋ฌธ์ด๋ค. linfo๋ ์ ์ฒด ๋ฑ๋ก ์ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ ๋ณผ๋ฅจ์ด ํฌ์ง๋ง lrank๋ ๊ฐ์ค ๋งค์ถ ํ ์์ค๋ง ๋ฝ์ ๊ฒ์ด๋ ๊ทธ๋ ๋ค. ์ด๋ ๊ฒ ๋ ํ ์ด๋ธ์ Inner Join ๋ฐฉ์์ผ๋ก ์ ์ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ง์ด๋ฃ์ง ๋ชป ํ null ๊ฐ์ด ๋น ์ง ์ํ๋ก ๋์จ๋ค. ์ฌ๊ธฐ์ ์ ๋ณด๊ฐ์ ์ข ์ค์ฌ ์ค๋ค๋ฉด ์ง๊ด์ ์ธ ํ๊ฐ ๋ ์ ์๊ฒ ๋ค.
select lr.์์, lr.์ํ์ฝ๋, li.์นดํ
๊ณ ๋ฆฌ, li.๋ธ๋๋๋ช
, li.์ํ๋ช
from linfo li
inner join lrank lr on li.์ํ์ฝ๋ = lr.์ํ์ฝ๋
order by lr.์์;
์ด๋ ๊ฒ ์ก์ ์ฃผ๋ฉด ๋ค์ฃฝ๋ฐ์ฃฝ์ด๋ ์์๊ฐ ์ผ๋ ฌ๋ก ์ ๋ ฌ๋๊ณ ์ํ์ฝ๋, ์นดํ ๊ณ ๋ฆฌ, ๋ธ๋๋๋ช , ์ํ๋ช ๊น์ง ์ง๊ด์ ์ผ๋ก ๋ณด์ธ๋ค.
๋ Inner Join์ (mySQL์์) ๊ธฐ๋ณธ ์กฐ์ธ์ด๊ธฐ ๋๋ฌธ์ from์ ์ถ๊ฐ ํ ์ด๋ธ์ ๋ฃ์ด์ฃผ๊ณ where ์ ์ ์กฐ๊ฑด์ ์ถ๊ฐํด์ฃผ๋ ํ์์ผ๋ก๋ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค. ๋ค์๊ณผ ๊ฐ์ด.
select lr.์์, lr.์ํ์ฝ๋, li.๋ธ๋๋๋ช
, li.์ํ๋ช
, li.์ข์์, li.์ํํ
from linfo li, lrank lr
where li.์ํ์ฝ๋ = lr.์ํ์ฝ๋
order by lr.์์;
์ด๊ฒ๋ ์์ ๋์ผํ๊ฒ ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์ ๋ ์ค ํธํ ์ชฝ์ ์ทจ์ฌ์ ํํด์ ์ฐ๋ฉด ๋๊ฒ ๋ค. ๋, ํด๋น ๋ฐฉ์์ ์กฐ๊ฑด์ ์ฌ๋ฌ ๊ฐ ๊ฑธ์ด์ค ์ ์๋ค. ํด๋น ๋ฐ์ดํฐ ์ค ์ํํ์ด ์ ์ ๊ฒ์ ์ ์ํ์ธ๋ฐ ๋งค์ถ์ด ์ ๋์ค๋ ๊ฒ์ด๋ ํ๋ก๋ชจ์ ๋ฑ์ผ๋ก ๋ฐ์ด๋ณผ ํ์๊ฐ ์์ ๊ฒ์ด๋ค. ์ด๋ด ๋๋,
select lr.์์, lr.์ํ์ฝ๋, li.๋ธ๋๋๋ช
, li.์ํ๋ช
, li.์ข์์, li.์ํํ
from linfo li, lrank lr
where li.์ํ์ฝ๋ = lr.์ํ์ฝ๋ and li.์ํํ < 10
order by lr.์์;
ํด๋น ๋ฐฉ์์ผ๋ก ์ํํ์ด ์ ์ ๊ฑธ ๊ฑธ๋ฌ์ ์ ์๋ฏธํ ํ๋ฅผ ๋ง๋ค์ด๋ ์ข๊ฒ ๋ค.
2) (Left/ Right) Outer Join
Outer Join์๋ ์ธ ๊ฐ์ง๊ฐ ์๋ค. ๊ฐ์ ๊ธฐ์ค ํ ์ด๋ธ์ ์ด๋๋ก ์ก๋๋์ ๋ฐ๋ผ ๊ฐ๊ฐ Left/ Right/ Full Outer Join์ผ๋ก ๋๋๋ค. ์ด ์ค ์ฑ๋ฅ ์ ๊ฑฐ์ ์ธ ์ผ์ด ์๋ Full Outer Join์ ์ ํ๊ณ ์ฌ๊ธฐ์๋ Left์ Right Join๋ง ๋ค๋ฃฌ๋ค. ๋์ ์ฑ๋ฅ ์ฐจ์ด ์์ด ์์ ํ ๋์ผํด์, ๋์ผํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ ์ด์์ด ์ฟผ๋ฆฌ ์์ ํ ๊ฒฝ์ฐ์๋ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ์ด๋ ํ ์ชฝ์ผ๋ก ํต์ผํ๊ธธ ๊ถํ๋ค๊ณ ํ๋ค. ๊ฐ๋ ์ฑ์ด ์ฌํ ์ ์ข๋ค๊ณ ......
Outer Join์ ๊ธฐ์ค ํ ์ด๋ธ์ ๋๋จธ์ง ํ ํ ์ด๋ธ์ด ํฉ์ณ์ง๋ ํํ๋ค. ๋ง์ฝ ๊ธฐ์ค ํ ์ด๋ธ์ ์กด์ฌํ์ง ์๋ ๊ฐ์ด๋ผ๋ฉด ํฉ์ณ์ง๋ ํ ์ด๋ธ์๋ ๊ทธ ๊ฐ์ ์ง์์ง๋ค. ์จ์ ํ ๊ธฐ์ค ํ ์ด๋ธ์ ๋๋จธ์ง ํ ํ ์ด๋ธ์ ๊ต์งํฉ๊น์ง๋ง ์ด์๋จ๋ ๊ฒ์ด๋ค.
select lr.์์, li.์ํ๋ช
, lr.์ ์๊ฐ from linfo li
right outer join lrank lr on li.์ํ์ฝ๋ = lr.์ํ์ฝ๋;
select lr.์์, li.์ํ๋ช
, lr.์ ์๊ฐ from linfo li
left outer join lrank lr on li.์ํ์ฝ๋ = lr.์ํ์ฝ๋;
์ฌ๊ธฐ์ ์ง๋ฌธ, ์ด ๋ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ์ ์ฐจ์ด๊ฐ ์์๊น ์์๊น? ๋ ์ฟผ๋ฆฌ๋ right์ left๋ง ๋นผ๊ณ ๋ ๋ค ๋์ผํ๋ค.
์ฐจ์ด๊ฐ ๋ณ๋ก ์์ ๊ฒ ๊ฐ์์ง๋ง ๋ณด๋ค์ํผ ์ฐจ์ด๊ฐ ํฌ๋ค. ๋ Join ๊ฐ์ ๊ธฐ์ค ํ ์ด๋ธ ์ค์ ์ด ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์๊ธฐ๋ ํ์์ด๋ค. ์์์ ์ธ๊ธํ ๋ฐ ์๋ฏ์ด, linfo๋ ์ ์ฒด ์ํ์ ๋ณด ํ ์ด๋ธ์ด๋ค. lrank๋ ๊ทธ ์ค ๋งค์ถ ์์๊ถ ์ํ๋ง ๋ญํน์ ์ฌ๋ฆฌ๋ฉด์ ์ง๊ณ๋ ๋ฐ์ดํฐ์ด๋ค. ๋ฐ์ดํฐ์ ์์ฒด ํฌ๊ธฐ๋ ๋ญ๊ฐ ๋ ํด๊น? ๋น์ฐํ linfo์ด๋ค. linfo๊ฐ lrank๋ณด๋ค ๋ฐ์ดํฐ์ ๋ณผ๋ฅจ์ด ํจ์ฌ ํฌ๋ค. ์ํ๋ฑ๋ก์ด ๋์ง ์์ ์ํ์ด ๋ญํน์ ์ค๋ฅผ ๋ฆฌ ์์ผ๋ linfo๊ฐ lrank๋ฅผ ์์ ํฌํจํ๋ค๊ณ ๋งํด๋ ์ข๊ฒ ๋ค.
Outer Join์ ๊ธฐ์ค ํ ์ด๋ธ์ ๋๋จธ์ง ํ ํ ์ด๋ธ์ด ํฉ์ณ์ง๋ ํํ๋ผ๊ณ ํ๋ค. lrank์ Left Join์ ํ๋ค๋ฉด ๊ธฐ์ค ํ ์ด๋ธ์ lrank๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด๊ณผ ๊ฐ์ด ์ถ๋ ฅ๋์ง๋ง, lrank์ Right Join์ ํ๋ค๋ฉด ๊ธฐ์ค ํ ์ด๋ธ์ linfo๊ฐ ๋๊ธฐ ๋๋ฌธ์ lrank์์ ๊ฐ์ง๊ณ ์์ง ์์ ๋๋จธ์ง ์ํ๋ค๊น์ง ๊ฐ์ด ๋ฌ๋ค. Outer Join ์์๋ ์ด๋ค ๊ฑธ ์จ๋ ์๊ด ์์ง๋ง ๊ธฐ์ค ํ ์ด๋ธ์ด ์ด๋์ง๋ฅผ ๋ช ํํ ํ๊ณ ์์ ํด์ผ ํ๋ค.
์ถ๊ฐ๋ก ๋ง๋ถ์ด๋ฉด, Outer Join์ผ๋ก Inner Join์ ๊ตฌํํ ์ ์๋ค.
select * from lrank lr
left outer join linfo li on lr.์ํ์ฝ๋ = li.์ํ์ฝ๋
where li.์ํ์ฝ๋ is not null;
on๊ตฌ ๋ค์ where์ ์ ์ฃผ๊ณ is not null๋ก null๊ฐ์ ์ ๊ฑฐํด ์ฃผ๋ฉด ๋๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋๋ ๊ทธ๋ฅ Inner Join์ ๊ฑฐ๋ ๊ฒ ๋น ๋ฅด๊ณ ๊น๋ํ๊ฒ ๋ค.
3) intersect/ minus
์์์ Inner์ Outer Join์ ๋ค๋ค๋ค. ์ด์ฏค ๋๋ฉด ๊ถ๊ธํ๋ค. ์๋, Join์ด ๊ทธ๊ฒ ๋์ด๋. ์ง์ฌ์ด์ผ? ์งํฉ ์ค๋ช ํ๋ ค๋ฉด ํ์ฐธ ๋จ์์์. ๊ทธ๋. ๋๋ ์ค๋ช ํ๊ณ ์ถ๋ค. ํ์ง๋ง ์์ฝ๊ฒ๋ mySQL์ ๊ฒฝ์ฐ์๋ ๊ต์งํฉ๊ณผ ์ฐจ์งํฉ์ ํด๋นํ๋ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ๋ณ๋๋ก ๋ง๋ค์ด ์จ์ผ ํ๋ค. ์ด๋ ๊ฒ.
intersect (๊ต์งํฉ) ๊ตฌ๋ฌธ
select * from linfo a
where exists (select 1 from lrank b where a.์ํ์ฝ๋ = b.์ํ์ฝ๋);
์ด๋ select ๋ค์ 1์ ๋จ์ํ exists(์๋์ง ์๋์ง๋ง ์ฐพ์ผ๋ฉด ๋๋ ํจ์)๊ฐ ์์ ์๊ธฐ ๋๋ฌธ์ ๋น ๋ฅธ ์ถ๋ ฅ์ ์ํด ์จ์คฌ๋ค. select 1 from ํ์์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์น๋ฉด ์ค์ ๊ฐ์ ์ถ๋ ฅํ์ง ์๊ณ ๊ฐ์ด ์๋ ์๋๋ง ๊ฒ์ฆํ๊ณ ์์ผ๋ฉด 1 ์ณ ์ค๋ค. ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๋ค.
minus ๊ตฌ๋ฌธ
select * from linfo a
where not exists (select 1 from lrank b where a.์ํ์ฝ๋ = b.์ํ์ฝ๋);
๊ต์งํฉ์ ๋ฐ๋๋ฅผ ์๊ฐํด ๋ณด์. ์ฐจ์งํฉ์ด๋ค. ๋ง์ด ๋ฐ๊ฟ ํ์ ์์ด exists ์์ not ๋ถ์ฌ์ ๊ต์งํฉ์ด ์๋ ๊ฐ๋ง ๋ถ๋ฌ์ ์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ๊น์ง, ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ๋ถ๋ฌ์ ํ ๋์ ๋ณด๊ฒ ํด ์ฃผ๋ Join์ ๋ํด ์์๋ดค๋ค. ์ฐ๋ฉด์ ๋๋ ๊ฒ, ์ ์ด์ ๋ญ ๋ณด์ฌ์ค ์ ์๋ ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ์ฃฝ์ด ๋๋ ๋ฐฅ์ด ๋๋ ํ ๊ฑฐ ๊ฐ๋ค. ๋ค์ ํฌ์คํ ์์๋ ์๋ธ์ฟผ๋ฆฌ์ ๋ํด ๋ค๋ค๋ณผ ๊ฑด๋ฐ, ์์ ์ํ ๋ฐ์ดํฐ ๊ฐ์ ธ์์ ์ ์ค๋ช ํด ๋ณด๋๋ก ํ๊ฒ ๋ค.
์ฐธ๊ณ
'TOOLS > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SQL ๋ฌธ์ ํ์ด: ๊ฐ๊ฒฉ๋๋ณ ๊ทธ๋ฃน ์ฝ๊ฒ ๋ง๋ค๊ธฐ, FLOOR/ TRUNCATE (0) | 2024.02.17 |
---|---|
SQL: ์ NULL์ =์ด ์๋๋ผ is๋ฅผ ์ธ๊น (1) | 2024.02.11 |
SQL: ์กฐ๊ฑด ์ ์ฉํด ์ ์๋ฏธํ ๊ธฐ์ค์ ๋ฝ๊ธฐ, CASE WHEN (2) | 2024.02.08 |
SQL: ์ค๋ณต ๊ฐ๋ง ๋ฆฌ์คํ ํ๋ ๋ฐฉ๋ฒ, HAVING COUNT() (0) | 2024.02.06 |
SQL: ํ์ ๋ฌธ๋ฒ ๋ชจ์ ์ํธ (1) | 2024.01.30 |