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);
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;
select lr.์์, lr.์ํ์ฝ๋, li.์นดํ ๊ณ ๋ฆฌ, li.๋ธ๋๋๋ช , li.์ํ๋ช from linfo li inner join lrank lr on li.์ํ์ฝ๋ = lr.์ํ์ฝ๋ order by lr.์์;
select lr.์์, lr.์ํ์ฝ๋, li.๋ธ๋๋๋ช , li.์ํ๋ช , li.์ข์์, li.์ํํ from linfo li, lrank lr where li.์ํ์ฝ๋ = lr.์ํ์ฝ๋ order by lr.์์;
select lr.์์, lr.์ํ์ฝ๋, li.๋ธ๋๋๋ช , li.์ํ๋ช , li.์ข์์, li.์ํํ from linfo li, lrank lr where li.์ํ์ฝ๋ = lr.์ํ์ฝ๋ and li.์ํํ < 10 order by lr.์์;
CASE [์ปฌ๋ผ ์ด๋ฆ] WHEN ์กฐ๊ฑด๊ฐ1 THEN ๊ฒฐ๊ณผ๊ฐ1 WHEN ์กฐ๊ฑด๊ฐ2 THEN ๊ฒฐ๊ณผ๊ฐ2 ELSE ๊ฒฐ๊ณผ๊ฐ3 END
ํ ์ด๋ธ ํฉ์น๊ธฐ
ํํ
์ค๋ช
ํ์ฉ
INNER JOIN
๋ ํ ์ด๋ธ ๋ชจ๋์ ์๋ ๊ฐ๋ง ํฉ์น๊ธฐ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] INNER JOIN [ํ ์ด๋ธ B ์ด๋ฆ] ON [ํ ์ด๋ธ A ์ด๋ฆ].[์ปฌ๋ผ A ์ด๋ฆ]=[ํ ์ด๋ธ B ์ด๋ฆ].[์ปฌ๋ผ B ์ด๋ฆ]
LEFT JOIN
์ผ์ชฝ ํ ์ด๋ธ์ ์๋ ๊ฐ๋ง ํฉ์น๊ธฐ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] LEFT JOIN [ํ ์ด๋ธ B ์ด๋ฆ] ON [ํ ์ด๋ธ A ์ด๋ฆ].[์ปฌ๋ผ A ์ด๋ฆ]=[ํ ์ด๋ธ B ์ด๋ฆ].[์ปฌ๋ผ B ์ด๋ฆ]
RIGHT JOIN
์ค๋ฅธ์ชฝ ํ ์ด๋ธ์ ์๋ ๊ฐ๋ง ํฉ์น๊ธฐ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] RIGHT JOIN [ํ ์ด๋ธ B ์ด๋ฆ] ON [ํ ์ด๋ธ A ์ด๋ฆ].[์ปฌ๋ผ A ์ด๋ฆ]=[ํ ์ด๋ธ B ์ด๋ฆ].[์ปฌ๋ผ B ์ด๋ฆ]
OUTER JOIN
๋ ํ ์ด๋ธ์ ์๋ ๋ชจ๋ ๊ฐ ํฉ์น๊ธฐ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] LEFT JOIN [ํ ์ด๋ธ B ์ด๋ฆ] ON [ํ ์ด๋ธ A ์ด๋ฆ].[์ปฌ๋ผ A ์ด๋ฆ]=[ํ ์ด๋ธ B ์ด๋ฆ].[์ปฌ๋ผ B ์ด๋ฆ] UNION SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] RIGHT JOIN [ํ ์ด๋ธ B ์ด๋ฆ] ON [ํ ์ด๋ธ A ์ด๋ฆ].[์ปฌ๋ผ A ์ด๋ฆ]=[ํ ์ด๋ธ B ์ด๋ฆ].[์ปฌ๋ผ B ์ด๋ฆ]
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] CROSS JOIN [ํ ์ด๋ธ B ์ด๋ฆ];
SELF JOIN
๊ฐ์ ํ ์ด๋ธ์ ์๋ ๊ฐ ํฉ์น๊ธฐ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] AS t1 INNER JOIN [ํ ์ด๋ธ A ์ด๋ฆ] AS t2 ON t1.[์ปฌ๋ผ A ์ด๋ฆ] = t2.[์ปฌ๋ผ A ์ด๋ฆ];
์ฌ๋ฌ ํ ์ด๋ธ ํ ๋ฒ์ ๋ค๋ฃจ๊ธฐ
ํํ
ํ์ฉ
ํฉ์งํฉ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] UNION SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ B ์ด๋ฆ];
์ค๋ณต ํฌํจ ํฉ์งํฉ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] UNION ALL SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ B ์ด๋ฆ];
๊ต์งํฉ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธ A ์ด๋ฆ] AS A INNER JOIN [ํ ์ด๋ธ B ์ด๋ฆ] AS B ON A.[์ปฌ๋ผ1 ์ด๋ฆ] = B.[์ปฌ๋ผ1 ์ด๋ฆ] AND ... AND A.[์ปฌ๋ผn ์ด๋ฆ] = B.[์ปฌ๋ผn ์ด๋ฆ];
์ฐจ์งํฉ
SELECT [์ปฌ๋ผ ์ด๋ฆ] FROM [ํ ์ด๋ธA ์ด๋ฆ] AS A LEFT JOIN [ํ ์ด๋ธ B] AS B ON A.[์ปฌ๋ผ1 ์ด๋ฆ] = B.[์ปฌ๋ผ1 ์ด๋ฆ] AND ... AND A.[์ปฌ๋ผn ์ด๋ฆ] = B.[์ปฌ๋ผn ์ด๋ฆ] WHERE B.[์ปฌ๋ผ ์ด๋ฆ] IS NULL;
ํจ์ ๋ง๋ค๊ธฐ ์ฟผ๋ฆฌ
SET GLOVAL log_bin_trust_function_creators=1; #์ฌ์ฉ์ ๊ณ์ ์ function create ๊ถํ ์์ฑ
DELIMITER // # ํจ์์ ์์ ์ง์
CREATE FUNCTION [ํจ์ ์ด๋ฆ] ([์ ๋ ฅ๊ฐ ์ด๋ฆ] [๋ฐ์ดํฐ ํ์ ], ...)
RETURNS [๊ฒฐ๊ณผ๊ฐ ๋ฐ์ดํฐ ํ์ ]
BEGIN
DECLARE [์์๊ฐ ์ด๋ฆ] [๋ฐ์ดํฐ ํ์ ];
SET [์์๊ฐ ์ด๋ฆ] = [์ ๋ ฅ๊ฐ ์ด๋ฆ];
์ฟผ๋ฆฌ;
RETURN ๊ฒฐ๊ณผ๊ฐ
END
//
DELIMITER; #ํจ์์ ๋ ์ง์