์ด๋ฒ ํฌ์คํ ์์๋ ์ฝ๋ฉ ํ ์คํธ๋ฅผ ์ค๋นํ๊ณ ๊ณ์ ๋ถ๋ค์ ์ํด
ํ์๊ฐ ์ง์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๊ณ ๋์ ์ฌ์ฉํ SQL ๋ฌธ๋ฒ์ ์์ฃผ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
์ฐธ๊ณ ๋ก ํ์๋ SQL ๊ณ ๋์ Kit์ ์ด์ฉํด SQL ๋ฌธ์ ๋ฅผ ํ์๋ค.
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit
1. Select
sql์์ select๋ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ ์ ์๊ฒ ํด ์ค๋ค.
์ฝ๋ฉ ํ ์คํธ ๋ฌธ์ ๋ค์ ๊ฑฐ์ ๋๋ถ๋ถ select๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋๋ก ๋ง๋ค๊ธฐ์ ๋ฐฐ์ฐ๋ ๋ฐ์ ํฐ ์ด๋ ค์์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
select๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง(from) ์ด๋ค ์กฐ๊ฑด์ ๊ฑธ ๊ฒ์ธ์ง๋ ์ค์ ํ ์ ์๋ค(where)
์๋์ SQL ์ฝ๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ Select ์ฌ์ฉ ๋ฐฉ๋ฒ์ด๋ค.
SELECT column(๋๋ *)
FROM table
WHERE ์กฐ๊ฑด
1์ด์์ select๋ฅผ ์ฌ์ฉํ ๋, ๋ณํ(*)๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋น table์ ๋ชจ๋ column์ ๊ฒ์ํ ์ ์๋ค.
2. Sum, Max, Min
sum, max, min์ ์์๋๋ก ์ญํ ์ ์ค๋ช ํ์๋ฉด, ํฉ, ์ต๋๊ฐ, ์ต์๊ฐ์ ๊ตฌํ ์ ์๋ ์ง๊ณํจ์๋ค์ด๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค. ํจ์์ ๊ดํธ ์์ ์์ ์ด ์ํ๋ column์ ์ด๋ฆ์ ๋ฃ์ด ์ฃผ๋ฉด ๋๋ค.
SUM(column)
MAN(column)
MIN(column)
select ๋ฌธ๊ณผ ํฉ๊ณ ๋ค์๊ณผ ๊ฐ์ด ํ์ฉํ ์ ์๋ค.
ํน์ ์ด์ ํฉ๊ณ๋ฅผ ๋ถ๋ฌ์ค๋ sql๋ฌธ์ด๋ค.
SELECT SUM(column)
FROM table
์์ ์ง๊ณ ํจ์ 3๊ฐ ๋ง๊ณ ๋ ๋ค๋ฅธ ์ข ์ข ๋์ค๋ ์ง๊ณ ํจ์๋ค๋ ์๋ค. ์์๋์ผ๋ฉด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค.
- AVG(column): ํด๋น column์ ๋ฐ์ดํฐ๋ค์ ํ๊ท
- COUNT(column): ํด๋น column์ ๊ฐ์
3. Group By
Group by๋ ๊ฐ์ ๊ฐ์ ๊ฐ์ง column๋ค์ ๊ทธ๋ฃน ์ง์ด ์ฃผ๋ ์ญํ ์ ํ๋ ๋ช ๋ น์ด์ด๋ค.
๊ฐ๋จํ๊ฒ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ค๋ช ํ์๋ฉด SELECT๋ฌธ์ WHERE ๋ค์์ Group by๋ฅผ ์ฌ์ฉํด ์ฃผ๋ฉด ๋๋ค.
SELECT a.column, sum(b.column)
FROM table a, table b
WHERE ์กฐ๊ฑด
GROUP BY ๊ทธ๋ฃนํํ column
HAVING group by ์กฐ๊ฑด
group by๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ง๊ณ ํจ์๋ฅผ ํ์๋ก ์ฌ์ฉํด์ผ ํ๋ค.(๊ทธ๋์ผ ๋ฐ์ดํฐ๋ผ๋ฆฌ ๋ฌถ์ด์ ๊ทธ๋ฃนํ๋ฅผ ํ๋๊น)
์์ ๋ช ๋ น ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด group by ๋ค์ ์ค์ having์ ์ฌ์ฉํด ์ค ๋ชจ์ต์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
having์ ๊ทธ๋ฃนํ๋ฅผ ํ๊ธฐ ์ ์ ์ ์ฉํ ์กฐ๊ฑด์ ์์ฑํ๋ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ฉด where ๋ฌธ๊ณผ ๋ค๋ฅธ ์ ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํ ์ ์๋ค.
๊ฐ๋จํ๊ฒ ๋งํ์๋ฉด ์คํ ์์ ์ฐจ์ด์ด๋ค.
having์ group by๊ฐ ์ํ๋๊ธฐ ์ ์ ์คํ๋๊ณ , where์ group by๊ฐ ๋ชจ๋ ์๋ฃ๋ ํ์ ์ํ๋๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
๋ง๋ก ํ๋ฉด ์ดํด๊ฐ ์ด๋ ค์ธ ์ ์๊ธฐ์ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ํ๋๋ฅผ ์๋ก ๋ค์ด์ ์ค๋ช ํด ์ฃผ๊ฒ ๋ค.
๋ค์๊ณผ ๊ฐ์ 2๊ฐ์ table์ด ์์ ๋
FLAVOR์ ์ด์ฉํด INGREDIENT_TYPE(์ฃผ ์ฑ๋ถ)์ด ๋ค์ด๊ฐ ์์ด์คํฌ๋ฆผ์ ์ด์ฃผ๋ฌธ๋์ ๊ตฌํด์ผ ํ ๋๋ฅผ ์๋ก ๋ค์๋ฉด
์์ ๋ฌธ์ ์์ ์ ๋ต์ ๊ตฌํ๋ ค๋ฉด JOIN์ ์ฌ์ฉํด์ผ ํ๋ค.
ํ์ง๋ง JOIN์ ๋์ค์ ์ค๋ช ํด ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์ JOIN์ด ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ณธ๋ค๋ฉด
INGREDIENT_TYPE์ ํด๋น๋๋ ๋ฐ์ดํฐ๋ค ์ค TOTAL_ORDER์ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ ๊ฒ์ด๋ค.
fruit_based์ sugar_based์ ํด๋น๋๋ TOTAL_ORDER์ ๊ฐ์ ๋ชจ๋ ๋ํ ๊ฐ์ ๋ณด์ฌ์ฃผ๊ณ ์๋ค.
์ฐธ๊ณ ๋ก ๋งํ์๋ฉด ์์ ์ฌ์ง์ด ํด๋น ๋ฌธ์ ์ ์ ๋ต์ด ์๋๋ค!
Group by๋ฅผ ์ดํดํ๊ณ ๋์ ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉด ์์ฃผ ์ฌ์ธ ๊ฒ์ด๋ค.
๋ฌธ์ ๋งํฌ: https://school.programmers.co.kr/learn/courses/30/lessons/133026
4. is Null
๋ค์์ผ๋ก ์์๋ณผ ๋ถ๋ถ์ ํน์ ๋ฐ์ดํฐ๊ฐ NULL์ผ ๋์ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ช ๋ น์ด์ ๋ํด ๊ฐ๋จํ ์์๋ณด์.
์ฒซ ๋ฒ์งธ๋ IFNULL๋ก IFNULL์ ์ค์ ํ column์ด null์ผ ๋, ๋์ฒด ํ ์คํธ๋ฅผ ์ค์ ํ ์ ์๋ค.
IFNULL(column, 'text')
null์ด ๋ฐ์ํ ์ ์๋ column์ ๋ฃ์ด์ค ํ, ํด๋น column์ null์ด ๋ฐ์ํ๋ฉด, ์ค์ ํ text๋ก ๋์ ๋ฐ๋์ด์ ์ถ๋ ฅ๋๋ ๋ฐฉ์์ด๋ค.
๋ ๋ฒ์งธ๋ is (not) null ๋ช ๋ น์ด์ธ๋ฐ, ๋์ฒด๋ก ์กฐ๊ฑด์์ ์ฌ์ฉ๋๋ ๋ช ๋ น์ด์ด๋ค.
์กฐ๊ฑด์์ ์กฐ๊ฑด์ column์ด null์ด๊ฑฐ๋ null์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ์์ ์์ ์ฌ์ฉํ ์ ์๋ค.
WHERE ์กฐ๊ฑด is (not) null
์กฐ๊ฑด์์ ์กฐ๊ฑด ๋ฐ์ดํฐ๊ฐ null(not null)์ธ์ง ํ์ธํด ์ฃผ๋ ๋ช ๋ น์ด๋ผ๊ณ ๋ณด๋ฉด ๋๊ฒ ๋ค.
5. Join
Join์ ์ฝ๋ฉ ํ ์คํธ์์ ์์ฃผ ๋์ค๋ ์ ํ์ผ๋ก, join์ ํ์คํ ์์๋์ด์ผ ์ฝํ ๋ฅผ ๋ณผ ๋ ํธํ ๊ฒ์ด๋ค ;)
Join์ ํ ์ด๋ธ 2๊ฐ๋ฅผ ํ๋์ ํ ์ด๋ธ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ช ๋ น์ด๋ก ์ข ๋ฅ๊ฐ ๋ค์ํ๋ค.
Inner Join, Left / Right Join, Full Join์ด ์๋ค. Join์ ๋ํ์ฌ ์ค๋ช ํ๋ ๋ธ๋ก๊ทธ๋ค์ ๋ณด๋ฉด ํ์๊ฐ ์์ฑํ ๊ฒ๊ณผ๋ ๋ฌ๋ฆฌ join์
left outer join์ ๊ฐ์ outer ํค์๋๋ฅผ ๋ถ์ฌ์ ์ค๋ช ํ๋ ๋ธ๋ก๊ทธ๋ค์ ์ข ์ข ๋ด์์ ๊ฒ์ด๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด outer ํค์๋๋ฅผ ์ฐ๋ ์ ์ฐ๋ ๊ฒฐ๊ณผ๋ ๋๊ฐ๋ค.
outer ํค์๋๋ SQL์ ์์ฑํ๋ ๊ฐ๋ฐ์๋ค์ด ๋ณด๊ธฐ ํธํ๊ฒ ํด์ฃผ๋ ํค์๋์ด๋ฏ๋ก ์๋ตํด๋ ์๊ด์๋ค.
๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์์ Join์ ์งํฉ๊ณผ ๋น์ทํ ๊ฐ๋ ์ธ๋ฐ, ๋ค์์ ์ฌ์ง์ ์ฐธ๊ณ ํด์ ์ดํดํด ๋ณด์.
Join์ ๋ฌด์์ ์ฐ๋์ ๋ฐ๋ผ์ ๋์ค๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ๊ฒ์ด๋ค.
๊ธฐ๋ณธ์ ์ธ Join ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT a.column, b.column
FROM tabl1 a JOIN table2 b ON a.column = b.column
WHERE ์กฐ๊ฑด
JOIN ํค์๋ ๋ค์ ON ํค์๋๋ Join์ ์กฐ๊ฑด์ ์ค์ ํ ์ ์๋ ๋ช ๋ น์ด์ด๋ค.
์์ ์ฝ๋๋ ๊ธฐ๋ณธ์ ์ธ Inner Join์ ์ฌ์ฉ๋ฒ๋ง ๋ค๋ฃจ์๋ค.
๋๋จธ์ง Join์ ์์ ์ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค.
Left / Right Join์ ์ด์ฉํ๋ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ ๋งํฌ๋ ๊ณต์ ํด ์ฃผ๊ฒ ๋ค.
https://school.programmers.co.kr/learn/courses/30/lessons/59042
5. String, Date
๋ง์ง๋ง์ผ๋ก String๊ณผ Dateํ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฐ๋จํ ์์๋ณด๊ฒ ๋ค.
Date๋ฅผ ํ๊ธฐ ์ ์ String๋ถํฐ ์ดํด๋ณด๋ฉด String์ ํ์ฉํด์ผ ํ๋ ๋ฌธ์ ๋ค์ String์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํด์ผ ํ๋ ์ํฉ์ด ๋ง์ ๊ฒ ๊ฐ๋ค.(์: 2023-11-03, 2022-10-02์ ๋ฐ์ดํฐ ์ค 11์์ธ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ๊ธฐ)
๋ฌธ์์ด์ ๊ฒ์ํ๊ธฐ ์ํด์ SQL์์ Like ํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
like ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
column LIKE '์กฐ๊ฑด string'
column ๋ฐ์ดํฐ์์ ์กฐ๊ฑด string์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ช ๋ น์ด์ด๋ค. like๊ฐ ๋จผ์ ์ค๋ ๊ฒ ์๋๋ฏ๋ก ์์๋ฅผ ํท๊ฐ๋ฆฌ๋ ์ผ์ด ์๋๋ก ํ์!
์กฐ๊ฑด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ธฐํธ๋ค์ ์ฌ์ฉํด์ ๋ฌธ์์ด์ ๊ฒ์ํ ์ ์๋ค.
- %: ์์์ ๊ธธ์ด์ ๋ฌธ์์ด์ ๊ฐ์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.(%12%: ๋ฌธ์์ด ์ค 12๊ฐ ์์ผ๋ฉด ์ถ๋ ฅ, %12: '๋ผ๋ฉด'์ด๋ผ๋ ๋ฌธ์์ด์ด ๋ฐ์ดํฐ ๋ฌธ์์ด์ ๋งจ ๋ค์ ์์ผ๋ฉด ์ถ๋ ฅ)
- _(๋ฐฑ์ฌ๋์): ํ ๊ฐ์ ๋ฌธ์๊ฐ ์์์ ๊ฐ์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ค.(_11: ํ ๊ธ์ ๋ค์ 11์ด ์์ผ๋ฉด ์ถ๋ ฅ, n๋ฒ์จฐ ๊ธ์์ 11์ ์ถ๋ ฅํ๊ณ ์ ํ๋ค๋ฉด '_'์ n๊ฐ ์์ฑ ํ 11์ ์์ฑํ๋ค.)
๋ค์์ผ๋ก๋ ๋ ์ง ๋ฐ์ดํฐ์ ๊ดํ ๋ช ๋ น์ด์ ๋ํด ์์๋ณผ ๊ฒ์ด๋ค.
๋ ์ง ๋ฐ์ดํฐ๋ฅผ ํ์ฉํด์ผ ํ ๋ฌธ์ ๋ค๋ ํน์ ๋ ์ง ํ์์ผ๋ก ์ถ๋ ฅ๋๋๋ก ์ค์ ํด์ผ ํ๋ ์ํฉ์ด ๋ง์ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฌ๋ฉด DATE_FORMAT ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ๋ณด์.
DATE_FORMAT ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
DATE_FORMAT(date string, '๋ ์ง ํ์')
date string์ ์์ ์ด ์ค์ ํ ๋ ์ง ํ์์ผ๋ก ๋ฐ๊ฟ์ค ์ ์๋ค.
๋ ์ง ํ์์ผ๋ก ์ฌ์ฉํ๋ ๋ฌธ์๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- %Y: ์ฐ๋ 4์๋ฆฌ
- %y: ์ฐ๋ 2์๋ฆฌ
- %M: ๊ธด ์(์์ด, ์: July)
- %b: ์งง์ ์(์์ด, ์: Jul)
- %W: ๊ธด ์์ผ ์ด๋ฆ(์์ด, ์: Monday)
- %a: ์งง์ ์์ผ ์ด๋ฆ(์์ด, ์: Mon)
- %i: ๋ถ
- %T: hh:mm:SS
- %m: ์ซ์ ์(๋ ์๋ฆฌ)
- %c: ์ซ์ ์(ํ ์๋ฆฌ)
- %d: ์ผ์(๋ ์๋ฆฌ)
- %e: ์ผ์(ํ ์๋ฆฌ)
- %I: ์๊ฐ(12์๊ฐ)
- %H: ์๊ฐ(24์๊ฐ)
- %r: hh:mm:ss AM,PM
- %s: ์ด
์์ ๋ฌธ์๋ค์ ์ ์ ํ ํ์ฉํด์ ๋ ์ง ํ์์ ๋ง๋ค์ด ๋ณด์.
์ ๋ฆฌ
- ๊ณง ์ฝํ ๋ฅผ ๋ณด์๋ ๋ถ๋ค์ ์ํด์ ์ด ํฌ์คํ ์ด ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
- ํ์๋ ๊ฑฐ์ 1๋ ๊ฐ ์๋ ์ ๋๋ SQL์ ํ์ด๋ด์ ์ ์ ํ๋ค(?).
- SQL ๋ฌธ์ ๋ ๋ช ๋ น์ด์ ์ญํ ์ ์ดํดํ๊ณ ์๊ธฐํด์ ํ์ด์ผ ํ๋ ๋ฏํ๋ค.
์ฐธ๊ณ ํ ๊ธ
date format: https://devjhs.tistory.com/89
group by: https://velog.io/@dntjd7701/SQL-GROUP-BY#group-by%EB%9E%80
์ฝ๋ฉํ ์คํธ SQL ๋ชจ์: https://velog.io/@ekfvnddl99/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-SQL-%EC%B4%9D%EC%A0%95%EB%A6%AC#%EF%B8%8F-11-%EC%A4%91%EB%B3%B5-%EC%A0%9C%EA%B1%B0
like ๋ฌธ์์ด ๊ฒ์: https://lcs1245.tistory.com/entry/SQL-LIKE-%EC%97%B0%EC%82%B0%EC%9E%90-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%B6%80%EB%B6%84%EC%9D%BC%EC%B9%98-%EA%B2%80%EC%83%89