[์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ] ๐ข์์ ๋ณด๋ค ์ฌ์ด SQL - 3์ฃผ์ฐจ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ SQL โ1์ฃผ์ฐจโ ใ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ SQL โ2์ฃผ์ฐจโ ใ
[ JOIN ๋ฌธ ]
- JOIN๋ฌธ ์ด๋ ๋น๊ตํ ๋ ํ ์ด๋ธ์ ๊ณตํต๋ ์ ๋ณด(key๊ฐ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ์ ์ฐ๊ฒฐํ์ฌ ํ ํ ์ด๋ธ์ฒ๋ผ ๋ณผ ์ ์๊ฒํ๋ ๊ตฌ๋ฌธ์
- ์์ ์ VLOOKUP ํจ์์ ์ ์ฌํจ
[ JOIN๋ฌธ ์์ ]
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ๋ ํ ์ด๋ธ์ ๋ณด๋ฉด ๊ณตํต์ ์ผ๋ก user_id๋ผ๋ ํค๊ฐ์ ๊ฐ์ง ๊ฒ์ ํ์ธ ํ ์ ์์
์ด๋ด ๋ user_id๋ฅผ ๊ธฐ์ค์ผ๋ก JOIN๋ฌธ์ ํตํด ํ๊ฐ์ ํ ์ด๋ธ์ฒ๋ผ ๋ฌถ์ด์ ๋ณผ ์ ์์
# ๊ธฐ๋ณธ ๋ฌธ๋ฒ
select <select_list> from Table_A A
left join Table_B B on A.key(๊ณตํตํค) = B.key(๊ณตํตํค)
# user_id๋ฅผ ๊ธฐ์ค์ผ๋ก users ํ
์ด๋ธ๊ณผ point_users ํ
์ด๋ธ์ ํฉ์น๊ธฐ [ LEFT JOIN ]
select * from users u
left join point_users p on u.user_id = p.user_id
# user_id๋ฅผ ๊ธฐ์ค์ผ๋ก users ํ
์ด๋ธ๊ณผ point_users ํ
์ด๋ธ์ ํฉ์น๊ธฐ [ INNER JOIN ]
select * from users u
inner join point_users p on u.user_id = p.user_id
ํ์ธ์ ํด๋ณด๋ฉด LEFT JOIN๋ฌธ์ ํตํด user_id๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ์ ๋ณํฉํ ๊ฒฐ๊ณผ ํ ์ด๋ธ์ ํฉ์ณ์ก์ง๋ง,
์ด์ค ์ด๋ค ํ๋๋ NULL๊ฐ์ผ๋ก ํํ๋ ๊ฒ์ ํ์ธ ํ ์ ์์
[ LEFT JOIN๋ฌธ ]
- LEFT JOIN๋ฌธ์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ(ํ ์ด๋ธ B)์ ์ผ์นํ๋ ํ๋๊ฐ ์๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ผ์ชฝ ํ ์ด๋ธ(ํ ์ด๋ธ A)์
์๋ ๋ชจ๋ ํ๋๋ฅผ ๋ฐํ, ๋ํ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ์์ ์ผ์นํ๋ ๋ ์ฝ๋ ๋ํ ๋ฐํ
- ์ฆ ํ ์ด๋ธ A์ ํ ์ด๋ธ B์ ๋ชจ๋ ํ๋๋ฅผ ๋ฐํํ์ง๋ง, ์ผ์นํ์ง ์๋ ํ๋๋ ์ผ๋ถ NULL๊ฐ์ผ๋ก ํ์๋จ
[ INNER JOIN๋ฌธ ]
- INNER JOIN๋ฌธ์ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์ง๊ด์ ์ธ JOIN๋ฌธ์ ํ๋๋ก์ ์ผ์ชฝ ํ ์ด๋ธ(ํ ์ด๋ธ A)์ ์ค๋ฅธ์ชฝ ํ ์ด๋ธ(ํ ์ด๋ธ A)
๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ํ๋๋ฅผ ๋ฐํ
- ์ฆ ๋ ํ ์ด๋ธ์ ๊ต์งํฉ์ด ๋๋ ํ๋๋ฅผ ๋ฐํ, ๋น์ด์๋ ํ๋ ๋ฐ์ดํฐ ์กด์ฌํ์ง ์์
์ด๋ฏธ์ง ์ถ์ฒ : https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
[ UNION & UNION ALL ]
- UNION์ ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ ๋จ์ผ ๊ฒฐ๊ณผ ์ธํธ๋ก ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ญํ ์ ํจ
- UNION์ ๋ ๊ฐ์ ํ ์ด๋ธ์ ๊ฒฐํฉํ๋ค๊ณ ๊ฐ์ ์ ์ค๋ณต ํญ๋ชฉ์ ์ ์ธํ๊ณ ํ์ถ
- UNION ALL์ ์ค๋ณต ํญ๋ชฉ์ ์ ๊ฑฐํ์ง ์์ ์ฑ ํ์ถ
- ๋ง์ฝ ์ค๋ณต ์ฒดํฌํ ๋ฐ์ดํฐ์ ์์ด ๋ง์ ๊ฒฝ์ฐ UNION์ ๊ฒฝ์ฐ ๋ง์ ๋ถํ๋ฅผ ์ค ์ ์์ด ์ํฉ์ ๋ง๊ฒ ์ ์ฌ์ฉํด์ผ ํจ
- UNION ์ฐ์ฐ์ ์ฌ์ฉ ์ ์ด์ ๊ฐ์์ ์์๊ฐ ๋ชจ๋ ์ฟผ๋ฆฌ์์ ๋์ผํด์ผ ํจ
- ๋ฐ์ดํฐ ํ์์ด ํธํ๋์ด์ผ ํจ
# ๊ธฐ๋ณธ ๋ฌธ๋ฒ (๋จ์ UNION ์ฌ์ฉ)
select <select_list> from Table_A
UNION(UNION ALL)
select <select_list> from Table_B
[ INNER JOIN ์์ ]
โ ๊ฒฐ์ ์๋จ๋ณ ์ ์ ํฌ์ธํธ์ ํ๊ท ๊ฐ ๊ตฌํด๋ณด๊ธฐ
select o.payment_method,
round(avg(pu.`point`)) as 'ํฌ์ธํธ ํ๊ท ๊ฐ'
from point_users pu
inner join orders o on pu.user_id = o.user_id
group by o.payment_method
โก ๊ฒฐ์ ํ ๊ฐ์๋ฅผ ์์ํ์ง ์์ ์ ์ ๋ฅผ ์ฑ์จ๋ณ๋ก ์ธ์ด๋ณด๊ธฐ
select u.name,
count(*) as '๋ฏธ์๊ฐ ์ ์ ์'
from enrolleds e
inner join users u on e.user_id = u.user_id
where e.is_registered = 0
group by u.name
order by count(*) desc;
โข ๊ณผ๋ชฉ๋ณ ์๊ฐ์ ์์ํ์ง ์์ ์ ์ ์๋ฅผ ํ์ธํ๊ธฐ
select c.course_id,
c.title,
count(*) as '๊ณผ๋ชฉ๋ณ ๋ฏธ์๊ฐ ์ ์ ์'
from courses c
inner join enrolleds e on c.course_id = e.course_id
where e.is_registered = 0
group by c.title;
โฃ ์น๊ฐ๋ฐ, ์ฑ๊ฐ๋ฐ ์ข ํฉ๋ฐ์ week๋ณ ์ฒดํฌ์ธ ์ ์ธ์ด๋ณด๊ธฐ
select c.title,
ch.week,
count(*) as cnt
from courses c
inner join checkins ch on c.course_id = ch.course_id
group by c.title, ch.week
order by c.title, ch.week;
โค ์์ โฃ์์ 8์ 1์ผ ์ดํ ๊ตฌ๋งคํ ๊ณ ๊ฐ๋ค๋ง ์ถ๋ ฅ(๋๊ฐ ์ด์ ํ ์ด๋ธ JOIN)
select c.title,
ch.week,
count(*) as cnt
from courses c
inner join checkins ch on c.course_id = ch.course_id
inner join orders o on ch.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c.title, ch.week
order by c.title, ch.week;
[ LEFT JOIN ์์ ]
โ ๊ฐ์๋ฅผ ์์ํ์ง ์์ ์ ์ ๋ฅผ ์ฑ์จ๋ณ๋ก ํ์
select u.name,
count(*)
from users u
left join point_users pu on u.user_id = pu.user_id
where pu.point_user_id is NOT NULL
group by u.name
order by count(*) desc;
โก 7์ 10์ผ ~ 7์ 19์ผ์ ๊ฐ์ ํ ๊ณ ๊ฐ ์ค ํฌ์ธํธ๋ฅผ ๊ฐ์ง ๊ณ ๊ฐ์ ์, ์ ์ฒด ์, ๋น์จ ํ์
select count(u.user_id) as total_cnt,
count(pu.point_user_id) as pnt_cnt,
round(count(pu.point_user_id) / count(u.user_id), 2) as ratio
from users u
left join point_users pu on u.user_id = pu.user_id
where u.created_at between '2020-07-10' and '2020-07-20';
[ UNION ์ฐ์ฐ ์์ ]
โ 7์ ์๊ฐ ๊ณผ๋ชฉ/์ฃผ์ฐจ๋ณ ์ธ์ ์ ์ฟผ๋ฆฌ๋ฌธ๊ณผ 8์ ์๊ฐ ๊ณผ๋ชฉ/์ฃผ์ฐจ๋ณ ์ธ์ ์ ์ฟผ๋ฆฌ๋ฌธ ๊ฒฐํฉ
(
select '7์' as month,
c1.title,
c2.week,
count(*) as cnt
from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at < '2020-08-01'
group by c1.title, c2.week
# ๋๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ์ UNION ์ฐ์ฐํ ๊ฒฝ์ฐ ์ ๋ ฌ์ ๋ง์ง๋ง ์ฟผ๋ฆฌ๋ฌธ์์ ์ํ
# order by c1.title, c2.week
)
union all
(
select '8์' as month,
c1.title,
c2.week,
count(*) as cnt
from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at > '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week
);
[ ๐ 3์ฃผ์ฐจ ์๊ฐ ]
3์ฃผ์ฐจ์๋ JOIN๋ฌธ๊ณผ UNION ํจ์์ ๋ํด ๋ค๋ค๋ดค๋๋ฐ ํ์คํ JOIN๋ฌธ์ ๊ต์ฅํ ๋ง์ด ์ฌ์ฉ๋ ๊ฒ ๊ฐ๋ค.
๋ํ JOIN๋ฌธ์ ๋ํด ์กฐ๊ธ ๋ ๊ฒ์ํด๋ณด๋ EQUI JOIN๊ณผ์ ๊ฒฐ๊ณผ๋ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ง๋ง,
์ถํ ๋ค๋ฅธ ์ํฉ๋ค์ ๋๋นํ์๋ INNER JOIN๋ฌธ์ด ๋ ์ข๊ธฐ ๋๋ฌธ์ INNER JOIN๋ฌธ๊ณผ LEFT JOIN๋ฌธ์
ํด๋น ๊ฐ์์์ ์๋ดํ ๊ฒ์ด ์๋๊น ๋๋ฆ๋๋ก ์ถ์ธก์ ํด๋ณด์๋ฐ.
์ด์ ๋ง์ง๋ง 1์ฃผ๊ฐ ๋จ์์ผ๋ ๋๊น์ง ์ง์คํด์ ๊ณ ๊ณ
