[์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ] ๐ข์์ ๋ณด๋ค ์ฌ์ด SQL - 2์ฃผ์ฐจ
ใ ์คํ๋ฅดํ์ฝ๋ฉํด๋ฝ SQL โ1์ฃผ์ฐจโ ใ
[ SQL์์ ์ฟผ๋ฆฌ๋ฌธ์ ์คํ ์์ ]
1. FROM table
2. WHERE selectcriteria
3. GROUP BY groupfieldlist
4. SELECT fieldlist
5. HAVING groupcriteria
5. ORDER BY field
[ GROUP BY ์ ๊ณผ ORDER BY ์ ]
์ฟผ๋ฆฌ๋ฌธ | ๊ตฌ์ฑ ์์ | ๊ธฐ๋ฅ |
GROUP BY | groupfieldlist - ํ๋ ์ด๋ฆ ๋ณ์นญ, SQL ์ง๊ณ ํจ์, ์ ํ ์กฐ๊ฑด์, ๊ธฐํ SELECT ๋ฌธ ์ต์ ์ ์ฌ์ฉํ์ฌ ๊ฒ์ํ ํ๋ ์ด์์ ํ๋ ์ด๋ฆ |
์ง์ ํ ํ๋ ๋ชฉ๋ก์ ๊ฐ์ด ๋์ผํ ๋ ์ฝ๋๋ฅผ ๋จ์ผ ๋ ์ฝ๋๋ก ๊ฒฐํฉ (๋์ผํ ๋ฒ์ฃผ๋ฅผ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํ ํ์ฌ ๋ฒ์ฃผ๋ณ ํต๊ณ ๋์ถ) |
ORDER BY | field1 [ASC | DESC ][, field2 [ASC | DESC ]][, ...]] - ๋ ์ฝ๋๋ฅผ ์ ๋ ฌํ ํ๋์ ์ด๋ฆ |
์ง์ ๋ ํ๋์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ๋ ์ฝ๋๋ฅผ ์ค๋ฆ์ฐจ์ ๋๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ [๊ธฐ๋ณธ๊ฐ : ์ค๋ฆ์ฐจ์] |
[ GROUP BY ์ฟผ๋ฆฌ๋ฌธ ์์ ]
โ ์ ์ ์ ๋ณด ํ ์ด๋ธ์์ ๊ฐ ์ฑ์จ๋ณ ํต๊ณ ๊ตฌํ๊ธฐ
select name, count(*) from users
group by name
โก ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ์ข์์์ ํต๊ณ ๊ตฌํ๊ธฐ - 1
# ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ์ข์์์ ์ต์๊ฐ ๊ตฌํ๊ธฐ : min() ํจ์ ์ฌ์ฉ
select week, min(likes) from checkins
group by week
# ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ์ข์์์ ์ต๋๊ฐ ๊ตฌํ๊ธฐ : max() ํจ์ ์ฌ์ฉ
select week, max(likes) from checkins
group by week
โข ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ์ข์์์ ํต๊ณ ๊ตฌํ๊ธฐ - 2
# ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ์ข์์์ ํ๊ท ๊ฐ ๊ตฌํ๊ธฐ : avg(), round()
select week, round(avg(likes), 2) from checkins
group by week
# ์ฃผ์ฐจ๋ณ '์ค๋์ ๋ค์ง' ์ข์์์ ํฉ๊ณ ๊ตฌํ๊ธฐ : sum()
select week, sum(likes) from checkins
group by week
[ ORDER BY ์ฟผ๋ฆฌ๋ฌธ ์์ ]
โ ์ ์ ์ ๋ณด ํ ์ด๋ธ์์ ๊ฐ ์ฑ์จ๋ณ ํต๊ณ ํ์ธ(๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ)
# ์ ๋ ฌ ํ๊ณ ์ ํ ๋ order by ๋ฌธ์ ์ฌ์ฉ ํ๋ค!
# [default: ์ค๋ฆ์ฐจ์] desc ๊ตฌ๋ฌธ ์ถ๊ฐ์ ๋ด๋ฆผ์ฐจ์
select name, count(*) from users
group by name
order by count(*) desc
โก ์ฃผ๋ฌธ์ ์ ๋ณด ํ ์ด๋ธ์์ ์ฑ๊ฐ๋ฐ ์ข ํฉ๋ฐ์ ๊ฒฐ์ ์๋จ๋ณ ์ฃผ๋ฌธ๊ฑด์ ์ธ์ด๋ณด๊ธฐ
select payment_method, count(*) from orders
where course_title = '์ฑ๊ฐ๋ฐ ์ข
ํฉ๋ฐ'
group by payment_method
order by count(*)
โข ์ ์ ์ ๋ณด ํ ์ด๋ธ์์ Gmail์ ์ฌ์ฉํ๋ ์ฑ์จ๋ณ ํ์ ์ ์ธ์ด๋ณด๊ธฐ
select name, count(*) from users
where email like '%gmail.com'
group by name
order by count(*) desc
โฃ checkins ํ ์ด๋ธ์์ course_id ๋ณ '์ค๋์ ๋ค์ง'์ ๋ฌ๋ฆฐ ํ๊ท like ๊ฐฏ์ ๊ตฌํ๊ธฐ
select course_id, round(avg(likes), 1) from checkins
group by course_id
[ SQL ์์์ ALIAS(๋ณ์นญ) ์ฌ์ฉ๋ฒ ]
- ๋์ผํ ํ๋๋ช ์ ๊ฐ์ง ๋ค๋ฅธ ํ ์ด๋ธ์ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ ํ๋ ์์ ์๊ฐ ๋ช ํํ์ง ์์ SQL๋ฌธ ์์ฒด์ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ
- Ex) orders ํ ์ด๋ธ์ 'created_at' ํ๋์ users ํ ์ด๋ธ์ 'created_at' ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌ๋ฌธ์ผ๋ก ํจ๊ป ์์ฑ ์ ๋์ผํ ํ๋๋ช ์ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ํผ๋ / SQL๋ฌธ ์์ฒด์ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ
- ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ณ ํ๋์ ์์ ์ฃผ๊ฐ ๋๊ตฌ์ธ์ง ๋ช ํํ๊ฒ ์ธ์ํ ์ ์๊ฒ ๋ณ์นญ(ALIAS) ์ฌ์ฉ
[ ํ์ ]
# ALIAS ์ฌ์ฉ ํ์ 1
SELECT ๋ณ์นญ.ํ๋ , ๋ณ์นญ.ํ๋2, ๋ณ์นญ.ํ๋3
FROM ํ
์ด๋ธ AS ๋ณ์นญ
# ALIAS ์ฌ์ฉ ํ์ 2
SELECT ๋ณ์นญ.ํ๋ , ๋ณ์นญ.ํ๋2, ๋ณ์นญ.ํ๋3
FROM ํ
์ด๋ธ ๋ณ์นญ # AS๋ผ๋ ๋ช
๋ น์ด๋ฅผ ํตํด ์ง์ ํ์ง๋ง ์๋ตํ๊ณ ๋์ด์ฐ๊ธฐ๋ง์ผ๋ก๋ ์ง์ ๊ฐ๋ฅ
โ Alias ์ฌ์ฉ ์์ - 1
select o.payment_method, count(*) as 'ํ๊ท '
from orders o
where o.course_title = '์ฑ๊ฐ๋ฐ ์ข
ํฉ๋ฐ'
group by o.payment_method
โก Alias ์ฌ์ฉ ์์ - 2
# ๋ค์ด๋ฒ ์ด๋ฉ์ผ์ ์ฌ์ฉํ์ฌ ์ฑ๊ฐ๋ฐ ์ข
ํฉ๋ฐ์ ์ ์ฒญํ ์ฃผ๋ฌธ์ ๊ฒฐ์ ์๋จ๋ณ ์ฃผ๋ฌธ๊ฑด์ ์ถ๋ ฅ
select o.course_title as ์ฝ์ค, o.payment_method, count(*)
from orders o
where o.email like '%naver.com' and o.course_title = '์ฑ๊ฐ๋ฐ ์ข
ํฉ๋ฐ'
group by o.payment_method
[ ๐ 2์ฃผ์ฐจ ์๊ฐ ]
๋ถ๋ช 2์ฃผ์ฐจ ๊ฐ์ ๋ด์ฉ ๋ํ ๊ธฐ์กด ํ๊ต ๊ต์ก๊ณผ์ ์์ ๋ฐฐ์ด ๋ถ๋ถ์ด์ง๋ง
๋น์ฐํ๊ฒ๋ ์๊ณ ๋๊ฒ ๋ฐฐ์ฐ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ ์ ๋ํ ์ดํด๊ฐ ๋์ง ์์ ์ํ์์
์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๊ธฐ์ ๋ง์น ์ฒ์(?) ๋ฐฐ์ฐ๋ ๋๋์ผ๋ก ๋ค์ ๊ณต๋ถํ ๊ฒ ๊ฐ๋คใ ใ ใ
์์ง๊น์ง๋ ์ง๋ ์ด๋ฐ์ด๋ผ ํฐ ์ด๋ ค์ ์์ด ๋น์ ๊ณต์๋ ์ถฉ๋ถํ ๋ฐ๋ผ์ฌ๋งํ ์์ ๋์ด๋ ์ธ ๊ฒ ๊ฐ๋ค!