코드 그라데이션

[얄코] MySQL 1-5.조건에 따라 그룹으로 묶기 본문

Database/SQL

[얄코] MySQL 1-5.조건에 따라 그룹으로 묶기

완벽한 장면 2023. 6. 10. 13:22

1. GROUP BY 

- 조건에 따라 집계된 값을 가져온다.

 

1)

SELECT Country FROM Customers
GROUP BY Country;

실행 결과

 

 

2)

SELECT CategoryID FROM Products
GROUP BY CategoryID;

실행 결과

 

 

여러 컬럼을 기준으로 그룹화할 수도 있다.

SELECT 
  Country, City,
  CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;

 

실행 결과

 

 

 

* 그룹 함수 활용하기

1)

SELECT
  COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;

실행 결과

 

 

2)

SELECT
  ProductID,
  SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;

실행 결과

 

 

3)

SELECT
  CategoryID,
  MAX(Price) AS MaxPrice, 
  MIN(Price) AS MinPrice,
  TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
  TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
GROUP BY CategoryID;

실행 결과

 

 

4)

SELECT 
  CONCAT_WS(', ', City, Country) AS Location,
  COUNT(CustomerID)
FROM Customers
GROUP BY Country, City;

실행 결과

 

 

* WITH ROLLUP - 전체의 집계값

  • GROUP BY 와는 함께 사용할 수 없다.

1)

SELECT
  Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;

실행 결과

 

 

HAVING - 그룹화된 데이터 걸러내기

SELECT
  Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;

실행 결과

 

 

* WHERE은 그룹하기 전 데이터, HAVING은 그룹 후 집계에 사용한다.

1)

SELECT
  COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;

실행 결과

 

 

2)

SELECT
  CategoryID,
  MAX(Price) AS MaxPrice, 
  MIN(Price) AS MinPrice,
  TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
  TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
WHERE CategoryID > 2
GROUP BY CategoryID
HAVING
  AveragePrice BETWEEN 20 AND 30
  AND MedianPrice < 40;

실행 결과

 

 


2. DISTINCT - 중복된 값을 제거

  • GROUP BY와 달리 집계함수가 사용되지 않는다.
  • GROUP BY와 달리 정렬하지 않으므로 더 빠르다.

1)

SELECT DISTINCT CategoryID
FROM Products;
-- 위의 GROUP BY를 사용한 쿼리와 결과 비교

실행 결과

 

 

2)

SELECT COUNT DISTINCT CategoryID
FROM Products;
-- 오류 발생

실행 결과

 

 

3)

SELECT DISTINCT Country
FROM Customers
ORDER BY Country;

실행 결과

 

 

4)

SELECT DISTINCT Country, City
FROM Customers
ORDER BY Country, City;

실행 결과

 

 

# GROUP BY와 DISTINCT는 함께 활용도 가능하다.

SELECT
  Country,
  COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;

 

실행 결과

 

 

 

 

 

 

 

 

728x90
Comments