Where ์ ์ ๊ฐ๋
๐ Where ์ ์, Select ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ์ ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๋ ๊ฒ์ ์๋ฏธ
โ
Select ์ฟผ๋ฆฌ๋ฌธ์ Where ์ ํจ๊ป ์จ๋ณด๊ธฐ
โ
select * from orders
where payment_method = "kakaopay";
Q) ์ ๊น! ์ kakaopay๊ฐ ์๋๋ผ "kakaopay"๋ผ๊ณ ์ฐ๋์? A) kakaopay๋ฅผ ํ๋๋ช ์ด๋ ํ ์ด๋ธ๋ช ์ด ์๋ ๋ฌธ์์ด๋ก ์ธ์์ํค๋ ค๋๊ฑฐ์์.
๋ง์ฝ "kakaopay"๊ฐ ์๋๋ผ kakaopay๋ผ๊ณ ์ฐ๋ฉด? ๋น์ฐํ ์๋ฌ๊ฐ ๋ฉ๋๋ค!
[Unknown column 'kakaopay' in 'where clause'] ์๋ฌ๋ฌธ๊ตฌ๋ฅผ ์ฒ์ฒํ ์ฝ์ด๋ณผ๊น์? Where ์ ์ ์๋ kakaopay๋ผ๋ ์ปฌ๋ผ์ ์๋ค! ๋ ๋ป์ด์์. ์ฌ๊ธฐ์ ์ปฌ๋ผ์ ํ๋๋ฅผ ์๋ฏธํด์. ์ ๋ง, kakaopay๋ผ๋ ๊ธ์๋ฅผ ์ปฌ๋ผ(ํ๋๋ช )์ผ๋ก ์ธ์ํด๋ฒ๋ ธ์ฃ ?
โ
Select ์ฟผ๋ฆฌ๋ฌธ์ Where ์ ํจ๊ป ์จ๋ณด๊ธฐ ์ฐ์ต
(1) ์ํ๋ ํ ์ด๋ธ๊ณผ (2) ์กฐ๊ฑด, ์ด ๋ ๊ฐ์ง๋ง ๊ธฐ์ตํ๋ฉด ๋ฉ๋๋ค!
SQL์ ์ ํ๊ธฐ ์ํด์๋, ์ํ๋ ์ ๋ณด๊ฐ ์ด๋ ํ ์ด๋ธ์ ๋ด๊ฒจ์๋์ง ์ ์ฐพ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํ๋ต๋๋ค!
[ํด์ฆ] ํฌ์ธํธ๊ฐ 20000์ ๋ณด๋ค ๋ง์ ์ ์ ๋ง ๋ฝ์๋ณด๊ธฐ!
select * from point_users where point > 20000;
โ
[๊ฟํ๐ฏ] ์ด๋ ๊ฒ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ฉด ํธํด์!
1) show tables๋ก ์ด๋ค ํ ์ด๋ธ์ด ์๋์ง ์ดํด๋ณด๊ธฐ 2) ์ ์ผ ์ํ๋ ์ ๋ณด๊ฐ ์์ ๊ฒ ๊ฐ์ ํ ์ด๋ธ์ select from ํ ์ด๋ธ๋ช ์ฟผ๋ฆฌ ๋ ๋ ค๋ณด๊ธฐ 3) ์ํ๋ ์ ๋ณด๊ฐ ์์ผ๋ฉด ๋ค๋ฅธ ํ ์ด๋ธ์๋ 2)๋ฅผ ํด๋ณด๊ธฐ 4) ํ ์ด๋ธ์ ์ฐพ์๋ค! ์กฐ๊ฑด์ ๊ฑธ ํ๋๋ฅผ ์ฐพ๊ธฐ 5) select from ํ ์ด๋ธ๋ช where ์กฐ๊ฑด ์ด๋ ๊ฒ ์ฟผ๋ฆฌ ์์ฑ!
โ
Where ์ ๊ณผ ์์ฃผ ๊ฐ์ด์ฐ๋ ๋ฌธ๋ฒ ๋ฐฐ์ฐ๊ธฐ
'๊ฐ์ง ์์' ์กฐ๊ฑด ๊ฑธ์ด๋ณด๊ธฐ
'๊ฐ์ง ์์' ์กฐ๊ฑด์ != ๋ก ๊ฑธ ์ ์์ต๋๋ค.
[์ฝ๋์ค๋ํซ] '๊ฐ์ง ์์' ์กฐ๊ฑด ๊ฑธ์ด๋ณด๊ธฐ
select * from orders
where course_title != "์น๊ฐ๋ฐ ์ข ํฉ๋ฐ";
์ ๊น ์์! '!=' ์์ ! (๋๋ํ)๋ ๋ถ์ (not)์ ์๋ฏธํฉ๋๋ค. '='๋ ๊ฐ์์ ์๋ฏธํ๋, '!='๋ ๊ฐ์ง ์์์ด๊ฒ ์ฃ !
โ
*'๋ฒ์' ์กฐ๊ฑด ๊ฑธ์ด๋ณด๊ธฐ
7์ 13์ผ, 7์ 14์ผ์ ์ฃผ๋ฌธ๋ฐ์ดํฐ๋ง ๋ณด๊ณ ์ถ์ด์ก์ด์. ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
'๋ฒ์' ์กฐ๊ฑด์ between ์ผ๋ก ๊ฑธ ์ ์์ด์.
select * from orders
where created_at between "2020-07-13" and "2020-07-15";
*'ํฌํจ' ์กฐ๊ฑด ๊ฑธ์ด๋ณด๊ธฐ
๐ 1, 3์ฃผ์ฐจ ์ฌ๋๋ค์ '์ค๋์ ๋ค์ง' ๋ฐ์ดํฐ๋ง ๋ณด๊ณ ์ถ์ด์ก์ด์.
'ํฌํจ' ์กฐ๊ฑด์ in ์ผ๋ก ๊ฑธ ์ ์์ด์.
select * from checkins
where week in (1, 3);
๐ ๋ค์ (daum) ์ด๋ฉ์ผ์ ์ฌ์ฉํ๋ ์ ์ ๋ง ๋ณด๊ณ ์ถ์ด์ก์ด์. ์ด๋ป๊ฒ ํ์ฃ ?
'ํจํด' ์กฐ๊ฑด์ like ์ผ๋ก ๊ฑธ ์ ์์ด์.
*'ํจํด' (๋ฌธ์์ด ๊ท์น) ์กฐ๊ฑด ๊ฑธ์ด๋ณด๊ธฐ
select * from users
where email like '%daum.net';
[๊ฟํ๐ฏ] Like์ ๋ค์ํ ์ฌ์ฉ๋ฒ
where email like 'a%': email ํ๋๊ฐ์ด a๋ก ์์ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ
where email like '%a' email ํ๋๊ฐ์ด a๋ก ๋๋๋ ๋ชจ๋ ๋ฐ์ดํฐ
where email like '%co%' email ํ๋๊ฐ์ co๋ฅผ ํฌํจํ๋ ๋ชจ๋ ๋ฐ์ดํฐ
where email like 'a%o' email ํ๋๊ฐ์ด a๋ก ์์ํ๊ณ o๋ก ๋๋๋ ๋ชจ๋ ๋ฐ์ดํฐ
โ
*์ผ๋ถ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ: Limit
๐ ํ ์ด๋ธ์ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ๋ค์ด์๋ ์ ๊น ๋ณด๋ ค๊ณ ๋ค์ด์๋๋ฐ, ๋ฐ์ดํฐ๋ฅผ ๋ค ๋ถ๋ฌ์ค๋๋ผ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ํ๋ค๊ฒ ์ฃ ?
๊ทธ๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด, ์ผ๋ถ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๋ Limit์ด๋ผ๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
select * from orders
where payment_method = "kakaopay"
limit 5;
๋ฑ 5๊ฐ๋ง ์ถ๋ ฅ๋ ๊ฒ์ ์ ์ ์์ฃ ?
*์ค๋ณต ๋ฐ์ดํฐ๋ ์ ์ธํ๊ณ ๊ฐ์ ธ์ค๊ธฐ: Distinct
select distinct(payment_method) from orders;
์๋ ๊ฒ, ๋ค ๊ฐ์ ๊ฒฐ์ ์๋จ์ด ์๋ค๋ ์ฌ์ค์ ํ ์ค๋ก ์์๋ผ ์ ์๋ต๋๋ค!
*๋ช ๊ฐ์ธ์ง ์ซ์ ์ธ๋ณด๊ธฐ: Count
์ด๋ฒ์๋ orders ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ๋ช ๊ฐ ๋ค์ด์๋์ง ๊ถ๊ธํด์! (๊ฒฐ์ ๊ฐ ๋ช ๊ฑด์ด๋ ๋ค์ด์์ฃ ? ๋๊ทผ๋๊ทผ) 1) orders ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ถ๋ฌ์์, ํ์คํ์ค์ฉ ์ผ๋ค 2) count ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ๋ฐฉ์ ๋ณธ๋ค
๋น์ฐํ 2๋ฒ์ด์ฃ ?
select count(*) from orders
ํ ์ค๋ก ๋! select from orders์์ ์, count๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋ฉ๋๋ค.
*[์์ฉ] Distinct์ Count๋ฅผ ๊ฐ์ด ์จ๋ณด๊ธฐ
๐ ์คํ๋ฅดํ ํ์ ๋ถ๋ค์ ์ฑ(family name)์จ๊ฐ ๋ช๊ฐ์ธ์ง ๊ถ๊ธํ๋ค๋ฉด? ์ด๋ฒ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์ต๋๋ค!
select distinct(name) from users;
์ด๋ ๊ฒ ํ๋ฉด ์ฑ์จ๊ฐ ์ญ ๋์ค์ฃ ?
SELECT count(distinct(name)) from users;
๊ทธ๋ฆฌ๊ณ , ์ฌ๊ธฐ์ count๋ฅผ ์ ํ์ฃผ๋ฉด ๋ช ๊ฐ์ ์ฑ์จ๊ฐ ์๋์ง ์ ์ ์์ต๋๋ค. (์ฐธ ์ฝ์ฃ ?)
โ[์ฝ๋์ค๋ํซ] ์ฑ์จ๋ณ ํ์์๋ฅผ Group by๋ก ์ฝ๊ฒ ๊ตฌํด๋ณด๊ธฐ
select name, count(*) from users
group by name;
from users: users ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค
group by name: name์ด๋ผ๋ ํ๋์์ ๋์ผํ ๊ฐ์ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก ํฉ์ณ์ค๋๋ค
select name, count(): ์ด๋ฆ๊ณผ count()๋ฅผ ์ถ๋ ฅํด ์ฃผ๋๋ฐ, ์ฌ๊ธฐ์ count(*)๋ group by๋ก ํฉ์ณ์ง ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ์ธ์ด์ฃผ๋ ๊ฒ์ ๋๋ค!
โ
Group by ์ ๋๋ก ์์๋ณด๊ธฐ: SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์
select name, count(*) from users
group by name;
๐ ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์: from โ group by โ select
[์ฝ๋์ค๋ํซ] users ํ ์ด๋ธ ์ ์ฒด ๋ถ๋ฌ์ค๊ธฐ
select * from users;
[์ฝ๋์ค๋ํซ] users ํ ์ด๋ธ์์ '์ ' ์จ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์์ ๊ฐ์ ์ดํด๋ณด๊ธฐ
select * from users
where name = "์ **";
์ง๋์ฃผ ๋ฐฐ์ ๋ where๋ฅผ ์ฌ์ฉํด์ ๋ฝ์๋ดค์ด์. 14๊ฐ๊ฐ ๋์ค๋ค์.
[์ฝ๋์ค๋ํซ] group by๋ฅผ ์ฌ์ฉํด์ '์ '์จ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ ๋ช ๊ฐ์ธ์ง ์ดํด๋ณด๊ธฐ
select name, count(*) from users
group by name;
์ด๋ ๊ฒ ๋์ค๋ฉด ์ฑ๊ณต! ์ ์จ๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๊ฐ 14๊ฐ๋ก ๋์ผํ๊ฒ ๋์ค์ฃ ?
โ
Group by ๊ธฐ๋ฅ ์์๋ณด๊ธฐ
์ฌ์ฉํ ํ ์ด๋ธ ์์๋ณด๊ธฐ!
์, select * from checkins limit 10 ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ค์ ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ณผ๊น์?
checkins ํ ์ด๋ธ ๋ณด๋ฌ๊ฐ๊ธฐ
์ด๋ฒ ๊ฐ์์์ ์ฌ์ฉํ ํ๋๋ ์๊ฑฐ! week: ์๊ฐ์์ด '์ค๋์ ๋ค์ง'์ ๋จ๊ธด ์์ ์ ๊ฐ์ ์ฃผ์ฐจ๋ฅผ ์๋ฏธํฉ๋๋ค. likes: ๋จ๊ธด '์ค๋์ ๋ค์ง' ๊ฒ์๋ฌผ์ ๋ฌ๋ฆฐ ์ข์์์ ์๋ฅผ ์๋ฏธํฉ๋๋ค.
๋์ผํ ๋ฒ์ฃผ์ ๊ฐ์ ๊ตฌํ๊ธฐ
[์ฝ๋์ค๋ํซ] ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ๊ฐ์ ๊ตฌํ๊ธฐ
select ๋ฒ์ฃผ๋ณ๋ก ์ธ์ด์ฃผ๊ณ ์ถ์ ํ๋๋ช , count(*) from ํ ์ด๋ธ๋ช
group by ๋ฒ์ฃผ๋ณ๋ก ์ธ์ด์ฃผ๊ณ ์ถ์ ํ๋๋ช ;
์ด ๊ท์น์ผ๋ก ํ๋ฉด ๋๋ต๋๋ค. ์ฐธ ์ฝ์ฃ ? (์ฌ๊ธฐ์ , week๊ฐ ๋ฒ์ฃผ๋ณ๋ก ์ธ์ด์ฃผ๊ณ ์ถ์ ํ๋๋ช ์ด์ฃ !)
๋์ผํ ๋ฒ์ฃผ์์์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
[์ฝ๋์ค๋ํซ] ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง'์ ์ข์์ ์ต์๊ฐ ๊ตฌํ๊ธฐ
select ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช , min(์ต์๊ฐ์ ์๊ณ ์ถ์ ํ๋๋ช ) from ํ ์ด๋ธ๋ช
group by ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ;
์ด ๊ท์น์ผ๋ก ํ๋ฉด ๋๋ต๋๋ค.
์ฌ๊ธฐ์๋, ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ์ week, ์ต์๊ฐ์ ์๊ณ ์ถ์ ํ๋๋ช ์ likes ๊ฒ ์ฃ .
๋์ผํ ๋ฒ์ฃผ์์์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
[์ฝ๋์ค๋ํซ] ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง'์ ์ข์์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
select ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช , max(์ต๋๊ฐ์ ์๊ณ ์ถ์ ํ๋๋ช ) from ํ ์ด๋ธ๋ช
group by ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ;
์ด ๊ท์น์ผ๋ก ํ๋ฉด ๋๋ต๋๋ค. ์ต์๊ฐ ๊ตฌํ ๋์ ๋ฌ๋ผ์ง๊ฑด ํ๋๋ฐ์ ์์ด์.
์ฌ๊ธฐ์๋, ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ์ week, ์ต๋๊ฐ์ ์๊ณ ์ถ์ ํ๋๋ช ์ likes ๊ฒ ์ฃ .
๋์ผํ ๋ฒ์ฃผ์ ํ๊ท ๊ตฌํ๊ธฐ
[์ฝ๋์ค๋ํซ] ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง'์ ์ข์์ ํ๊ท ๊ฐ ๊ตฌํ๊ธฐ
select ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช , avg(ํ๊ท ๊ฐ์ ์๊ณ ์ถ์ ํ๋๋ช ) from ํ ์ด๋ธ๋ช
group by ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ;
์ด ๊ท์น์ผ๋ก ํ๋ฉด ๋๋ต๋๋ค. ์ต์๊ฐ ๊ตฌํ ๋์ ๋ฌ๋ผ์ง๊ฑด ํ๋๋ฐ์ ์์ด์.
์ฌ๊ธฐ์๋, ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ์ week, ํ๊ท ๊ฐ์ ์๊ณ ์ถ์ ํ๋๋ช ์ likes ๊ฒ ์ฃ .
๋์ผํ ๋ฒ์ฃผ์ ํฉ๊ณ ๊ตฌํ๊ธฐ
[์ฝ๋์ค๋ํซ] ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง'์ ์ข์์ ํฉ๊ณ ๊ตฌํ๊ธฐ
select ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช , sum(ํฉ๊ณ๋ฅผ ์๊ณ ์ถ์ ํ๋๋ช ) from ํ ์ด๋ธ๋ช
group by ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ;
์ด ๊ท์น์ผ๋ก ํ๋ฉด ๋๋ต๋๋ค. ์ต์๊ฐ ๊ตฌํ ๋์ ๋ฌ๋ผ์ง๊ฑด ํ๋๋ฐ์ ์์ด์.
์ฌ๊ธฐ์๋, ๋ฒ์ฃผ๊ฐ ๋ด๊ธด ํ๋๋ช ์ week, ํฉ๊ณ๋ฅผ ์๊ณ ์ถ์ ํ๋๋ช ์ likes ๊ฒ ์ฃ .
โ
Order by๋ก ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํด๋ณด์
[์ฝ๋์ค๋ํซ] ์๋ณธ ์ฟผ๋ฆฌ ์ดํด๋ณด๊ธฐ
select name, count(*) from users
group by name;
[์ฝ๋์ค๋ํซ] ๊ฒฐ๊ณผ์ ๊ฐ์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด๋ณด๊ธฐ
select name, count(*) from users
group by name
order by count(*);
์๊น ์ฝ๋์ order by count() ๋ง ์ถ๊ฐํด์คฌ์ด์. ๊ฐฏ์ (count() ๊ฐ)์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด๋ฌ๋ผ๋ ๋ป์ด์์.
[์ฝ๋์ค๋ํซ] ๊ฒฐ๊ณผ์ ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํด๋ณด๊ธฐ
select name, count(*) from users
group by name
order by count(*) desc;
๐ [๊ฟํ!] ์ฌ๊ธฐ์์ desc๋ ๋ด๋ฆผ์ฐจ์์ ์๋ฏธํ๋ ์๋จ์ด descending์ ์ฝ์์ ๋๋ค.
Order by ์ฌ์ฉํด๋ณด๊ธฐ
Order by๋ ๋ชจ๋ SQL ์ฟผ๋ฆฌ์ ์ ์ฉ๋ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค.
๐ like๋ฅผ ๋ง์ด ๋ฐ์ ์์๋๋ก '์ค๋์ ๋ค์ง'์ ์ถ๋ ฅํด ๋ณผ๊น์?
select * from checkins
order by likes desc;
์ ๊ฒ ๋ฐ์ ์์๋๋ก๋ ๋ณด๊ธฐ ์ํด์๋, ๋งจ ๋์ desc๋ฅผ ์ ๊ฑฐํด ์ฃผ๋ฉด ๋์ด์!
๊ท์น์ ์ดํด๋ณผ๊น์?
select * from ํ ์ด๋ธ๋ช
order by ์ ๋ ฌ์ ๊ธฐ์ค์ด ๋ ํ๋๋ช ;
๋ฐ๋ก ์ ์์์์๋, like์ ๊ฐฏ์๊ฐ ์ ๋ ฌ์ ๊ธฐ์ค์ด ๋๋ ํ๋๋ช ์ด๊ฒ ์ฃ !
Order by ์ ๋๋ก ์์๋ณด๊ธฐ: SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์
select name, count(*) from users
group by name
order by count(*);
์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์: from โ group by โ select โ order by
1.from users: users ํ ์ด๋ธ ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
2.group by name: users ํ ์ด๋ธ ๋ฐ์ดํฐ์์ ๊ฐ์ name์ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ์ค๋๋ค.
3.select name, count(*): name์ ๋ฐ๋ผ ํฉ์ณ์ง ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ ๋ช ๊ฐ๊ฐ ํฉ์ณ์ง ๊ฒ์ธ์ง ์ธ์ด์ค๋๋ค.
์) ์ด, ์ด, ๊น, ๊น, ๋ฐ ์ด๋ ๊ฒ ๋ฐ์ดํฐ๊ฐ ์์๋ค๋ฉด, ์ด๋ 2๊ฐ, ๊น์ 2๊ฐ, ๋ฐ์ 1๊ฐ๊ฒ ์ฃ !
4.order by count(*): ํฉ์ณ์ง ๋ฐ์ดํฐ์ ๊ฐ์์ ๋ฐ๋ผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํด์ค๋๋ค.
โ
Where์ Group by, Order by ํจ๊ป ์ฌ์ฉํด๋ณด๊ธฐ
๐ ์๋ฆฌ๋ ๊ฐ๋จํด์. Where์ ๋ก ์กฐ๊ฑด์ด ํ๋ ์ถ๊ฐ๋๊ณ , ๊ทธ ์ดํ์ Group by, Order by๊ฐ ์คํ๋๋ ๊ฒ!
์น๊ฐ๋ฐ ์ข ํฉ๋ฐ์ ๊ฒฐ์ ์๋จ๋ณ ์ฃผ๋ฌธ๊ฑด์ ์ธ์ด๋ณด๊ธฐ
orders ํ ์ด๋ธ์์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๊ณ
์น๊ฐ๋ฐ ์ข ํฉ๋ฐ ๋ฐ์ดํฐ๋ง ๋จ๊ธฐ๊ณ
๊ฒฐ์ ์๋จ(๋ฒ์ฃผ) ๋ณ๋ก ๊ทธ๋ฃนํํ๊ณ
๊ฒฐ์ ์๋จ๋ณ ์ฃผ๋ฌธ๊ฑด์๋ฅผ ์ธ์ด์ค๋ค!
select payment_method, count(*) from orders
where course_title = "์น๊ฐ๋ฐ ์ข ํฉ๋ฐ"
group by payment_method;
์์ ๊ฐ์ด, group by์ select ์ฌ์ด์ where๋ก ์กฐ๊ฑด์ ๋ฃ์ด์ฃผ๋ฉด ๋!
โ
๋ ์์๋ณด๊ธฐ: SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์
select payment_method, count(*) from orders
where course_title = "์น๊ฐ๋ฐ ์ข ํฉ๋ฐ"
group by payment_method;
๐ ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์: from โ where โ group by โ select
1.from orders: users ํ ์ด๋ธ ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
2.where course_title = "์น๊ฐ๋ฐ ์ข ํฉ๋ฐ": ์น๊ฐ๋ฐ ์ข ํฉ๋ฐ ๋ฐ์ดํฐ๋ง ๋จ๊ฒจ์ค๋๋ค.
3.group by payment_method: ๊ฐ์ payment_method์ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ์ค๋๋ค.
4.select payment_method, count(*): payment_method์ ๋ฐ๋ผ ํฉ์ณ์ง ๋ฐ์ดํฐ๊ฐ ๊ฐ๊ฐ ๋ช ๊ฐ๊ฐ ํฉ์ณ์ง ๊ฒ์ธ์ง ์ธ์ด์ค๋๋ค.
kakaopay๋ 1๊ฐ๊ฒ ์ฃ !
์) CARD, CARD, kakaopay ์ด๋ ๊ฒ ๋ฐ์ดํฐ๊ฐ ์์๋ค๋ฉด, CARD๋ 2๊ฐ, ๋ง์ฝ order by๊ฐ ์ถ๊ฐ๋๋ค๋ฉด? order by๋ ๋งจ ๋์ค์ ์คํ๋ฉ๋๋ค! (๊ฒฐ๊ณผ๋ฌผ์ ์ ๋ ฌํด์ฃผ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ!)
โ
ํผ์์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด
๐ ๋ค์ ๋์์จ ๊ฐ์ด ์ฝ์งํด๋ณด๊ธฐ ์๊ฐ!SQL์ ์ฌ์ฉํ๋ค๋ณด๋ฉด ์์ํ์ง ๋ชปํ๋ ์๋ฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฃผ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค. ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋ชจ๋ ์ธ์ฐ๋ ๊ฒ์ ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๊ฒ ์ฃ ?
์์ฃผ ๋ฐ์ํ๋ ๋ฌธ์ , ์ ์ ๊ฐ์ด ์ฝ์งํ๋ฉด์ ํด๊ฒฐํด๋ด์!
์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์์๊น์?
๐ ๋ฒ์ฃผ์ ๋ฐ๋ฅธ ํต๊ณ์น๋ฅผ ๊ตฌํ๊ณ ์ถ์ด group by๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. ํ์ง๋ง, ํต๊ณ์น๋ ๋์ค์ง ์๊ณ 4๊ฐ์ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅ๋ ๊ฒ์ ์ ์ ์์ฃ .์ ๊ทธ๋ด๊น์?
๐ ๋ฒ์ฃผ๋ณ๋ก ๋ฌถ์ด๋ฌ๋ผ๋ ๋ช ๋ น์ด (group by)๋ ์์ฑํด์คฌ์ง๋ง, ๋ฌถ์ ๋ฐ์ดํฐ๋ฅผ '์ด๋ค ํต๊ณ์น'๋ก ์ถ๋ ฅํด๋ฌ๋ผ๋ ๋ช ๋ น์ด๊ฐ ์์ด์ ๊ทธ๋ ์ต๋๋ค!๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ ํ๋ฉด ์ข์๊น์?
๐ '์ด๋ค ํต๊ณ์น๋ก' ์ถ๋ ฅํด๋ฌ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค. ๋ฒ์ฃผ๋ณ ๊ฐฏ์๋ฅผ ์ธ์ด๋ณผ๊น์? ์๋์ ๊ฐ์ด์!์, ๋ญ๊ฐ ์ํ๋ ํต๊ณ์น๊ฐ ๋์จ ๊ฒ ๊ฐ์ง๋ง ๊ฐ๊ฐ ์ด๋ค ๋ฒ์ฃผ์ ๋ํ ํต๊ณ์น์ธ์ง๋ ๋์์์ง ์์์.
๊ทธ๋ ๋น์ฐํ ๊ฒ์ด, select ๋ฌธ ์์ count(*)๋ง ์ ํ์์ด์ ๊ทธ๋ ๊ฒ ์ฃ ?
๐ ๊ทธ๋ ๋ค๋ฉด group by์ ๋ค์ด๊ฐ ํ๋๋ฅผ ๋๊ฐ์ด ์ ์ด์ฃผ๋ฉด ๋ฉ๋๋ค. ๊น๋ํ๊ฒ ์ํ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋์ค๋๊ฑธ ํ์ธํ ์ ์์ต๋๋ค! ๐ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋์ง ์์ ๋, SQL ์ฟผ๋ฆฌ์ ์คํ์์์ ๋ฐ๋ผ ์ฐจ๊ทผ์ฐจ๊ทผ ์๊ฐํด๋ด์. ์ด๋์ ์ฟผ๋ฆฌ๋ฅผ ์๋ชป ์งฐ๋์ง ์ฐพ์๋ด๋ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ์ ํํ ๋ฐฉ๋ฒ์ ๋๋ค!โ
โ
๋ฌธ์์ด์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด๋ณด๊ธฐ
select * from users order by email;
๋์ผํ๊ฒ ์ํ๋ฒณ์ผ๋ก๋ ์ ์ ๋ ฌ์ด ๋ฉ๋๋ค.
select * from users order by name;
๊ทธ๋ฆฌ๊ณ , ํ๊ธ๋ก๋ ์ ์ ๋ ฌ์ด ๋ฉ๋๋ค. ์ฐธ ์ฝ์ฃ ?
์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด๋ณด๊ธฐ
select * from users order by created_at desc;
์ต๊ทผ ๋ฐ์ดํฐ๋ถํฐ ๋ณด๊ณ ์ถ์ ๋, ์ ์ฉํด์!
Group by ์ฐ์ตํ๊ธฐ
๐ ์, Group by๋ ํด์ฆ๋ฅผ ํ์ด๋ณผ๊น์? (1) ์ํ๋ ํ ์ด๋ธ๊ณผ (2) ๋ฒ์ฃผ๋ก ์ฌ์ฉํ ํ๋ (3) ๋ฒ์ฃผ์ ๋ฐ๋ผ ํต๊ณ๋ฅผ ๊ณ์ฐํ๊ณ ์ถ์ ํ๋ (๊ฐ์์ ๊ฒฝ์ฐ ์ ์ธ)
์ด ์ธ ๊ฐ์ง๋ง ๊ธฐ์ตํ๋ฉด ๋ฉ๋๋ค!
โ
[๊ฟํ] ์ด๋ ๊ฒ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ฉด ํธํด์!
๐ 1) show tables๋ก ์ด๋ค ํ ์ด๋ธ์ด ์๋์ง ์ดํด๋ณด๊ธฐ 2) ์ ์ผ ์ํ๋ ์ ๋ณด๊ฐ ์์ ๊ฒ ๊ฐ์ ํ ์ด๋ธ์ select * from ํ ์ด๋ธ๋ช limit 10 ์ฟผ๋ฆฌ ๋ ๋ ค๋ณด๊ธฐ 3) ์ํ๋ ์ ๋ณด๊ฐ ์์ผ๋ฉด ๋ค๋ฅธ ํ ์ด๋ธ์๋ 2)๋ฅผ ํด๋ณด๊ธฐ 4) ํ ์ด๋ธ์ ์ฐพ์๋ค! ๋ฒ์ฃผ๋ฅผ ๋๋ ์ ๋ณด๊ณ ์ถ์ ํ๋๋ฅผ ์ฐพ๊ธฐ 5) ๋ฒ์ฃผ๋ณ๋ก ํต๊ณ๋ฅผ ๋ณด๊ณ ์ถ์ ํ๋๋ฅผ ์ฐพ๊ธฐ 6) SQL ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ!
โ
๋ณ์นญ ๊ธฐ๋ฅ: Alias
๐ ์ฟผ๋ฆฌ๊ฐ ์ ์ ๊ธธ์ด์ง๋ฉด์ ์ข ์ข ํท๊ฐ๋ฆฌ๋ ์ผ์ด ์๊ธธ ์ ์์ต๋๋ค. ๊ทธ๋์ SQL์ Alias๋ผ๋ ๋ณ์นญ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.
select * from orders o
where o.course_title = '์ฑ๊ฐ๋ฐ ์ข ํฉ๋ฐ'
์๋ ๊ฒ ํ ์ด๋ธ๋ช ๋ค์ as๋ฅผ ๋ถ์ฌ์ ๋ณ์นญ์ ์ถ๊ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๊ณ ,
select payment_method, count(*) as cnt from orders o
where o.course_title = '์ฑ๊ฐ๋ฐ ์ข ํฉ๋ฐ'
group by payment_method
count(*)๊ฐ ์๋๋ผ cnt๋ก ์ถ๋ ฅ๋์๋ค์!
๐ ์ด์ฒ๋ผ, ํผ๋์ ์ต์ํํ๊ณ ์ํ๋ ์ด๋ฆ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉ๋ผ์. ์ด ๊ธฐ๋ฅ์ ๋ค์ ์ฃผ์ฐจ๋ถํฐ ๊ต์ฅํ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋, '์ด๋ฐ๊ฒ ์๊ตฌ๋' ์ ๋๋ก๋ง ๊ธฐ์ตํด ์ฃผ์ธ์!
โ
โ
โJoin ์ด๋?
๐ Join์ด๋? ๋ ํ ์ด๋ธ์ ๊ณตํต๋ ์ ๋ณด (key๊ฐ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ํ ํ ์ด๋ธ์ฒ๋ผ ๋ณด๋ ๊ฒ์ ์๋ฏธํด์.
์) user_id ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก users ํ ์ด๋ธ๊ณผ orders ํ ์ด๋ธ์ ์ฐ๊ฒฐํด์ ํ ๋์ ๋ณด๊ณ ์ถ์ด์!
๐ ์์ ์์์ ๊ฐ์ด, ๋ ํ ์ด๋ธ์ ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํด์ ํจ๊ป ๋ณด๊ณ ์ถ์ ๋๊ฐ ์๊ฒ ์ฃ ?
๊ทธ๋ด ๋๋ฅผ ๋๋นํด์ ๋ฌด์ธ๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๊ฐ ์์ ๋, user_id ์ฒ๋ผ ๋์ผํ ์ด๋ฆ๊ณผ ์ ๋ณด๊ฐ ๋ด๊ธด ํ๋๋ฅผ ๋ ํ ์ด๋ธ์ ๋๊ฐ์ด ๋ด์๋๋๋ต๋๋ค. ์ด๋ฐ ํ๋๋ฅผ ๋ ํ ์ด๋ธ์ ์ฐ๊ฒฐ์์ผ์ฃผ๋ ์ด์ ๋ผ๋ ์๋ฏธ๋ก 'key'๋ผ๊ณ ๋ถ๋ฌ์.
[์ค๋์ ๊ฟํ!] ๋ณ์์์ ์์ฌ์ ์๋์ด 'ํ์๋ฒํธ 101๋ฒ๋ ์ง๋ฃ๋ฐ์ผ๋ฌ ๋ค์ด์ค์ธ์' ๋ผ๊ณ ๋ถ๋ ๋๋ฐ ๊ฐ์ ํ์๋ฒํธ๋ฅผ ๊ฐ์ง ์ฌ๋์ด ์ฌ๋ฌ๋ช ์ด ์์ผ๋ฉด ๋๊ฐ ๋ค์ด์์ผ ํ ์ง ํ์๋ฒํธ๋ง์ผ๋ก ์ ์ ์๊ฒ ์ฃ ? SQL์์์ Join๋ ๋ง์ฐฌ๊ฐ์ง์์. key๊ฐ์ ์ฌ์ฉํด ์ฐ๊ฒฐํ๊ณ ์ถ์ ํ ์ด๋ธ์ ์ฐพ์๊ฐ์ ๋๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ key๋ฅผ ์ฐพ๊ฒ ๋๋๋ฐ, ๋๊ฐ์ key๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ๊ฐ ์์ผ๋ฉด ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ฐ๊ฒฐํด์ผ ํ ์ง ์ ์ ์์ด์.
[์ฝ๋์ค๋ํซ] Join์ ์ฌ์ฉํด์ Key๊ฐ์ผ๋ก ๋ ํ ์ด๋ธ ์ฐ๊ฒฐํด๋ณด๊ธฐ
select * from point_users
left join users
on point_users.user_id = users.user_id
๐ [์ค๋์ ๊ฟํ!] ํน์ ์์ ์ ์ ์ฐ์ ๋ค๋ฉด?
SQL์ Join์ ์์ ์ vlookup๊ณผ ๋์ผํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค :-)
[์ฝ๋์ค๋ํซ] ์ ์ ๋ฐ์ดํฐ๋ก Left Join ์ดํดํด๋ณด๊ธฐ
select * from users u
left join point_users p
on u.user_id = p.user_id;
์ด๋ค ๋ฐ์ดํฐ๋ ๋ชจ๋ ํ๋๊ฐ ์ฑ์์ ธ์์ง๋ง, ์ด๋ค ๋ฐ์ดํฐ๋ ๋น์ด์๋ ํ๋๊ฐ ์์ต๋๋ค. ๊ฝ์ฐฌ ๋ฐ์ดํฐ: ํด๋น ๋ฐ์ดํฐ์ user_id ํ๋๊ฐ์ด point_users ํ ์ด๋ธ์ ์กด์ฌํด์ ์ฐ๊ฒฐํ ๊ฒฝ์ฐ ๋น์ด์๋ ๋ฐ์ดํฐ: ํด๋น ๋ฐ์ดํฐ์ user_id ํ๋๊ฐ์ด point_users ํ ์ด๋ธ์ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
๋น์ด์๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ํ์์ด์ง๋ง ์๊ฐ์ ๋ฑ๋ก/์์ํ์ง ์์ ํฌ์ธํธ๋ฅผ ํ๋ํ์ง ์์ ํ์์ธ ๊ฒฝ์ฐ์์!
โ
Where๋ฅผ ์ฌ์ฉํด์ ์ง์ ํ์ธํด๋ณด๊ธฐ!
๐ ๊ฝ์ฐฌ ๋ฐ์ดํฐ, ๋น์ด์๋ ๋ฐ์ดํฐ์์ ํ๋์ฉ user_id๋ฅผ ๋ฝ์์ orders ํ ์ด๋ธ์์ ์กฐํํด๋ณผ๊น์?
๊ฝ์ฐฌ ๋ฐ์ดํฐ์ user_id๊ฐ ์์: d90e7626 ๋น์ด์๋ ๋ฐ์ดํฐ์ user_id๊ฐ ์์: 3b3eac9f
๐ ์์ user_id๊ฐ์ผ๋ก ์กฐํํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ์์ ์ผ๋ก ํ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋์ง๋ง, ์๋์ user_id๊ฐ์ผ๋ก ์กฐํํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋์ง ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค!
[์ฝ๋์ค๋ํซ] ์ ์ ๋ฐ์ดํฐ๋ก Inner Join ์ดํดํด๋ณด๊ธฐ
select * from users u
inner join point_users p
on u.user_id = p.user_id;
์, ์ฌ๊ธฐ์๋ ๋น์ด์๋ ํ๋๊ฐ ์๋ ๋ฐ์ดํฐ๊ฐ ์์ด์! ๊ทธ ์ด์ ๋, ๊ฐ์ user_id๋ฅผ ๋ ํ ์ด๋ธ์์ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ด์์.
โ
Join ํจ๊ป ์ฐ์ตํด๋ณด๊ธฐ
[์ค์ต] orders ํ ์ด๋ธ์ users ํ ์ด๋ธ ์ฐ๊ฒฐํด๋ณด๊ธฐ
select * from orders o
inner join users u
on o.user_id = u.user_id;
[์ค๋์ ํ!] ์ฃผ๋ฌธ์ ํ๊ธฐ ์ํด์๋ ํ์์ ๋ณด๊ฐ ์์ด์ผ ํ ํ ๋, orders ํ ์ด๋ธ์ ๋ด๊ธด user_id๋ ๋ชจ๋ users ํ ์ด๋ธ์ ์กด์ฌํ๊ฒ ์ฃ ?
[์ค์ต] checkins ํ ์ด๋ธ์ users ํ ์ด๋ธ ์ฐ๊ฒฐํด๋ณด๊ธฐ
select * from checkins c
inner join users u
on c.user_id = u.user_id;
๐ [์ค๋์ ํ!]
์ฐ๊ฒฐ์ ๊ธฐ์ค์ด ๋๊ณ ์ถ์ ํ ์ด๋ธ์ from ์ ์, ๊ธฐ์ค์ด ๋๋ ํ ์ด๋ธ์ ๋ถ์ด๊ณ ์ถ์ ํ ์ด๋ธ์ Join ์ ์ ์์นํด ๋์ต๋๋ค.
[์ค์ต] enrolleds ํ ์ด๋ธ์ courses ํ ์ด๋ธ ์ฐ๊ฒฐํด๋ณด๊ธฐ
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
๐ ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์: from โ join โ select
[์ฝ๋์ค๋ํซ] ๊ณผ๋ชฉ๋ณ ์ค๋์ ๋ค์ง ๊ฐฏ์ ์ธ์ด๋ณด๊ธฐ
select co.title, count(co.title) as checkin_count from checkins ci
inner join courses co
on ci.course_id = co.course_id
group by co.title
[์ค๋์ ํ!] 2์ฃผ์ฐจ์ ๋ฐฐ์ด alias๋ ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ํธํฉ๋๋ค. ์ฐ๊ฒฐ๋๋ ํ ์ด๋ธ์ด ๋ง์์ง๋ฉด์ ํ๋๋ช ๊ณผ ํ ์ด๋ธ๋ช ์ด ํท๊ฐ๋ ค ์ค์ํ ์ ์๋๋ฐ, ์ด๋ ๊ฒ alias๋ฅผ ์ง์ ํด ์ฃผ๋ฉด ํธํ๊ณ ๊น๋ํ๊ฒ SQL ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ด์.
point_users ํ ์ด๋ธ์ users ํ ์ด๋ธ ์ฐ๊ฒฐํด์ ์์๋๋ก ์ ๋ ฌํด๋ณด๊ธฐ
[์ฝ๋์ค๋ํซ] ๋ง์ ํฌ์ธํธ๋ฅผ ์ป์ ์์๋๋ก ์ ์ ๋ฐ์ดํฐ ์ ๋ ฌํด์ ๋ณด๊ธฐ
select * from point_users p
inner join users u
on p.user_id = u.user_id
order by p.point desc
orders ํ ์ด๋ธ์ users ํ ์ด๋ธ ์ฐ๊ฒฐํด์ ํต๊ณ์น ๋ด๋ณด๊ธฐ
[์ฝ๋์ค๋ํซ] ๋ค์ด๋ฒ ์ด๋ฉ์ผ ์ฌ์ฉํ๋ ์ ์ ์ ์ฑ์จ๋ณ ์ฃผ๋ฌธ๊ฑด์ ์ธ์ด๋ณด๊ธฐ
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
SQL ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์: from โ join โ where โ group by โ select
1.from orders o: orders ํ ์ด๋ธ ๋ฐ์ดํฐ ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ค๊ณ o๋ผ๋ ๋ณ์นญ์ ๋ถ์ ๋๋ค.
2.inner join users u on o.user_id = u.user_id : users ํ ์ด๋ธ์ orders ํ ์ด๋ธ์ ๋ถ์ด๋๋ฐ, orders ํ ์ด๋ธ์ user_id์ ๋์ผํ user_id๋ฅผ ๊ฐ๋ users ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ ๋๋ค. (*users ํ ์ด๋ธ์ u๋ผ๋ ๋ณ์นญ์ ๋ถ์ ๋๋ค)
3.where u.email like '%naver.com': users ํ ์ด๋ธ email ํ๋๊ฐ์ด naver.com์ผ๋ก ๋๋๋ ๊ฐ๋ง ๊ฐ์ ธ์ต๋๋ค.
4.group by u.name: users ํ ์ด๋ธ์ name๊ฐ์ด ๊ฐ์ ๊ฐ๋ค์ ๋ญ์ณ์ค๋๋ค.
5.select u.name, count(u.name) as count_name : users ํ ์ด๋ธ์ nameํ๋์ name ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ญ์ณ์ง ๊ฐฏ์๋ฅผ ์ธ์ด์ ์ถ๋ ฅํด์ค๋๋ค.
โ
Join์ ์คํ ์์๋ ํญ์ from ๊ณผ ๋ถ์ด๋ค๋๋ค๊ณ ์๊ฐํ๋ฉด ํธํด์!Select๋ฅผ ๋ ๋ฒ ํ ๊ฒ ์๋๋ผ, ํ๋ฒ์ ๋ชจ์์ ๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ, ์์๊ฑธ์!
์๋ฅผ ๋ค๋ฉด ์ด๋ ๊ฒ!
๐ ๊ทผ๋ฐ, ๊ทธ๋ฌ๋ ค๋ฉด ํ ๊ฐ์ง ์กฐ๊ฑด์ด ์์ด์! ๋ ธ๋์๊ณผ ํ๋์ ๋ฐ์ค์ ํ๋๋ช ์ด ๊ฐ์์ผ ํ๋ต๋๋ค. ๐ (๋น์ฐํ๊ฒ ์ฃ ?)
Union์ ์ด์ฉํด์ ์๋์ ๊ฐ์ ๋ชจ์ต์ ๋ง๋ค์ด๋ณผ๊น์?
์ฐ์ , 'month'๋ฅผ ๋ถ์ฌ์ค์ผ๊ฒ ๋ค์!
select '7์' as month, c.title, c2.week, count(*) as cnt from checkins c2 inner join courses c on c2.course_id = c.course_id inner join orders o on o.user_id = c2.user_id where o.created_at < '2020-08-01' group by c2.course_id, c2.week order by c2.course_id, c2.week
์ฌ๊ธฐ์ ์๋ ์๋ก Union all์ ์ฌ์ฉํด ๋ถ์ฌ์ฃผ๋ฉด ๋!
( select '7์' as month, c.title, c2.week, count() as cnt from checkins c2 inner join courses c on c2.course_id = c.course_id inner join orders o on o.user_id = c2.user_id where o.created_at < '2020-08-01' group by c2.course_id, c2.week order by c2.course_id, c2.week ) union all ( select '8์' as month, c.title, c2.week, count() as cnt from checkins c2 inner join courses c on c2.course_id = c.course_id inner join orders o on o.user_id = c2.user_id where o.created_at > '2020-08-01' group by c2.course_id, c2.week order by c2.course_id, c2.week )
์, ๊ทธ๋ฐ๋ฐ, ํ ๊ฐ์ง! ์ ๋ ฌ์ด ๊นจ์ก๋ค์!? ๐
๐ ๋ค ๋ง์ต๋๋ค! union์ ์ฌ์ฉํ๋ฉด ๋ด๋ถ ์ ๋ ฌ์ด ๋จน์ง ์์์. ์ด ๋ ์ ์ฉํ ๋ฐฉ๋ฒ์ด ์์ง์. ๋ฐ๋ก, SubQuery(์๋ธ์ฟผ๋ฆฌ) !
โSubquery: ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ ์ฝ๊ฒ ์ป์ด๋ณด๊ธฐ
Subquery๋? ์ฟผ๋ฆฌ ์์ ์ฟผ๋ฆฌ๋ผ๋ ์๋ฏธ์ ๋๋ค. ํ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ๋ฉด, SQL ์ฟผ๋ฆฌ๊ฐ ํจ์ฌ ๊ฐ๋จํด์ ธ์!
์ฆ, Subquery๋ฅผ ์ฌ์ฉํ์ง ์์๋ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ป์ด๋ผ ์ ์๊ฒ ์ง๋ง, ๋ ํธํ๊ณ ๊ฐ๋จํ๊ฒ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ์ํํ ๊ธฐ๋ฅ์ ๋๋ค.
Subquery์ ๋ํ ์ดํด๋๊ฐ ์๊ธฐ๋ฉด, With๊ตฌ๋ฌธ์ ์ด์ฉํด์ ๋ ๊ฐ๋จํ๊ฒ ๋ง๋ค์ด๋ณผ๊ฒ์!
โ
Subquery ์ฌ์ฉ๋ฐฉ๋ฒ ์ตํ๋ณด๊ธฐ
kakaopay๋ก ๊ฒฐ์ ํ ์ ์ ๋ค์ ์ ๋ณด ๋ณด๊ธฐ
โ ์ฐ์ , ์ด๋ ๊ฒ ๋ณผ ์ ์๊ฒ ์ฃ ? users ์ orders ์ inner join์ผ๋ก!
select u.user_id, u.name, u.email from users u
inner join orders o on u.user_id = o.user_id
where o.payment_method = 'kakaopay'
๊ทธ๋ฐ๋ฐ, ์ด๊ฒ์ ์ด๋ ๊ฒ ํ ์๋ ์์ต๋๋ค. ์กฐ๊ธ ๋ ์ง๊ด์ ์ด์ง ์๋์?
์ฐ์ kakaopay๋ก ๊ฒฐ์ ํ user_id๋ฅผ ๋ชจ๋ ๊ตฌํด๋ณด๊ธฐ โ K ๋ผ๊ณ ํฉ์๋ค.
select user_id from orders
where payment_method = 'kakaopay'
๊ทธ ํ์, user_id๊ฐ K ์ ์๋ ์ ์ ๋ค๋ง ๊ณจ๋ผ๋ณด๊ธฐ
โ ์ด๊ฒ ๋ฐ๋ก ์๋ธ์ฟผ๋ฆฌ!
select u.user_id, u.name, u.email from users u
where u.user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)
์์ฃผ ์ฐ์ด๋ Subquery ์ ํ ์์๋ณด๊ธฐ
๐ ์์ฃผ ์ฐ๋ Subquery๋ฅผ ๋จผ์ ์์๋ณผ๊น์? Subquery๋ where, select, from ์ ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ด์!
Where ์ ๋ค์ด๊ฐ๋ Subquery
๐ Where์ ์กฐ๊ฑด๋ฌธ์ด์ฃ ? Subquery์ ๊ฒฐ๊ณผ๋ฅผ ์กฐ๊ฑด์ ํ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ ์ฉํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
where ํ๋๋ช in (subquery) ์ด๋ฐ ๋ฐฉ์์ผ๋ก์!
์๋ฅผ ๋ค๋ฉด, ์นด์นด์คํ์ด๋ก ๊ฒฐ์ ํ ์ฃผ๋ฌธ๊ฑด ์ ์ ๋ค๋ง, ์ ์ ํ ์ด๋ธ์์ ์ถ๋ ฅํด์ฃผ๊ณ ์ถ์ ๋๋ ์๋์ ๊ฐ์ด ํํํ ์ ์๊ฒ ์ฃ .
select * from users u where u.user_id in (select o.user_id from orders o where o.payment_method = 'kakaopay');
์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์๋ฅผ ์ด๋ ๊ฒ ์์ํ๋ฉด ํธํด์!
๐ (1) from ์คํ: users ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ค (2) Subquery ์คํ: ํด๋น๋๋ user_id์ ๋ช ๋จ์ ๋ฝ์์ค (3) where .. in ์ ์์ subquery์ ๊ฒฐ๊ณผ์ ํด๋น๋๋ 'user_id์ ๋ช ๋จ' ์กฐ๊ฑด์ผ๋ก ํํฐ๋ง ํด์ค (4) ์กฐ๊ฑด์ ๋ง๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ
Select ์ ๋ค์ด๊ฐ๋ Subquery
๐ Select๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ๋ถ๋ถ์ด์ฃ ? ๊ธฐ์กด ํ ์ด๋ธ์ ํจ๊ป ๋ณด๊ณ ์ถ์ ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ฝ๊ฒ ๋ถ์ด๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
select ํ๋๋ช , ํ๋๋ช , (subquery) from .. ์ด๋ ๊ฒ์!
์์ ๋ณด์๋๊ฒ์ฒ๋ผ, '์ค๋์ ๋ค์ง' ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ์ถ์๋ฐ '์ค๋์ ๋ค์ง' ์ข์์์ ์๊ฐ, ๋ณธ์ธ์ด ํ์์ ๋ฐ์๋ ์ข์์ ์์ ๋นํด ์ผ๋ง๋ ๋๊ณ ๋ฎ์์ง๊ฐ ๊ถ๊ธํ ์ ์๊ฒ ์ฃ ?
๊ทธ๋ผ, ํ๊ท ์ ๋จผ์ ๊ตฌํด๋ด ์๋ค! user_id='4b8a10e6' ๋ฅผ ์์๋ก!
select avg(likes) from checkins c2 where c2.user_id = '4b8a10e6'
๊ทธ๋ฌ๋ฉด, ์ด๋ ๊ฒ ํํํ ์ ์์ด์!
select c.checkin_id, c.user_id, c.likes, (select avg(likes) from checkins c2 where c2.user_id = c.user_id) as avg_like_user from checkins c;
์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์๋ฅผ ์ด๋ ๊ฒ ์์ํ๋ฉด ํธํด์!
๐ (1) ๋ฐ์ select * from ๋ฌธ์์ ๋ฐ์ดํฐ๋ฅผ ํ์คํ์ค ์ถ๋ ฅํ๋ ๊ณผ์ ์์ (2) select ์์ subquery๊ฐ ๋งค ๋ฐ์ดํฐ ํ์ค๋ง๋ค ์คํ๋๋๋ฐ (3) ๊ทธ ๋ฐ์ดํฐ ํ ์ค์ user_id๋ฅผ ๊ฐ๋ ๋ฐ์ดํฐ์ ํ๊ท ์ข์์ ๊ฐ์ subquery์์ ๊ณ์ฐํด์ (4) ํจ๊ป ์ถ๋ ฅํด์ค๋ค!
From ์ ๋ค์ด๊ฐ๋ Subquery (๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ ํ!)
๐ From์ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น์? ๋ด๊ฐ ๋ง๋ Select์ ์ด๋ฏธ ์๋ ํ ์ด๋ธ์ Joinํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ฉด ๋ฑ์ด๊ฒ ์ฃ !
โ
์, ์ฐ์ ์ ์ ๋ณ ์ข์์ ํ๊ท ์ ๋จผ์ ๊ตฌํด๋ณผ๊น์?
โ checkins ํ ์ด๋ธ์ user_id๋ก group by ํ๋ฉด ๋๊ฒ ์ฃ ?
select user_id, round(avg(likes),1) as avg_like from checkins group by user_id
์, ์ด์ ์ฌ๊ธฐ์ ํด๋น ์ ์ ๋ณ ํฌ์ธํธ๋ฅผ ๋ณด๊ณ ์ถ๋ค๋ฉด?
โ ๊ทธ๋ฌ๋ฉด, ํฌ์ธํธ์ like์ ์๊ด์ ๋๋ฅผ ์ ์ ์๊ฒ ์ฃ ?
select pu.user_id, a.avg_like, pu.point from point_users pu inner join ( select user_id, round(avg(likes),1) as avg_like from checkins group by user_id ) a on pu.user_id = a.user_id
์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์์๋ฅผ ์ด๋ ๊ฒ ์์ํ๋ฉด ํธํด์!
๐ (1) ๋จผ์ ์๋ธ์ฟผ๋ฆฌ์ select๊ฐ ์คํ๋๊ณ , (2) ์ด๊ฒ์ ํ ์ด๋ธ์ฒ๋ผ ์ฌ๊ธฐ๊ณ ๋ฐ์ select๊ฐ ์คํ!
โ
with ์ ๋ก ๋ ๊น๋ํ๊ฒ ์ฟผ๋ฆฌ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ
[์ฝ๋์ค๋ํซ] ์ฝ์ค์ ๋ชฉ๋ณ like ๊ฐ์, ์ ์ฒด, ๋น์จ
select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total) as ratio from ( select course_id, count(distinct(user_id)) as cnt_checkins from checkins group by course_id ) a inner join ( select course_id, count(*) as cnt_total from orders group by course_id ) b on a.course_id = b.course_id inner join courses c on a.course_id = c.course_id
๋ค์ ์์ ์ฝ๋๋ฅผ ๋ณผ๊น์?
select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total) as ratio from ( select course_id, count(distinct(user_id)) as cnt_checkins from checkins group by course_id ) a inner join ( select course_id, count(*) as cnt_total from orders group by course_id ) b on a.course_id = b.course_id inner join courses c on a.course_id = c.course_id
์ด๋ ๊ฒ ๊ณ์ ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ถ์ผ๋ฉด, inner join ์์ชฝ์ด ๋๋ฌด ํท๊ฐ๋ฆฌ๊ฒ ์ฃ !
โ ๊ทธ ๋ ์ฐ๋ ๊ฒ์ด with ์ ! ๊ฒฐ๊ณผ๋ ๊ฐ์๋ฐ ํจ์ฌ ๋ณด๊ธฐ๊ฐ ์ข์ฃ ?
๋ฌธ์์ด ๋ฐ์ดํฐ ๋ค๋ค๋ณด๊ธฐ
๐ ์ค์ ์ ๋ฌด์์๋, ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํํ๋ก ํ๋ฒ ์ ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋ฌธ์์ด ์ชผ๊ฐ๋ณด๊ธฐ
๐ ์ด๋ฉ์ผ ์ฃผ์์์ @์์ ์์ด๋๋ง ๊ฐ์ ธ์ค๊ฑฐ๋, @๋ค์ ์ด๋ฉ์ผ ๋๋ฉ์ธ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ด์!
SUBSTRING_INDEX ๋ผ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ณผ๊น์?
[์ฝ๋์ค๋ํซ] ์ด๋ฉ์ผ์์ ์์ด๋๋ง ๊ฐ์ ธ์๋ณด๊ธฐ
select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
๐ @๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ์ชผ๊ฐ๊ณ , ๊ทธ ์ค ์ฒซ ๋ฒ์งธ ์กฐ๊ฐ์ ๊ฐ์ ธ์ค๋ผ๋ ๋ป!
[์ฝ๋์ค๋ํซ] ์ด๋ฉ์ผ์์ ์ด๋ฉ์ผ ๋๋ฉ์ธ๋ง ๊ฐ์ ธ์๋ณด๊ธฐ
select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users
๐ @๋ฅผ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ์ชผ๊ฐ๊ณ , ๊ทธ ์ค ๋ง์ง๋ง ์กฐ๊ฐ์ ๊ฐ์ ธ์ค๋ผ๋ ๋ป!
๋ฌธ์์ด ์ผ๋ถ๋ง ์ถ๋ ฅํ๊ธฐ
๐ orders ํ ์ด๋ธ์์ created_at์ ๋ ์ง๊น์ง๋ง ์ถ๋ ฅํ๊ฒ ํด๋ด ์๋ค!
SUBSTRING ์ด๋ผ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฌ ๊ฐ์์ฃ !
[์ฝ๋์ค๋ํซ] orders ํ ์ด๋ธ์์ ๋ ์ง๊น์ง ์ถ๋ ฅํ๊ฒ ํด๋ณด๊ธฐ
select order_no, created_at, substring(created_at,1,10) as date from orders
SUBSTRING(๋ฌธ์์ด, ์ถ๋ ฅ์ ํ๊ณ ์ถ์ ์ฒซ ๊ธ์์ ์์น, ๋ช๊ฐ์ ๊ธ์๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ์์ง)
[์ฝ๋์ค๋ํซ] ์ผ๋ณ๋ก ๋ช ๊ฐ์ฉ ์ฃผ๋ฌธ์ด ์ผ์ด๋ฌ๋์ง ์ดํด๋ณด๊ธฐ
select substring(created_at,1,10) as date, count(*) as cnt_date from orders group by date
CASE: ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ํ๋ ๊ฐ์ ์ ํ๋์ ์ถ๋ ฅํด๋ณด๊ธฐ
๐ 10000์ ๋ณด๋ค ๋์ ํฌ์ธํธ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด '์ ํ๊ณ ์์ด์!', ํ๊ท ๋ณด๋ค ๋ฎ์ผ๋ฉด '์กฐ๊ธ ๋ ๋ฌ๋ ค์ฃผ์ธ์!' ๋ผ๊ณ ํ์ํด ์ฃผ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
[์ฝ๋์ค๋ํซ] ํฌ์ธํธ ๋ณด์ ์ก์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ํ์ํด์ฃผ๊ธฐ
select pu.point_user_id, pu.point, case when pu.point > 10000 then '์ ํ๊ณ ์์ด์!' else '์กฐ๊ธ ๋ ๋ฌ๋ ค์ฃผ์ธ์!' END as '๊ตฌ๋ถ' from point_users pu;
CASE: ์ค์ ์ ์ํ ํธ๋ฆญ!
๐ Subquery๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฐ ํต๊ณ๋ ๋ผ ์ ์์ด์!
์ฐ์ ๋ช ๊ฐ์ง๋ก ๊ตฌ๋ถ์ ๋๋๊ณ ,
select pu.point_user_id, pu.point, case when pu.point > 10000 then '1๋ง ์ด์' when pu.point > 5000 then '5์ฒ ์ด์' else '5์ฒ ๋ฏธ๋ง' END as lv from point_users pu
์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํด์ group by๋ก ํต๊ณ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
select level, count(*) as cnt from ( select pu.point_user_id, pu.point, case when pu.point > 10000 then '1๋ง ์ด์' when pu.point > 5000 then '5์ฒ ์ด์' else '5์ฒ ๋ฏธ๋ง' END as lv from point_users pu ) a group by lv
with ์ ๊ณผ ํจ๊ปํ๋ฉด ๊ธ์์ฒจํ์ฃ !