Common Table Expression(CTE)๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ
CTE๋ ์์ ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก, ํด๋น ์ฟผ๋ฆฌ ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
๋ณต์กํ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด ์ค๋ค
WITH High_Salary AS ( -- High_Salary : CTE ์ด๋ฆ
SELECT name, salary
FROM employees -- employees ํ
์ด๋ธ์์
WHERE salary > 5000 -- salary๊ฐ 5000 ์ด์์ธ ์ง์ ๋ชฉ๋ก์ ์์ ์ ์ฅ
)
-- SELECT๋ฌธ์์ High_Salary๋ฅผ ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ฉ
SELECT name FROM High_Salary
WITH Department_Sales As ( -- Department_Sales : ๋ถ์๋ณ ๋งค์ถ ํฉ๊ณ ๊ณ์ฐ
SELECT dapartment, SUM(sales) AS total_sales
FROM sales_data
GROUP BY department
), High_Sales AS ( -- High_Sales : ๋งค์ถ์ด 10000 ์ด์์ธ ๋ถ์๋ง ์ถ์ถ
SELECT department
FROM Department_Sales
WHERE total_sales > 10000
)
SELECT department FROM High_Sales
RECURSIVE CTE (์ฌ๊ท์ CTE)
์๊ธฐ์์ ์ ์ฐธ์กฐํ์ฌ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋๋ CTE
๋ฐ๋ณต์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ๊ณ์ธตํ ๋ฐ์ดํฐ(ํธ๋ฆฌ๊ตฌ์กฐ)๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ
-- 0๋ถํฐ 9๊น์ง ์ซ์ ์ถ๋ ฅ
WITH RECURSIVE numbers AS (
SELECT 0 AS num -- ์์์ (Anchor Member)
UNION ALL
SELECT num + 1 -- ์ฌ๊ท ํธ์ถ(Recursive Member) : 1์ฉ ์ฆ๊ฐ
FROM numbers
WHERE num < 9 -- ์ข
๋ฃ ์กฐ๊ฑด
)
SELECT num FROM numbers;
ํ์ ์์ฑ
RECURSIVE ํค์๋ : WITH RECURSIVE๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ์๊ธฐ ์์ ์ฐธ์กฐ ๊ฐ๋ฅ
Anchor Member : ์ฌ๊ท์ ์์์ ์ด๋ฉฐ, ํ ๋ฒ๋ง ์คํ, ์ด๊ธฐ ์ํ ์ ์
UNION ALL : Anchor Member์ Recursive Member๋ฅผ ์ฐ๊ฒฐ (์ค๋ณต ์ ๊ฑฐ๊ฐ ํ์ํ ๋๋ UNION)
Recursive Member : ์๊ธฐ ์์ ์ ํธ์ถ, ์ข ๋ฃ ์กฐ๊ฑด ํ์ ํฌํจ
๋๋ณด๊ธฐ
์ฃผ์ ์ฌํญ
1. ์ข ๋ฃ ์กฐ๊ฑด ํ์ : ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ์ ๋น ์ ธ ์๋ฒ๊ฐ ๋ฉ์ถ ์ ์๋ค
2. ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง : MySQL์๋ ์ต๋ ์ฌ๊ท ๊น์ด๊ฐ ์ค์ ๋์ด ์๋ค (๊ธฐ๋ณธ๊ฐ 1000, SET max_recursion_depth๋ก ์กฐ์ ๊ฐ๋ฅ)
3. ์ฌ๊ท ํธ์ถ ํ์ ์ ํ : ๋๋ฌด ๊น๊ฑฐ๋ ๋ง์ ๋ฐ์ดํฐ๊ฐ ๋ฐํ๋๋ฉด ์ฑ๋ฅ ์ ํ ๋ฐ์ → ํํฐ๋ง๊ณผ ์กฐ๊ฑด๋ฌธ์ ํ์ฉํด ๋ถํ์ํ ์ฌ๊ท ํธ์ถ ๋ฐฉ์ง
4. UNION ALL: ์ค๋ณต ํฌํจ(๋น ๋ฆ) / UNION: ์ค๋ณต ์ ๊ฑฐ(๋๋ฆผ)
๋ฐ์ํ
'๐ SQL > ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| COUNT (0) | 2025.03.14 |
|---|---|
| ๋นํธ์ฐ์ฐ์ (0) | 2025.03.07 |
| ๋ฐ์ดํฐ ํ์ ๋ณํ CAST / CONVERT (0) | 2025.02.23 |
| MAX()์ LIMIT 1 (0) | 2025.02.22 |
| LIKE / REGEXP (0) | 2025.02.20 |