๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [SQL] '์„œ๋ธŒ์ฟผ๋ฆฌ์™€ GROUP BY' ํŽธ

ybkยท2024๋…„ 4์›” 29์ผ

sql

๋ชฉ๋ก ๋ณด๊ธฐ
5/6
post-thumbnail

๐Ÿ”” '์„œ๋ธŒ์ฟผ๋ฆฌ์™€ GROUP BY'์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž!


๐Ÿ’Ÿ ์„œ๋ธŒ์ฟผ๋ฆฌ

SQL ๋ฌธ์žฅ ์•ˆ์— ํฌํ•จ๋œ ๋˜ ๋‹ค๋ฅธ SQL ๋ฌธ์žฅ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ ์กฐ๊ฑด์ด๋‚˜ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ๋™์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” SELECT, INSERT, UPDATE, DELETE ๋ฌธ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ SQL ๋ฌธ์žฅ์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ (Single-row Subquery): ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ๋‹จ์ผ ํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์ฃผ๋กœ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ํŠน์ • ๊ฐ’์„ ๋น„๊ตํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค

    SELECT name
    FROM users
    WHERE age = (SELECT MAX(age) FROM users);
  2. ๋‹ค์ค‘ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ (Multi-row Subquery): ๋‚ด๋ถ€ ์ฟผ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ์ฃผ๋กœ IN, ANY, ALL๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

# mexico ๊ณ ๊ฐ์ด ์ฃผ๋ถ„ํ•œ ๊ฑด๋“ค ์กฐํšŒ
SELECT * FROM Orders WHERE CustomerID IN (SELECT CustomerID
                                      FROM Customers
                                      WHERE Country = 'mexico');

์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰ ๋ฐ ์กฐ์ž‘ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒ๊ด€ ์„œ๋ธŒ์ฟผ๋ฆฌ : ์™ธ๋ถ€ ์ฟผ๋ฆฌ์™€ ๋‚ด๋ถ€ ์ฟผ๋ฆฌ ์‚ฌ์ด์— ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ฟผ๋ฆฌ์˜ ๊ฐ’์ด ๋‚ด๋ถ€ ์ฟผ๋ฆฌ์— ์‚ฌ์šฉ๋  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์†๋„๊ฐ€ ๋А๋ฆฌ๋ฉฐ JOIN์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.
    # ๊ฐ ๊ณ ๊ฐ์˜ ์ฃผ๋ฌธ ํšŸ์ˆ˜
     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;

๐Ÿ’Ÿ GROUP BY

์ง‘๊ณ„ํ•จ์ˆ˜(avg,sum,min,max,count)๋ฅผ ๊ทธ๋ฃน๋ณ„๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค. ํŠน์ • ์—ด์„ ๊ธฐ์ค€์œผ๋กœ ํ–‰์„ ๊ทธ๋ฃนํ™”ํ•˜๊ณ , ๊ฐ ๊ทธ๋ฃน์— ๋Œ€ํ•ด ์ง‘๊ณ„ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ : 1997๋…„ 7์›” ๊ธฐ์ค€ ๊ณ ๊ฐ๋ณ„ ์†Œ๋น„๊ธˆ์•ก์„ ๊ธˆ์•ก์ด ๋†’์€ ์ˆœ์„œ๋กœ ์ƒ์œ„ 5๊ฐœ๋งŒ ์กฐํšŒํ•˜๊ธฐ

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 : ์ง‘๊ณ„ํ•จ์ˆ˜์˜ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

์ƒํ’ˆ์ˆ˜๊ฐ€ 10๊ธฐ ์ด์ƒ์ธ ์นดํ…Œ๊ณ ๋ฆฌ ์กฐํšŒ

SELECT CategoryID, COUNT(ProductID) ์ƒํ’ˆ์ˆ˜
FROM Products
GROUP BY CategoryID
HAVING ์ƒํ’ˆ์ˆ˜ >= 10;

๊ณ ๊ฐ์ด 5๋ช… ์ด์ƒ ์žˆ๋Š” ๊ตญ๊ฐ€๋“ค ์กฐํšŒ

SELECT Country, COUNT(CustomerID)
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) >= 5;

97๋…„ 7์›” ๋งค์ถœ์•ก์ด 1000๋‹ฌ๋Ÿฌ ์ด์ƒ์ธ ์ง์›๋“ค ์กฐํšŒ

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;
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

0๊ฐœ์˜ ๋Œ“๊ธ€