ํด๋น ๊ธ์ Programmers ์ฝ๋ฉํ ์คํธ ์ฐ์ต์ ํ ๋๋ก MYSQL ๋ก ์์ฑ๋์์ต๋๋ค.
Q ๋ฌธ์ : ์ ์ ์๊ฐ ๊ตฌํ๊ธฐ (2)
A ๋ฌธ์ ํ์ด :
WITH RECURSIVE
NEWTABLE AS
( SELECT 0 AS HOUR
UNION ALL
SELECT HOUR + 1
FROM NEWTABLE
WHERE HOUR < 23 )
SELECT NEWTABLE.HOUR, COUNT(ani.ANIMAL_ID) AS COUNT
FROM NEWTABLE
LEFT JOIN ANIMAL_OUTS AS ani
ON NEWTABLE.hour = HOUR(ani.DATETIME)
GROUP BY NEWTABLE.hour
ํด๋น๋ฌธ์ ๋ CTE(๊ณตํตํ ์ด๋ธ)์์ ์ฌ์ฉํ๋ ์ฌ๊ท์ฟผ๋ฆฌ (Recursive Query)๊ฐ ์ฌ์ฉ๋์์ผ๋ฉฐ ์ ์ฝ๋๋
์๋ ๋งํฌ๋๊ธ์ ์ธ์ฉํ์ฌ ์ ๋ฆฌํด๋ณด์์ต๋๋ค. โผ ์๋ ๋งํฌ
E ์์ธ์ค๋ช :
1. WITH RECURSIVE ๋ฅผ ์ด์ฉํ์ฌ 01์์์ 23์๊น์ง ์กด์ฌํ๋ HOUR์ปฌ๋ผ ํ ์ด๋ธ์ ์์ฑํด์ค๋๋ค.
2. ๊ธฐ๋ณธ ANIMAL_OUTS ํ ์ด๋ธ๊ณผ LEFT JOIN(์กฐ์ธ)์ ํด์ค๋๋ค.
3. GROUP BY SQL๋ฌธ์ ์ด์ฉํ์ฌ HOUR(์๊ฐ)์ ๊ทธ๋ฃนํ๋ฅผ ํด์ค๋๋ค.
4. SELECT๋ฅผ ์ด์ฉํ์ฌ ์๊ฐ๋์ ์๊ฐ๋๋ณ ์ ์๋ ๊ฐ์๋ฅผ ํ์ ํฉ๋๋ค.
RECURSIVE QUERY(์ฌ๊ท์ฟผ๋ฆฌ) :
์ SQL๋ฌธ์ ์์ฑ๋ RECURSIVE(์ฌ๊ท)๋ ์์ด๋ก๋ ๋ฐ๋ณต[๋ํ์ด]๋๋ ๋ป์ผ๋ก ์ด๋ฌํ SQL๋ฌธ์ RECURSIVE FUNCTION(์ฌ๊ทํจ์)๊ฐ ์ฌ์ฉ๋์๋ค๊ณ ํฉ๋๋ค. ์ฌ๊ทํจ์๋ฅผ ์กฐ๊ธ ๋ ์ค๋ช ํด๋ณด์๋ฉด ์๊ธฐ ์์ ์ ํธ์ถํ์ฌ ์ด์ฉํ๋ ํจ์์ ๋๋ค.
WITH RECURSIVE
CTE_ํ
์ด๋ธ๋ช
AS
(SELECT ๋ฌธ
)
SELECT ๋ฌธ
FROM ํ
์ด๋ธ๋ช
1
LEFT JOIN ํ
์ด๋ธ๋ช
2
ON ํ
์ด๋ธ1.๊ธฐ์ค์ปฌ๋ผ = ํ
์ด๋ธ2.๊ธฐ์ค์ปฌ๋ผ
GROUP BY ๊ทธ๋ฃน๊ธฐ์ค ์ปฌ๋ผ โ
CTE :
CTE(Common Table Exprssions)๋ ์ฐ๋ฆฌ๋๋ผ๋ก ํ์ด์ฐ์๋ฉด ๊ณตํต ํ ์ด๋ธ ์์ด๋ผ๊ณ ํฉ๋๋ค.
CTE๊ฐ SQL์๋ฒ์์ ์ฌ์ฉ๋ ๋๋ ์ฃผ๋ก ๋ณต์กํ ์กฐ์ธ๋ฌธ, ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ํํ๊ธฐ์ํด ์ฌ์ฉ๋๋ฉฐ
๊ทธ๋ฆฌ๊ณ ๊ณ์ธต์ ๋ฐ์ดํฐ๋ฅผ ํํํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
LEFT JOIN (LEFT OUTER JOIN) :
์ผ์ชฝ์ธ๋ถ์กฐ์ธ์ด๋ผ๋ ๋งํ๋ฉฐ
์ผ์ชฝํ ์ด๋ธ ์ ์ฒด๊ฐ๊ณผ ์ผ์ชฝํ ์ด๋ธ๊ณผ ์ค์ฒฉ๋๋ ์ค๋ฅธ์ชฝํ ์ด๋ธ์ ๊ฐ๋ค์ ๋ฐํํฉ๋๋ค.
'ํ์ ๊ด๊ณ ์ธ > ๊ฐ์ข ๊ฟํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MYSQL ์ฝ๋ฉํ ์คํธ์ฐ์ต: NULL ์ฒ๋ฆฌํ๊ธฐ (0) | 2021.01.14 |
---|---|
MYSQL ์ฝ๋ฉํ ์คํธ์ฐ์ต: ์ด๋ฆ์ด ์๋ ๋๋ฌผ์ ์์ด๋ (0) | 2021.01.14 |
MYSQL ์ฝ๋ฉํ ์คํธ์ฐ์ต: ์ ์ ์๊ฐ ๊ตฌํ๊ธฐ (1) (0) | 2021.01.11 |
MYSQL ์ฝ๋ฉํ ์คํธ์ฐ์ต: ๋๋ช ๋๋ฌผ์ ์ฐพ๊ธฐ (GROUP BY, HAVING) (0) | 2021.01.11 |
MYSQL ์ฝ๋ฉํ ์คํธ์ฐ์ต: ์์ N๊ฐ ๋ ์ฝ๋ ์ถ๋ ฅํ๊ธฐ ( LIMIT ) (0) | 2021.01.10 |