SQL ์๋ธ์ฟผ๋ฆฌ์ CTE
1๏ธโฃ ์๋ธ์ฟผ๋ฆฌ (Subquery)
SQL ๊ตฌ๋ฌธ ๋ด์ ํฌํจ๋ ์ฟผ๋ฆฌ, (๋ฉ์ธ)์ฟผ๋ฆฌ ์ ์ฟผ๋ฆฌ
โ ๋ชฉ์
- ๋ฐ์ดํฐ ํํฐ๋ง
- ๋ณต์กํ ์ง๊ณ
- JOIN
โ ์์น
- SELECT ๋ฌธ
- FROM ์
- WHERE ์
- HAVING ์
- ORDER BY ์
โ ์ ํ
- ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฐ๊ด์ฑ - ๋น์๊ด ์๋ธ์ฟผ๋ฆฌ
- ์๋ฌด๊ฒ๋ ์ฐธ์กฐํ์ง ์๊ณ , ์ฐ๊ณ๋์ง ์๊ณ , ๋จ๋ ์ผ๋ก ์คํ๋๋ ์๋ธ์ฟผ๋ฆฌ
- ๋ฉ์ธ ํ ์ด๋ธ๊ณผ ์กฐ์ธ ์กฐ๊ฑด์ด ๊ฑธ๋ฆฌ์ง ์๋ ์๋ธ์ฟผ๋ฆฌ
- ์ฐ์ฐ์(=, <>, <, >, <=, >=) + [ all / any / in ] ์ฌ์ฉํ ์กฐ๊ฑด ๋ถ์ฌ ๊ฐ๋ฅ
-- ๋น์๊ด ์๋ธ์ฟผ๋ฆฌ
-- (์์) ์ธ๋(India)์ ์๋ ๋ชจ๋ ๋์๋ฅผ ๋ฐํ
SELECT city_id, city_name
FROM city
WHERE country_id
<> (SELECT country_id FROM country WHERE country = 'India');
โ ์ฌ๊ธฐ์ ์ ๊น - MySQL์ ํน์ ์ฟผ๋ฆฌ ์ฐ์ฐ์์ ์๋ธ ์ฟผ๋ฆฌ์ LIMIT์ ์ง์ํ์ง ์๋๋ค.
- ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ฐ๊ด์ฑ - ์๊ด ์๋ธ์ฟผ๋ฆฌ
- ๋ฉ์ธ์ฟผ๋ฆฌ์ ์์กด์ ์ธ ์ฟผ๋ฆฌ
- ๋ฉ์ธ ํ ์ด๋ธ๊ณผ ์กฐ์ธ ์กฐ๊ฑด์ด ๊ฑธ๋ฆฐ ์๋ธ์ฟผ๋ฆฌ
-- ์๊ด ์๋ธ์ฟผ๋ฆฌ
-- (์์) ์๋ธ์ฟผ๋ฆฌ๋ก ๊ณ ๊ฐ๋ณ ์ํ ๋์ฌ ํ์ ๊ณ์ฐ ํ, ์ ํํ 20ํธ ๋์ฌํ ๊ณ ๊ฐ์ ๋ฐํ
SELECT c.first_name, c.last_name
FROM customer c
WHERE 20 =
(SELECT count(*) FROM rental r WHERE r.customer_id = c.customer_id);
- ๋ฐํ๊ฐ - ๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ
- ํ ํ์ ๊ฒฐ๊ณผ๊ฐ๋ง ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ
- ๋ฉ์ธ์ฟผ๋ฆฌ์ WHERE ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋จ์ผ ํ ๋น๊ต ์ฐ์ฐ์( =, <>, <, >, <=, >= , !=) ์ฌ์ฉ
- ๋ฐํ๊ฐ - ๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ
- ์ฌ๋ฌ ํ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ
- ๋ฉ์ธ์ฟผ๋ฆฌ์ WHERE ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ค์ค ํ ๋น๊ต ์ฐ์ฐ์( IN, ANY, ALL, EXISTS) ์ฌ์ฉ
- ๋ฐํ๊ฐ - ๋ค์ค ์ปฌ๋ผ ์๋ธ์ฟผ๋ฆฌ
- ์ฌ๋ฌ ์ปฌ๋ผ(์ด)์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ
- WHERE ์ ์์ ํ๋์ ํ์ ๋ฐํ - ๋จ์ผ ํ ๋น๊ต ์ฐ์ฐ์ ์ฌ์ฉ
- WHERE ์ ์์ ์ฌ๋ฌ ํ์ ๋ฐํ - ๋ค์ค ํ ๋น๊ต ์ฐ์ฐ์ ์ฌ์ฉ
- ๋ฉ์ธ ์ฟผ๋ฆฌ ์ปฌ๋ผ ๊ฐ์, ์ ํ = ์๋ธ ์ฟผ๋ฆฌ์์ ๋ฐํํ๋ ์ปฌ๋ผ ๊ฐ์, ์ ํ
2๏ธโฃ CTE (Common Table Expressions, ๊ณตํต ํ ์ด๋ธ ํํ์)
์ฟผ๋ฆฌ๋ฅผ ํตํด ๋ง๋ค์ด๋ธ ์์ธ ๋ฐ์ดํฐ ์ธํธ
โ ์ฌ๊ธฐ์ ์ ๊น - CTE vs VIEW
CTE - ์์ฑ ๊ถํ์ด ํ์ ์๊ณ , ํ๋์ ์ฟผ๋ฆฌ๋ฌธ์ด ๋๋ ๋๊น์ง๋ง ์ง์๋๋ ์ผํ์ฑ ํ ์ด๋ธ
VIEW - ์์ฑ ๊ถํ์ด ํ์ํ๋ฉฐ, ์ฌ์ ์ ์ ํ์
โ ํน์ง
- ๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ์ ๊ฐ๋ ์ฑ โฌ๏ธ
- ์ฌ์ฌ์ฉ์ฑ
- ์ค๋ณต ๋ฐฉ์ง
โ ๋ชฉ์
- ๋ฐ์ดํฐ ์ง๊ณ
- ์๋ธ์ฟผ๋ฆฌ ๋์ฒด
- ์์ ํ ์ด๋ธ ์์ฑ
โ ๊ตฌ์กฐ
-- CTE ๊ตฌ์กฐ
WITH table AS (SELECT…)
-- CTE ์์
WITH AmountSum AS (
SELECT customer_id, sum(Amount) as TotalAmount
FROM customers
GROUP BY customer_id
)
SELECT *
FROM AmountSum;
3๏ธโฃ ์ฌ๊ท์ CTE
์๊ธฐ ์์ ์ ์ฐธ์กฐํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌ
๊ณ์ธต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ(ex. ์กฐ์ง๋) ์ฒ๋ฆฌ์ ์ฉ์ด
โ ๊ตฌ์กฐ
-- ์ฌ๊ท์ CTE
WITH RECURSIVE OrgChart AS (
SELECT EmployeeID, Name, ManagerID
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.Name, e.ManagerID
FROM Employees e
INNER JOIN OrgChart o ON e.ManagerID = o.EmployeeID
)
SELECT * FROM OrgChart;
4๏ธโฃ ์ฐธ๊ณ ์๋ฃ
MySQL :: MySQL 8.0 Reference Manual :: 13.2.15.12 Restrictions on Subqueries
MySQL 8.0 Reference Manual / ... / SQL Statements / Data Manipulation Statements / Subqueries / Restrictions on Subqueries 13.2.15.12 Restrictions on Subqueries In general, you cannot modify a table and select from the same table in a
dev.mysql.com
๋ฌ๋ SQL | ์จ๋ฐ ๋ณผ๋ฆฌ์ธ - ๊ต๋ณด๋ฌธ๊ณ
๋ฌ๋ SQL | SQL ์ธ์ด๋ฅผ ๋ง์คํฐํ๊ธฐ ์ํ ํ๋ ์ํ์ด๋ ์ง 40๋ ์ด ๋์ SQL์ ์ฐ์์๋ ๋ฐ์ดํฐ ์ ์ฑ์๋๋ฅผ ๋ง์ ํ์ฅํ๊ณ ์๋ค. ์ด ์ฑ ์ ๊ฐ๋ฐ์๊ฐ SQL ๊ธฐ๋ณธ์ ๋นจ๋ฆฌ ์ตํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ํ๋ฆฌ์ผ์ด์
product.kyobobook.co.kr
SQL CTE๋ฅผ ์ ํ์ฉํ๋ ค๋ฉด?
SQL๋ฌธ์ ์์ฑํ๋ฉด์ ์ด๋ค ๊ฒฝ์ฐ์ CTE๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์์ง ๊ถ๊ธํ ์ ์ด ์์๋์? ์ด ๊ธ์ ์ธ์ CTE๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ์ข์์ง๋ฅผ ๋ค๋ค๋ณผ ๊ฒ์ ๋๋ค. ๋ง์ฝ ์ฌ๋ฌ๋ถ์ด SQL CTEs์
kimsyoung.tistory.com
GitHub - data-jeong/FromSQLBasicsToPro-MySQL: From SQL Basics To Pro
From SQL Basics To Pro . Contribute to data-jeong/FromSQLBasicsToPro-MySQL development by creating an account on GitHub.
github.com