ANIMAL_OUTS
ํ ์ด๋ธ์ ๋๋ฌผ ๋ณดํธ์์์ ์ ์ ๋ณด๋ธ ๋๋ฌผ์ ์ ๋ณด๋ฅผ ๋ด์ ํ ์ด๋ธ์ ๋๋ค.ANIMAL_OUTS
ํ ์ด๋ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ,ANIMAL_ID
,ANIMAL_TYPE
,DATETIME
,NAME
,SEX_UPON_OUTCOME
๋ ๊ฐ๊ฐ ๋๋ฌผ์ ์์ด๋, ์๋ฌผ ์ข , ์ ์์ผ, ์ด๋ฆ, ์ฑ๋ณ ๋ฐ ์ค์ฑํ ์ฌ๋ถ๋ฅผ ๋ํ๋ ๋๋ค.
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEXUPONOUTCOME | VARCHAR(N) | FALSE |
๋ณดํธ์์์๋ ๋ช ์์ ์ ์์ด ๊ฐ์ฅ ํ๋ฐํ๊ฒ ์ผ์ด๋๋์ง ์์๋ณด๋ ค ํฉ๋๋ค. 0์๋ถํฐ 23์๊น์ง, ๊ฐ ์๊ฐ๋๋ณ๋ก ์ ์์ด ๋ช ๊ฑด์ด๋ ๋ฐ์ํ๋์ง ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๊ฒฐ๊ณผ๋ ์๊ฐ๋ ์์ผ๋ก ์ ๋ ฌํด์ผ ํฉ๋๋ค.
WITH RECURSIVE hour AS (
SELECT 0 AS h
UNION ALL
SELECT h+1 FROM hour WHERE h<23
)
SELECT hour.h AS hour, COUNT(hour(a.DATETIME)) AS count FROM hour
LEFT JOIN ANIMAL_OUTS AS a ON hour.h = hour(a.DATETIME)
GROUP BY hour
ORDER BY hour;
๋์ ํ {0์, 1์, โฆ 23์}๋ฅผ ์๋ก์ด ์ปฌ๋ผ์ผ๋ก ๋นผ๋ด๋ ๋ฐฉ๋ฒ์ด ๋ ์ค๋ฅด์ง ์์๋ค.
ํ๋ก๊ทธ๋๋จธ์ค SQL ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ๊ตฌ๊ธ๋ง์ ํ ๊ฑด ์ฒ์์ด์๋ค.
WITH RECURSIVE
๊ตฌ๋ฌธ ์์ฒด๊ฐ ์ด๋ฉด์ด์๊ธฐ์ ๋ธ๋ก๊ทธ์ ํ์ด๋ฅผ ๋ณด๊ณ ๋ ํ์ฐธ ์๊ฐํด์ผ ํ๋ค.
ํ์ด๋ฅผ ํตํด ์ต์ง๋ก ์ดํด๋ฅผ ํด๋ด๊ธด ํ์ง๋ง ๋ ์ ํํ ์ดํดํ๊ธฐ ์ํด MySQL ๊ณต์๋ฌธ์๋ฅผ ํ์ธํ๋ค.
๊ณตํต ํ
์ด๋ธ ํํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ WITH
๊ตฌ๋ฌธ์ ๋ค๋ฅธ ๋ช
๋ น๋ฌธ์์ ์ฐธ์กฐํ ์ ์๋ ์์ ๊ฒฐ๊ณผ ์งํฉ์ด๋ค.
๋ค๋ฅธ ๋ช
๋ น๋ฌธ์์ ์ฐธ์กฐํ ์ ์๋ฏ์ด ๋ค๋ฅธ WITH
๋ฌธ์์๋ ๊ฒฐ๊ณผ ์งํฉ์ ์ฐธ์กฐํด ์ฌ์ฉํ ์ ์๋ค.
์ฌ๊ท CTE๋ผ๊ณ ๋ถ๋ฆฌ๋ WITH RECURSIVE
๊ตฌ๋ฌธ์ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑ๋๋ ํ ์งํฉ์ด๋ค.
๋น์ฌ๊ท CTE์ ์ฐจ์ด์ ์ผ๋ก๋ ๋ค์ ๋๋ฒ์งธ SELECT์์ cte_name
์ ์ฐธ์กฐํ๋์ง ์ฌ๋ถ๋ผ๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
WITH RECURSIVE cte_name AS
(
SELECT ... <-- specifies initial set
UNION ALL
SELECT ... <-- specifies how to derive new rows
)
์ฒซ๋ฒ์งธ SELECT
์์๋ ๋ฐ๋ณตํ ํ์ ์ด๊ธฐํํ๊ณ ๋๋ฒ์งธ SELECT
์์๋ ํ์ ์ด๋ป๊ฒ ํ์ฅํ ์ง ์์ฑํ๋ค.
๋์ด์ ํ์ ์์ฑํ์ง ์์๋๊น์ง ๋ฐ๋ณตํ๊ฒ ๋๋ฏ๋ก WHERE
์ ์ ์์ฑํ์ฌ ๋ฃจํ ์ข
๋ฃ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋ค.
ํ์ด์์๋ 0์ผ๋ก ํ์ ์ด๊ธฐํํ๊ณ 0+1, 1+1, 2+1 โฆ ์ฒ๋ผ h
๋ฅผ 1์ฉ ์ฆ๊ฐํ๋ฉฐ ํ์ ํ์ฅํ๋ค.
h
๊ฐ 23์ด ๋๋ฉด ๋ฃจํ๊ฐ ์ข
๋ฃ๋๊ณ UNION ALL
์ ํตํด {0, 1, โฆ 23}์ด ํฉ์งํฉ์ ๊ฒฐ๊ณผ๋ก ๋จ์ด์ง๊ฒ ๋๋ค.
Real MySQL 8.0 ์ฑ ์ ๊ณต๋ถํ๋ฉด์ ์์ํ ์ด๋ธ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋์๋ค๊ฐ ์ฉ๋์ด ์ปค์ง๋ฉด ๋์คํฌ๋ก ์ฎ๊ธฐ๋ ๊ณผ์ ์ด ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค. ๊ทธ๋ผ WITH ๊ตฌ๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋๋ ๋น์ทํ๊ฒ ๋์ํ ๊น? ์ฐพ์๋ณธ ๊ฒฐ๊ณผ ๋์ผํ๋ค.
CTE actual cost may also be affected by result set size. A CTE that produces many rows may require an internal temporary table large enough to be converted from in-memory to on-disk format and may suffer a performance penalty.
์ฑ๋ฅ์ ์ธ ๋ฉด์์๋ ํฐ ์ฐจ์ด๊ฐ ์๋ WITH ๊ตฌ๋ฌธ๊ณผ Subquery์ ๊ฐ๊ฐ ์ด๋จ ๋ ์ฐ๋ ๊ฒ์ด ์ข์๊น?
CTE๋ ์ฌ๊ท์ ์ผ ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ํน์ง์ด๋ค. ๋ํ WITH ๊ตฌ๋ฌธ์ ๋จ์ผ ๋ช
๋ น์ด๋ก ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ Subquery๋ณด๋ค ์ฌ์ฉ์ฑ์ด ์ข๋ค.
Subquery์ ๊ฒฝ์ฐ WHERE
์ ์์ ๋ฐ๋ก ํํฐ๋ง์ด ๊ฐ๋ฅํ๋ค๋ ์ , ํ์ด ์๋ ์ด์ฒ๋ผ ๋์ํ ์ ์๋ค๋ ์ ์ด ํน์ง์ด๋ค.
๊ฐ ๊ตฌ๋ฌธ์ ํน์ง์ ์์งํ๊ณ ๋ฌธ์ ํด๊ฒฐ์ ํฌ์ธํธ์ ์ฐ๊ฒฐ์ํฌ ์ ์๋ ๊ตฌ๋ฌธ์ ์ ํํ๋๋ก ํ์.