
SQL ๋ฌธ์ฅ ์์ ํฌํจ๋ ๋ ๋ค๋ฅธ SQL ๋ฌธ์ฅ์ ๋๋ค. ์ฃผ๋ก ์ธ๋ถ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ด๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ๋์ ์ผ๋ก ์คํ๋์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ธ์ฟผ๋ฆฌ๋ SELECT, INSERT, UPDATE, DELETE ๋ฌธ ๋ฑ์ ๋ค์ํ SQL ๋ฌธ์ฅ์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
๋จ์ผ ํ ์๋ธ์ฟผ๋ฆฌ (Single-row Subquery): ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ๋จ์ผ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฌํ ์ข
๋ฅ์ ์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ๋ก ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋์ด ํน์ ๊ฐ์ ๋น๊ตํ๊ฑฐ๋ ํํฐ๋งํ๋ ๋ฐ์ ์ฌ์ฉ๋ฉ๋๋ค
SELECT name
FROM users
WHERE age = (SELECT MAX(age) FROM users);
๋ค์ค ํ ์๋ธ์ฟผ๋ฆฌ (Multi-row Subquery): ๋ด๋ถ ์ฟผ๋ฆฌ๊ฐ ์ฌ๋ฌ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฌํ ์ข
๋ฅ์ ์๋ธ์ฟผ๋ฆฌ๋ ์ฃผ๋ก IN, ANY, ALL๊ณผ ๊ฐ์ ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋์ด ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ์งํฉ์ ํํฐ๋งํ๊ฑฐ๋ ๋น๊ตํ๋ ๋ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
# mexico ๊ณ ๊ฐ์ด ์ฃผ๋ถํ ๊ฑด๋ค ์กฐํ
SELECT * FROM Orders WHERE CustomerID IN (SELECT CustomerID
FROM Customers
WHERE Country = 'mexico');
์๋ธ์ฟผ๋ฆฌ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ์กฐ์ ์์ ์ ์ํํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
# ๊ฐ ๊ณ ๊ฐ์ ์ฃผ๋ฌธ ํ์
SELECT CustomerName, Country,
(SELECT COUNT(OrderID)
FROM Orders
WHERE Customers.CustomerID = Orders.CustomerID)
FROM Customers;
# JOIN
SELECT CustomerName, Country, COUNT(OrderID)
FROM Customers c LEFT JOIN Orders o
ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID;์ง๊ณํจ์(avg,sum,min,max,count)๋ฅผ ๊ทธ๋ฃน๋ณ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋ค. ํน์ ์ด์ ๊ธฐ์ค์ผ๋ก ํ์ ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํฉ๋๋ค.
SELECT c.CustomerID,SUM(Price * Quantity) ์๋น๊ธ์ก
FROM Customers c JOIN Orders o ON c.CustomerID = o.CustomerID
JOIN OrderDetails od ON o.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
WHERE OrderDate BETWEEN '1997-07-01' AND '1997-07-31'
GROUP BY c.CustomerID
ORDER BY ์๋น๊ธ์ก DESC
LIMIT 5;
- ์ฌ๋ฌ ์ด์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
SELECT c.CustomerName, p.ProductName, SUM(od.Quantity) ์ํ์ฃผ๋ฌธ์
FROM Customers c JOIN Orders o ON c.CustomerID = o.CustomerID
JOIN OrderDetails od ON o.OrderID = od.OrderID
JOIN Products p ON od.ProductID = p.ProductID
GROUP BY c.CustomerID, p.ProductID
ORDER BY c.CustomerID, p.ProductID;
HAVING : ์ง๊ณํจ์์ ์กฐ๊ฑด์
๋๋ค.SELECT CategoryID, COUNT(ProductID) ์ํ์
FROM Products
GROUP BY CategoryID
HAVING ์ํ์ >= 10;
SELECT Country, COUNT(CustomerID)
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) >= 5;
SELECT e.FirstName, e.LastName, SUM(Price*Quantity) ๋งค์ถ์ก
FROM Employees e JOIN Orders o ON e.EmployeeID = o.EmployeeID
JOIN OrderDetails od ON o.OrderID = od.OrderID
JOIN Products P on od.ProductID = P.ProductID
WHERE o.OrderDate BETWEEN '1997-07-01' AND '1997-07-31'
GROUP BY e.EmployeeID
HAVING ๋งค์ถ์ก >= 10000;