WITH PlayerStats AS (
SELECT 'Adams' as LastName, 'Noam' as FirstName, 3 as PointsScored UNION ALL
SELECT 'Buchanan', 'Jie', 0 UNION ALL
SELECT 'Coolidge', 'Kiran', 1 UNION ALL
SELECT 'Adams', 'Noam', 4 UNION ALL
SELECT 'Buchanan', 'Jie', 13)
SELECT SUM(PointsScored) AS total_points
, FirstName AS first_name
, LastName AS last_name
FROM PlayerStats
GROUP BY ALL;
WITH PlayerStats AS (
SELECT 'Adams' as LastName, 'Noam' as FirstName, 3 as PointsScored UNION ALL
SELECT 'Buchanan', 'Jie', 0 UNION ALL
SELECT 'Coolidge', 'Kiran', 1 UNION ALL
SELECT 'Adams', 'Noam', 4 UNION ALL
SELECT 'Buchanan', 'Jie', 13)
SELECT COUNT(*) OVER () AS total_people
, FirstName AS first_name
, LastName AS last_name
FROM PlayerStats
GROUP BY ALL;
WITH Values AS (
SELECT 1 AS x, 2 AS y
UNION ALL SELECT 1 AS x, 4 AS y
UNION ALL SELECT 2 AS x, 5 AS y
)
SELECT Values.x AS x_coordinate
, Values.y AS y_coordinate
, [Values.x, Values.y] AS coordinates
FROM Values
GROUP BY ALL
WITH
[๋ณ์นญ1] AS (SELECT๋ฌธ 1),
[๋ณ์นญ2] AS (SELECT๋ฌธ 2),
...,
[๋ณ์นญN] AS (SELECT๋ฌธ N)
SELECT
FROM ๋ณ์นญ1, ๋ณ์นญ2, ..., ๋ณ์นญN
WHERE์ , ์ค์ฒฉ ์๋ธ ์ฟผ๋ฆฌNested Subquery
ใ กNested Subquery - ๋จ์ผ ํ
์ ๋๋ฆฌ๋ผ๋ ์ฌ๋์ ์ง๊ธ์ ๊ตฌํ์์ค.
SELECT office_worker
FROM employee
WHERE office_worker = (SELECT office_worker FROM employee WHERE name = '์ ๋๋ฆฌ')
ใ กNested Subquery - ๋ณต์(๋ค์ค) ํ
์ ๋๋ฆฌ๋ณด๋ค ๊ธ์ฌ๊ฐ ๋์ ์ฌ๋๋ค์ ๊ตฌํ์์ค.
SELECT *
FROM employee
WHERE salary > (SELECT salary FROM employee WHERE name = '์ ๋๋ฆฌ')
์ง๊ธ์ด ์ฌ์์ธ ์ฌ๋๋ค์ ๊ตฌํ์์ค.
SELECT *
FROM employee
WHERE office_worker IN (SELECT office_worker FROM employee WHERE office_worker = '์ฌ์')
IN : ํ๋๋ผ๋ ์ผ์นํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด TRUE ANY, SOME : ๋ง์กฑํ๋ ๊ฒฐ๊ณผ๊ฐ ํ๋ ์ด์์ด๋ฉด TRUE ALL : ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๋ง์กฑํ๋ฉด TRUE EXISTS : ๊ฒฐ๊ณผ๊ฐ ์กด์ฌํ๋ฉด TRUE (ํ์ด 1๊ฐ ์ด์์ด๋ฉด TRUE)
<IN> ๋ถ์๋ณ ์ต๊ณ ๊ธ์ฌ์ ๋์ผํ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ ๋ณด
SELECT *
FROM emp
WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno);
<SOME> ๋ฑ๊ฐ ๋น๊ต ์ฐ์ฐ์(=)์ ANY, SOME์ ํจ๊ป ์ฌ์ฉํ๋ฉด IN ์ฐ์ฐ์์ ๊ฐ์ ๊ธฐ๋ฅ ์ํ
SELECT *
FROM emp
WHERE sal = SOME (SELECT MAX(sal) FROM emp GROUP BY deptno);
<ANY> ๋ฑ๊ฐ ๋น๊ต ์ฐ์ฐ์๊ฐ ์๋ ๋์ ๋น๊ต ์ฐ์ฐ์์ ANY๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด?
< ANY : ๋ถ์ 30 ์ค ์ต๋๊ฐ๋ณด๋ค ์ ์ ๊ธ์ฌ๋ฅผ ๊ฐ์ง ์ฌ์์ ์ฐพ๊ฒ ๋จ
> ANY : ๋ถ์ 30 ์ค ์ต์๊ฐ๋ณด๋ค ๋์ ๊ธ์ฌ๋ฅผ ๊ฐ์ง ์ฌ์์ ์ฐพ๊ฒ ๋จ
SELECT *
FROM emp
WHERE sal < ANY (SELECT sal FROM emp WHERE deptno = 30);
<ALL> ๋ถ์ 30 ์ค ์ต๋ ๊ธ์ฌ๋ณด๋ค ๋ ๋ง์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์ ์ถ๋ ฅ
SELECT *
FROM emp
WHERE sal > ALL (SELECT sal FROM emp WHERE deptno = 30);
<EXISTS> ๋ถ์50์ด ์์ผ๋ฉด EMP ์ ์ฒด ์ถ๋ ฅ
SELECT *
FROM emp
WHERE EXISTS (SELECT dname FROM dept WHERE deptno = 50);
SELECT car_id
, ROUND(AVG(DATEDIFF(end_date, start_date) + 1), 1) average_duration
FROM car_rental_company_rental_history
GROUP BY car_id
HAVING average_duration >= 7
ORDER BY average_duration DESC, car_id DESC
WHERE category IN('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
AND price IN (SELECT MAX(price) OVER (PARTITION BY category) FROM food_product)
-- ๊ฐ์ฅ ๋น์ผ ์ํ์ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋
WHERE category IN('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
AND price IN (SELECT MIN(price) OVER (PARTITION BY category) FROM food_product)
-- ๊ฐ์ฅ ์ผ ์ํ์ ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๊ฑฐ๋
SELECT category
, price
, product_name
FROM food_product
WHERE category IN('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
AND price IN (SELECT MAX(price) OVER (PARTITION BY category) FROM food_product)
-- ๊ฐ์ฅ ๋น์ผ ์ํ๋ค๋ง ์ถ๋ ฅ
ORDER BY price DESC
SELECT category
, price
, product_name
FROM food_product
WHERE category IN('๊ณผ์', '๊ตญ', '๊น์น', '์์ฉ์ ')
AND price IN (SELECT MIN(price) OVER (PARTITION BY category) FROM food_product)
-- ๊ฐ์ฅ ์ผ ์ํ๋ค๋ง ์ถ๋ ฅ
ORDER BY price DESC
SELECT IF(Grade < 8, NULL, Name), g.Grade, s.Marks
FROM Students s
LEFT JOIN Grades g ON s.Marks BETWEEN g.Min_Mark AND g.Max_Mark
ORDER BY Grade DESC, Name, Marks
SELECT CASE
WHEN price < 10000 THEN NULL
ELSE TRUNCATE(price, -4) END AS price_group
, COUNT(product_id) AS products
FROM product
GROUP BY price_group
ORDER BY price_group
WHERE, GROUP BY: 1๋ ์น ์ ํ๋ณ ๋งค์ถ ์์ ๋ฝ๊ธฐ
SELECT ods.orderDate , ods.customerNumber , odd.orderNumber , odd.productCode , odd.quantityOrdered , odd.priceEach FROM orderdetails odd, orders ods WHERE odd.orderNumber = ods.orderNumber AND orderDate LIKE '2003%' ORDER BY productCode;
SELECT productCode , ROUND(AVG(priceEach), 2) AS avg_priceEach , SUM(quantityOrdered) AS sum_quantity , (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales FROM orderdetails odd, orders ods WHERE odd.orderNumber = ods.orderNumber AND orderDate LIKE '2003%' GROUP BY productCode ORDER BY year_sales DESC;
SELECT productCode , ROUND(AVG(priceEach), 2) AS avg_priceEach , SUM(quantityOrdered) AS sum_quantity , (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales , ROW_NUMBER () OVER ( ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC ) AS sales_rank FROM orderdetails odd, orders ods WHERE odd.orderNumber = ods.orderNumber AND orderDate LIKE '2003%' GROUP BY productCode ORDER BY year_sales DESC;
SELECT productCode , ROUND(AVG(priceEach), 2) AS avg_priceEach , SUM(quantityOrdered) AS sum_quantity , (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) AS year_sales , ROW_NUMBER () OVER ( ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC ) AS sales_rank , CASE WHEN ROW_NUMBER () OVER ( ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC ) BETWEEN 1 AND 11 THEN 'high' WHEN ROW_NUMBER () OVER ( ORDER BY (ROUND(AVG(priceEach), 2) * SUM(quantityOrdered)) DESC ) BETWEEN 98 AND 109 THEN 'low' ELSE 'medium' END AS sales_seg FROM orderdetails odd, orders ods WHERE odd.orderNumber = ods.orderNumber AND orderDate LIKE '2003%' GROUP BY productCode;