์นดํ ๊ณ ๋ฆฌ ์ด๋ณด์๋ ์ค๋นํ๋ SQL ์ฝ๋ฉ ํ ์คํธ์ ๊ฐ์๋ฉด ํด๋น ์๋ฆฌ์ฆ๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค.
- ํด๋น ์๋ฆฌ์ฆ๋ฅผ ์์ํ๋ฉฐ
- ๊ธฐ์ด ์ด๋ก ๋ค์ง๊ธฐ
- ์ด๋ณด์๋ ์ค๋นํ๋ SQL ์ฝ๋ฉ ํ ์คํธ ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ ๋ถ์ -์ด์ ๋ญ ํด์ผ ํ๋์?
๋ชฉ์ฐจ
- JOIN
- ์กฐ์ธ์ด๋?
- ๊ด๊ณ๋?
- 1:N ๊ด๊ณ
- INNER JOIN
- ์กฐ์ธ์์ ์กฐ๊ฑด ์ถ๊ฐํ๊ธฐ
- ์กฐ์ธ์์ ์ ๋ ฌํ๊ธฐ
- OUTER JOIN
- LEFT JOIN
- RIGHT JOIN
์กฐ์ธ
JOIN์ SQL ์ฝ๋ฉ ํ ์คํธ์์ ์ถ์ ์์ 1์์๋ก ๊ฐ์ฅ ๊ฐ์ฅ ๊ฐ์ฅ ์ค์ํ๋ฉด์ ์ด๋ ค์ด ๋ถ๋ถ์ด๋ค.
์ฌ์ค์ ์ง๊ธ๊น์ง ๋ฐฐ์ ๋ ๊ฒ๋ค์ด ์ด๋ฒ JOIN์ ์ด์ฉํ๊ธฐ ์ํด์ ๋ฐฐ์ ๋ค๊ณ (๋ฌผ๋ก ์ค์ ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ์ํํธ์จ์ด ์์ง๋์ด๋ง ์
์ฅ์์ ๊ทธ ๋์ ์๊ด ๊ด๊ณ๋ ํฌ๊ฒ ์์ง๋ง) ํด๋ ๊ณผ์ธ์ด ์๋๋ค.
์กฐ์ธ์ด๋?
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ํ๋์ ํ
์ด๋ธ ์ด๋ฅผํ
๋ฉด usertb1
์ด๋ buytb1
์์๋ง ์์
์ ์ํํ์๋ค.
ํ์ง๋ง ์ง๊ธ ๋ฐฐ์ธ JOIN์ ์ฌ๋ฌ ๊ฐ์ ํ
์ด๋ธ์์ ์์
์ ์ํํ ์ ์๊ฒ ํ๋ค.
์ฆ, ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์๋ก ๋ฌถ์ด์ ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ๋ง๋ค์ด๋ด๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ์กฐ์ธ์ ์ดํดํ๊ธฐ ์ํด์ ์์์ผํ ๊ฒ์ด ์๋ค.
๋ฐ๋ก ๊ด๊ณ์ด๋ค.
๊ด๊ณ๋?
๊ด๊ณ๋ RDBMS ์๋ฅผ ๋ค์ด MySQL์ด๋ MsSQL์ด๋ Oracle๊ณผ ๊ฐ์ด ๊ฑฐ์ ๋๋ถ๋ถ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ปํ๋ค.
์ด๋ฅผ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ผ๊ณ ํ๋๋ฐ, ์ด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ๋ช
์ด๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ๋งบ๊ณ ์๋๋ฐ, ๊ฐ์ฅ ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ด๊ณ๊ฐ ์๋ค.
- 1:1
- 1:N ์ฌ์ฉ์ ํ ๋ช ์ ์ฌ๋ฌ ๊ฐ์ ์ํ์ ๊ตฌ๋งคํ ์ ์๋ค.
- N:M
์ด ๋ชจ๋ ๊ด๊ณ๋ฅผ ๋ค๋ฃจ์ง๋ ์์ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ๋ 1:N ๊ด๊ณ๋ง ๋ค๋ฃฐ ๊ฒ์ด๋ค.
๋ง์ฝ ๊ด๊ณ์ ๋ํด์ ๋ ๊น๊ฒ ์๊ณ ์ถ์ ์ฌ๋์ ์์ง์์ ์ฝ์ง ๋ธ๋ก๊ทธ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ด๊ณ!๋ฅผ ์์๋ณด์์์ ํ์ธํ ์ ์๋ค.
๋ด๊ฐ ๊ณต๋ถํ ๋ ๋์์ ์ ๋ง ๋ง์ด ๋ฐ์ ์์ฃผ ์ข์ ๋ธ๋ก๊ทธ์ด๋ค.
1:N ๊ด๊ณ
JOIN์ 1:N ๊ด๊ณ๋ฅผ ๋ํ๋ผ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฟผ๋ฆฌ๋ฌธ๊น์ง ๊ฑฐ์ ๋ค ์๋ค.
์ด๋ก ์์ ์กฐ๊ธ๋ง ์ฐธ์๋ณด์.
์ฐ๋ฆฌ๊ฐ ์ํ๋ก ๊ฐ๊ณ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ณ์ ๋งํ๋ ๊ฒ์ ํ ๋ช
์ ์ฌ์ฉ์๋ ์ฌ๋ฌ ์ํ์ ๊ตฌ๋งคํ ์ ์๋ค.
์ด๋ค.
์ด ์ฆ๊ฑฐ๊ฐ ๋ฐ๋ก buytb1์์ usertb1์ userid๋ฅผ ์ธ๋ํค๋ก ๊ฐ๊ณ ์๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ธ๋ํค์ ๋ํด์ ์์ง ๋ชปํ๋ค๋ฉด ์ธ๋ํค ์ดํดํ๊ธฐ-๋น์ ๊ณต์๋ฅผ ์ํ SQL์์ ํ์ธํ ์ ์๋ค.
์ด 1:N ๊ด๊ณ์์ ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฒ์ usertb1์ userid๋ฅผ ๊ฐ์ง๊ณ ํด๋น user๊ฐ ๊ตฌ์ ํ ๋ชจ๋ ์ ๋ณด๋ฅผ buytb1์์ ๊ฐ์ ธ์ ์ถ๋ ฅํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๊น ์์์ ๋ญ๋ผํ๋๊ฐ? JOIN์ ๋ ๊ฐ ์ด์์ ํ ์ด๋ธ์ ์๋ก ๋ฌถ์ด์ ํ๋์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ๋ง๋ค์ด๋ด๋ ๊ฒ์ด๋ค. ๋ผ๊ณ ํ๋ค.
์ด์ ์ JOIN์ ์จ์ผํ๋์ง ๋ ์ด๋์ ์จ์ผํ๋์ง ์๊ฒ ๋์๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ์จ์ผ ํ๋์ง๋ฅผ ์์๋ณด์.
INNER JOIN
INNER JOIN์ ์กฐ์ธ ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์กฐ์ธ์ด๋ค.
์ค์ ๋ก ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น?
์ค์ ๋ก JOIN์ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น?
์ฐ๋ฆฌ๊ฐ ์ผํ๋ชฐ ์ฌ์ดํธ๋ฅผ ์ด์ํ๋ค๊ณ ์๊ฐํด๋ณด์.
๊ทธ๋ฆฌ๊ณ usertb1์๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๊ณ buytb1์๋ ๊ตฌ๋งค ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ค๊ณ ํด๋ณด์.
๋ง์ฝ ์ํ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ฑฐ๋, usertb1๊ณผ buytb1์ ๋ํด์ ๋ชจ๋ฅธ๋ค๋ฉด, ์ํ ๋ฐ์ดํฐ ๋ฐ ์ฟผ๋ฆฌ๋ฌธ์ ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค!
์ฐ๋ฆฌ๋ ์ฌ์ฉ์๋ค์ด ์ฃผ๋ฌธํ ์ฃผ๋ฌธ ๋ชฉ๋ก์ ํ ๋๋ก ๋ฐฐ์ก์ ํด์ฃผ๋ ค ํ๋ค.
์ฐ์ ๋๊ฐ ๋ฌด์จ ์ํ์ ๊ตฌ๋งคํ๋์ง ํ์ธํ๊ธฐ ์ํด์ ์ฌ์ฉ์๊ฐ ๊ตฌ๋งคํ ๋ชจ๋ ๊ฒ์ ์ถ๋ ฅํด๋ณด์.
SELECT *
FROM buytb1;
์! ์ด์ ๋ฐฐ์ก์ ํด์ผ ํ๋ค.
๋ฐฐ์ก์ ํ๊ธด ํด์ผ๋๋๋ฐ ์ฐ๋ฆฌ๋ ์ฌ์ฉ์์ ๋ํ ์ ๋ณด๋ผ๊ณค userid๋ฐ์ ๋ชจ๋ฅธ๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ํด์ผํ ๊น? ๋ฐ๋ก JOIN์ ์ด ๋ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
INNER JOIN์ INNER JOIN ์กฐ๊ฑด์ ํด๋นํ๋ ๋ชจ๋ ์นผ๋ผ์ ๋ถ์ฌ ๊ฒฐ๊ณผ ํ ์ด๋ธ๋ก ์ถ๋ ฅ์์ผ ์ค๋ค.
INNER JOIN์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ
SELECT ์นผ๋ผ
FROM ํ
์ด๋ธ 1 (๊ธฐ์ค์ด ๋๋ ํ
์ด๋ธ)
INNER JOIN ํ
์ด๋ธ 2
ON ์กฐ์ธ๋ ์กฐ๊ฑด
[WHERE ๊ฒ์ ์กฐ๊ฑด]
[GROUP BY]
[HAVING]
[ORDER BY]
์ฌ๊ธฐ์ ์กฐ์ธ๋ ์กฐ๊ฑด์ buytb1์ ์๋ userid์ usertb1์ ์๋ userid๊ฐ ๊ฐ์ ๊ฒ๋ค๋ง JOIN ํ๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก JOIN์ ํ๊ณ ์์ผ๋ ON์ ๋ํ ์กฐ๊ฑด์ buytb1.userid = usertb1.userid
์ด๋ค.
SELECT *
FROM buytb1
INNER JOIN usertb1
ON buytb1.userid = usertb1.userid;
๊ทธ๋ผ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํ
์ด๋ธ์์ ON
์ ์ง์ ๋ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์นผ๋ฝ๋ค๋ง ๋ฌถ์ด์ ์ถ๋ ฅํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฐ๋ฆฌ๋ ๋ชจ๋ ์นผ๋ผ์ ์ถ๋ ฅํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ํ๋ userid, name, price
๋ง ์ถ๋ ฅํด๋ณด๋๋ก ํ์.
SELECT userid, name, price
FROM buytb1
INNER JOIN usertb1
ON buytb1.userid = usertb1.userid;
๊ทธ๋ผ Column์ userid๊ฐ ์ ๋งค (ambigous) ํ๋ค๊ณ ๋์จ๋ค.
์ด์ ๊ฐ ๋ญ๊น?
๋ฐ๋ก ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ํ ์ด๋ธ์ ์กด์ฌํ๋ userid ์ค์ ์ด๋ค userid๋ฅผ ์ถ๋ ฅํด์ผํ ์ง ๋ชฐ๋ผ์์ด๋ค.
์ด๋ ๊ฒ JOIN์ ์ฌ์ฉํ ๋ ์ง์ํ๊ณ ์ ํ๋ ๋์๊ณผ ๋ชฉํ๋ฅผ ์ ํํ ํด์ผํ๋ค.
๊ทธ๋์ ์์ ์ค๋ฅ๋ฅผ ๊ณ ์น๋ ค๋ฉด ์ด๋ค ํ
์ด๋ธ์ ์๋ ์นผ๋ผ์ด ํ์ํ์ง usertb1.userid
์ ๊ฐ์ด ์ง์ ํ
์ด๋ธ์ ๋ช
์ํด์ฃผ๋ฉด ๋๋ค.
ํ์ง๋ง ํ
์ด๋ธ ์ด๋ฆ์ด ๋ง์ฝ customer_service_roll_payment
๋ผ๋ ํ
์ด๋ธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ทธ๋ฆฌ๊ณ ๊ทธ ํ
์ด๋ธ์์ last_payment_date
๋ผ๋ ์นผ๋ผ์ ์ง์ ํ ๋๋ customer_service_roll_payment.last_payment_date
๋ผ๊ณ ์ง์ ํด์ผํ๋ค.
๊ทธ๋ผ ๋๋ฌด ๋ณด๊ธฐ ํ๋๋ ์๋์ ์ฟผ๋ฆฌ๋ฌธ๊ณผ ๊ฐ์ด ๋ณ๋ช ์ ์ด์ฉํด์ ์งง๊ฒ ์ง์ ํ ์๋ ์๋ค.
SELECT B.userid, U.name, B.price
FROM buytb1 B
INNER JOIN usertb1 U
ON B.userid = U.userid;
JOIN์์ WHERE๋ก ์กฐ๊ฑด ๊ฑธ๊ธฐ
JOIN๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์กฐ๊ฑด์ ์ง์ ํ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง์ฝ ์์ ์ง์ํ ์ฟผ๋ฆฌ๋ฌธ์์ ์ ๋ ฌ๋ก ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด ์ญ์ ORDER BY
๋ฅผ ์ด์ฉํ ์ ์๋ค.
๋ํ ์ด๋ฆ์ด ์ด์น๊ธฐ์ธ ์ฌ์ฉ์๋ง ์ถ๋ ฅํ๊ณ ์ถ๋ค๋ฉด WHERE
์ ์ด์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
SELECT B.userid, U.name, B.price
FROM buytb1 B
INNER JOIN usertb1 U
ON B.userid = U.userid
WHERE U.name = '์ด์น๊ธฐ'
ORDER BY B.price;
OUTER JOIN
์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ์์์ ๋ฐฐ์ด JOIN ์ฆ INNER JOIN ๊ฐ์ ๊ฒฝ์ฐ๋ ๊ต์งํฉ์ ์ธ ์ฑ๊ฒฉ์ ๋๊ณ ์๋ค.
ํ์ง๋ง ์ง๊ธ ๋ฐฐ์ธ LEFT JOIN์ ํฉ์งํฉ์ ์ธ ์ฑ๊ฒฉ์ ๋๋ค.
OUTER JOIN ์ ๊ธฐ๋ณธ์ ์ธ ์ปจ์ ์ ๊ณตํต๋ INNER JOIN ์์ญ์ ํฌํจํด ๋ค๋ฅธ ํ์ชฝ ํ ์ด๋ธ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ ์กฐ์ธ์ธ๋ฐ, ์ข ์ฝ๊ฒ ๋ง ํ์๋ฉด
ON ์กฐ๊ฑด์ ๋ง์กฑ๋์ง ์๋ ์นผ๋ผ ๊น์ง๋ ํฌํจ์์ผ์ ํ ์ด๋ธ์ JOINํ ๋ ์ฌ์ฉํ๋ค.
์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด๋ฐ OUTER JOIN์๋ ํฌ๊ฒ 3๊ฐ์ง ์ข ๋ฅ๊ฐ ์กด์ฌํ๋ค.
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
๊ธฐ๋ณธ์ ์ธ OUTER JOIN ์ฌ์ฉ ๋ฐฉ๋ฒ
OUTER JOIN๋ INNER JOIN ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ฉ๋ฒ์ ๋์ผํ๋ค.
SELECT ์นผ๋ผ
FROM ํ
์ด๋ธ 1 (๊ธฐ์ค์ด ๋๋ ํ
์ด๋ธ LEFT)
<LEFT | RIGHT | FULL> JOIN ํ
์ด๋ธ 2 (RIGHT)
ON ์กฐ์ธ๋ ์กฐ๊ฑด
[WHERE ๊ฒ์ ์กฐ๊ฑด]
[GROUP BY]
[HAVING]
[ORDER BY]
์ฌ์ค์ LEFT ์กฐ์ธ์ด๋ RIGHT ์กฐ์ธ์ ๋์ ํ ์ด๋ธ์ด ์ด๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
์ฆ,
SELECT *
FROM buytb1 B
RIGHT OUTER JOIN usertb1 U
ON B.userid = U.userid;
SELECT *
FROM usertb1 U
LEFT OUTER JOIN buytb1 B
ON B.userid = U.userid;
์ ์๋ก ๊ฐ์ JOIN์ ํ๊ณ ์๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ด๋ค ํํ์ ๋ฌธ์ ๋ก ์ถ์ ๋ ๊น?
์ ์ฒด ํ์์ ๊ตฌ๋งค ๊ธฐ๋ก์ ์ถ๋ ฅํ๋, ๊ตฌ๋งค ๊ธฐ๋ก์ด ์๋ ํ์๋ ์ถ๋ ฅํด์ผ ํ๋ค ๋ผ๋ ๋ฌธ์ ๊ฐ์ด ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋ ํ ์ด๋ธ ๊น์ง ์ถ๋ ฅํ ๋ ์ฌ์ฉ๋๋ค.
๊ทธ๋ผ ์์ ๋ฌธ์ ์ ๋ํ ๋ต์ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๊ตฌ์ฑํด๋ณด์.
SELECT *
FROM usertb1 U
LEFT OUTER JOIN buytb1 B
ON B.userid = U.userid;
๊ทธ๋ผ ๊ตฌ๋งค ์ด๋ ฅ์ด ์๋ ํ์๋ค์ price ์นผ๋ผ์ NULL๋ก ์ฒ๋ฆฌ๋์ด ์ถ๋ ฅ๋๋ค.
์นดํ ๊ณ ๋ฆฌ ์ด๋ณด์๋ ์ค๋นํ๋ SQL ์ฝ๋ฉ ํ ์คํธ์ ๊ฐ์๋ฉด ํด๋น ์๋ฆฌ์ฆ๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค.
๋๊ธ