[D+4] ์์ ๋ณด๋ค ์ฌ์ด SQL(4) - ๋ค์ํ ์ฐ์ฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์กฐํ&์ฐ์ฐํ๊ธฐ (Sub query, INNER JOIN, LEFT JOIN)
โ๏ธ STUDY INDEX
1. ์ฌ๋ฌ ๋ฒ์ ์ฐ์ฐ์ ํ ๋ฒ์ SQL๋ฌธ์ผ๋ก, ์๋ธ์ฟผ๋ฆฌ(Subquery)
2. ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฌถ์ด์ฃผ๋ JOIN (inner, left)
3. SQL ๊ตฌ์กฐ๋ฅผ ๋ณด๊ธฐ ์ฝ๊ฒ ์ฐ๋ ์ฐ์ต
1. ์ฌ๋ฌ๋ฒ์ ์ฐ์ฐ์ ํ ๋ฒ์ SQL๋ฌธ์ผ๋ก, ์๋ธ์ฟผ๋ฆฌ(Subquery)
ํ ๋ฒ์ ๋๋์ง ์๋ ์ฐ์ฐ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ ์ฉํ ๊ฒ์ด ๋ฐ๋ก ์๋ธ์ฟผ๋ฆฌ์ ๋๋ค.
์๋ธ์ฟผ๋ฆฌ๋ ๋ง ๊ทธ๋๋ก SQL ์ฟผ๋ฆฌ ๋ด์ ํฌํจ๋ ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
์ฆ, ์ฟผ๋ฆฌ์ ์ผ๋ถ๋ก ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ณต์กํ ์ฐ์ฐ, ๊ฒ์, ํํฐ๋ง ๋ฑ์ ์ฉ์ดํ๊ฒ ํ๋ ์ญํ ์ ํด์. ์ฟผ๋ฆฌ ์์ ์ฟผ๋ฆฌ๋ฅผ ( ) ๊ดํธ๋ก ๋ฌถ์ด ์ฃผ๋ ํํ๋ก ์ฌ์ฉํฉ๋๋ค.
๊ฐ๋จํ๊ฒ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ ์ ์๋์ง ์๊ฐํด๋๋ฆด๊ฒ์.
- ์ฌ๋ฌ ๋ฒ์ ์ฐ์ฐ์ ์ํํด์ผ ํ ๋
- ์กฐ๊ฑด๋ฌธ์ ์ฐ์ฐ ๋๋ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ ๋ ๋ฑ๋ฑ.
๊ฐ์์์ ๋ฐฐ์ด ์ค์ต์ ์์๋ก ๊ฐ์ ธ์๋ดค์ต๋๋ค. ์ ๊ฐ ์ด ์ฟผ๋ฆฌ๋ผ ํํ๋ ์กฐ๊ธ ๋ค๋ฅผ ์ ์์ด์.
์ฐธ๊ณ ๋ก ์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณธ ์ฟผ๋ฆฌ์์ ์กฐํํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
(์ด๋ป๊ฒ ์์๋๊ตฌ์? ์ ๊ฒฝํ๋ด์ ๋๋ค.)
-- [์ค์ต] ์๋ธ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ์ฐ์ฐ๋ฌธ : ์์์ ํ๊ท ๋จ๊ฐ๋ณ ์์๋ฃ ๊ณ์ฐํ๊ธฐ
-- 1) ํ๊ท ๋จ๊ฐ ๊ตฌํ๊ธฐ, ๋จ๊ฐ์ ๋ฐ๋ฅธ ๊ตฌ๊ฐ ๊ตฌ๋ถํ๊ธฐ - avg, group by ์ฌ์ฉ
-- 2) ๊ตฌ๊ฐ์ ๋ฐ๋ฅธ ์์๋ฃ ์ง์ ํ๊ธฐ - case ๋ฌธ ์ฌ์ฉ
-- 3) ์์์ ์ด๋ฆ, ์์๋ฃ๊ฐ ์ ์ฉ๋ ๊ฐ ๊ฒฐ๊ณผ๋ก ๋ํ๋ด๊ธฐ
select restaurant_name '์์์ ๋ช
',
avg_price * raion_of_add as '์์๋ฃ๊ฐ ์ ์ฉ๋ ๊ฐ๊ฒฉ'
FROM
(SELECT restaurant_name,
avg_price,
case when avg_price < 5000 then 0.005
when avg_price between 5000 and 19999 then 0.01
when avg_price between 20000 and 29999 then 0.02
else 0.03 end as raion_of_add
FROM
(SELECT restaurant_name ,
avg(price/quantity) as avg_price
FROM food_orders
GROUP BY 1) a )b
2. ์๋ก ๋ค๋ฅธ ํ ์ด๋ธ์ ๋ฌถ์ด์ฃผ๋ JOIN (inner join, left join)
ํ์ํ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ํ ์ด๋ธ์ ๋๋์ด ์๋ ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๋ค๋ฅธ ํ ์ด๋ธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ '๊ณตํต ์ปฌ๋ผ'์ ๊ธฐ์ค์ ๋ฌถ์ด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ์กฐ์ธ(Join) ์ ๋๋ค.
์์ Vlook up๊ณผ ์ ์ฌํ๊ฒ ๊ณตํต ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ ํ ์ด๋ธ์ ํฉ์ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํด ์ค๋๋ค!
๊ตฌ๋ถ | ์ฌ์ฉ๋ฐฉ๋ฒ | ์๋ฏธ |
left join | select ์กฐํํ ์ปฌ๋ผ from ํ ์ด๋ธ1 as a left join ํ ์ด๋ธ2 as b on a.๊ณตํต์ปฌ๋ผ๋ช = b.๊ณตํต์ปฌ๋ผ๋ช |
๊ณตํต ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ์กฐํ. ์ฆ, ํ๋์ ํ ์ด๋ธ์ ๊ฐ์ด ์์ด๋ ์กฐํ ๊ฐ๋ฅ |
inner join | select ์กฐํํ ์ปฌ๋ผ from ํ ์ด๋ธ1 as a inner join ํ ์ด๋ธ2 as b on a.๊ณตํต์ปฌ๋ผ๋ช = b.๊ณตํต์ปฌ๋ผ๋ช |
๊ณตํต ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก, ๋ ํ ์ด๋ธ์ ๋ชจ๋ ์๋ ๊ฐ๋ง ์กฐํ |
๊ฐ์์์ ์ค์ต์ผ๋ก ์งฐ๋ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ ๋ดค์ด์.
์ถ๊ฐ๋ก, ์๋ ๋ด์ฉ์ join์ ์ฌ์ฉํ ๋ ์ฐธ๊ณ ํด ์ฃผ์ธ์.
- ๊ณตํต ์ปฌ๋ผ์ ๋ฌถ์ด์ฃผ๊ธฐ ์ํ ๊ณตํต ๊ฐ์ด๊ธฐ ๋๋ฌธ์ '์ปฌ๋ผ๋ช (์ด๋ฆ)'์ ๋ฌ๋ผ๋ ๊ด์ฐฎ์์.
- join์ผ๋ก ๋ฌถ์ ํ ์ด๋ธ์์ ์ปฌ๋ผ์ ๊ฐ์ ธ์ฌ ๋๋ ํ ์ด๋ธ๋ช .์ปฌ๋ผ๋ช ์ผ๋ก ์์ฑํด์ฃผ์ ์ผ ํด์.
-- ์ฃผ๋ฌธ ๊ฐ๊ฒฉ๊ณผ ์์๋ฃ์จ์ ๊ณฑํ์ฌ ์ฃผ๋ฌธ๋ณ ์์๋ฃ์จ ๊ตฌํ๊ธฐ
-- ์กฐํ ์ปฌ๋ผ : ์ฃผ๋ฌธ๋ฒํธ, ์๋น์ด๋ฆ, ์ฃผ๋ฌธ ๊ฐ๊ฒฉ, ์์๋ฃ์จ, ์์๋ฃ (*์์๋ฃ์จ์ด ์๋ ๊ฒฝ์ฐ๋ง ์กฐํ)
-- 1) ๊ณตํต์ปฌ๋ผ์ผ๋ก ํ์ ๋ฐ์ดํฐ๊ฐ ์๋ ํ
์ด๋ธ์ ๋ฌถ๊ธฐ (*์์๋ฃ์จ์ด ์๋ ๊ฒฝ์ฐ ์ ์ธ, inner join)
-- 2) ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ๊ณ์ฐํ๊ธฐ
SELECT f.order_id as '์ฃผ๋ฌธ๋ฒํธ' ,
f. restaurant_name as '์๋น ์ด๋ฆ',
f.price as '์ฃผ๋ฌธ ๊ฐ๊ฒฉ',
p.vat as '์์๋ฃ์จ',
f.price * p.vat as '์์๋ฃ'
FROM food_orders f inner join payments p on f.order_id = p.order_id
์ค๋์ ๊ณต๋ถ๋ ์ฌ๊ธฐ๊น์ง์ ๋๋ค.
4์ผ ์ฐจ๋ถํฐ ์ฟผ๋ฆฌ ๊ธธ์ด๊ฐ ๊ธ ์ฆ๊ฐํ ๊ธฐ๋ถ์ ๋๋ค.
์์ง๊น์ง ์ ์๊ฒ ์๋ธ ์ฟผ๋ฆฌ๋ ์กฐ๊ธ ์ด๋ ต๋ค์.
์ธ์ ์ฐ๋ ๊ฒ์ด ์ ์ผ ์ ํฉํ์ง ๊ฐ์ ์ก์ง ๋ชปํ๊ฑฐ๋ ์..
์คํฐ๋ ๋ก๊ทธ๋ฅผ ์์ฑํ๋ฉด์ ๊ฐ์ ์ค์ต์ ๋ณต์ตํ๋๋ฐ๋ ์ค๋ฅ๊ฐ ๋์ ์ฌํ๋๋ค๐ฅฒ
๊ทธ๋ฆฌ๊ณ ๋งค์ผ ํ๋ก๊ทธ๋๋จธ์ค๋ฅผ ํ์ฉํด์ 2~3๊ฐ์ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋๋ฐ์.
์์ง ์ ๋ ์ฟผ๋ฆฌ๋ฅผ ์งง๊ณ ๋ช ๋ฃํ๊ฒ ์ง๊ธฐ๋ณด๋ค if ๋ฌธ์ผ๋ก ๋๋ ค๋๋ ค ๋๋ฆผํ๐ฏ ์ฒ๋ผ ์ง๋ ๊ฒฝ์ฐ๊ฐ ์์ด์,
์ํ์๋ ๋ถ๋ค์ ์ฝ๋๋ฅผ ๋ณด๊ณ '์ด๋ป๊ฒ ์ ๋ ๊ฒ ์๊ฐํ์ง?'๋ผ๋ ์ข์ ๊ฐ๊ณผ ์ด๋ฑ๊ฐ์ ๋๋ผ๊ธฐ๋ ํฉ๋๋ค.
๊ทธ๋๋ ๋ญ ์ด์ฉ๊ฒ ์ด์. ์ด์ฌํ ๋ ธ๋ ฅํด์ผ์ง..
๊ฐ๋ฐ์๋ค์ ์ฌ๊ณ ๋ฐฉ์(๋ ผ๋ฆฌ ๊ณผ์ )์ ์ ์๊ฒ๋ ํ์ฌํ ์ ์๋๋ก
๊ณต๋ถ๋์ผ๋ก ์น๋ถ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ๋๋ ์ด์ฌํ ํด์ผ๊ฒ ์ด์! ์ ์ฅ์ ์ ๋๊ธฐ๋๋๋ค ^^
ํน์ ์ ์ฒ๋ผ ๋น์ ๊ณต์์ธ๋ฐ ๋น์ทํ ๊ณ ๋ฏผ์ ๊ฐ๊ณ ๊ณ์ ๋ถ์ด ์๋ค๋ฉด, ๋๋
์ด ๊ณผ์ ์ ๊ทน๋ณตํด์ ํ์ฌ๋ ์ค๋ฌด์์ ๋ฐ์ดํฐ ๋ถ์์ ํ๊ณ ๊ณ์ ๋ถ์ด ์๋ค๋ฉด
์ด๋ป๊ฒ ๊ณต๋ถํ์ จ๋์ง ์ ์๊ฒ๋ ์๋ ค์ฃผ์ธ์ ๐๐
๋ง์ง๋ง์ ๊ฑฐ์ ํ์์ฐ์ด ๋์๋ค์. ์ํผ, ํ์ดํ ์ ๋๋ค๐