๐Ÿงฑ SQL

SQL ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ CTE

ํ–‰ํŒฝ 2024. 1. 10. 15:27

 

 

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) ์‚ฌ์šฉ

โ“’note.espriter.net/1376

 

 

  • ๋ฐ˜ํ™˜๊ฐ’ - ๋‹ค์ค‘ ์ปฌ๋Ÿผ ์„œ๋ธŒ์ฟผ๋ฆฌ
    • ์—ฌ๋Ÿฌ ์ปฌ๋Ÿผ(์—ด)์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
    • 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