SELECT Country FROM Customers
GROUP BY Country;
Customers테이블에는 Country 컬럼이 있고 다양한 나라가 데이터로 존재
GROUP BY 하면 어떤 나라가 있는지 중복없이 출력됨.
SELECT CategoryID FROM Products
GROUP BY CategoryID;
모든 CategoryID를 하나씩 확인할 수 있다.
SELECT
Country, City,
CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;
GROUP BY 기준 2개를 정할 수 있다.
한 나라에는 여러 도시가 있을 수 있다.
SELECT
COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;
Orders테이블에서 OrderDate기준으로 해당 날짜마다 몇 개의 데이터가 있는 지 가져오기
SELECT
ProductID,
SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;
OrderDetails테이블에서 ProductID로 그룹화하고,
Quantity를 합한 값을 QuantitySum으로 컬럼명을 정의하고,
해당 컬럼명 내림차순으로
ProductID, QuantitySum 데이터 가져오기
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;
Products테이블에서 CategoryID로 그룹화
CategoryID,
같은 CategoryID에서 Price가 가장 큰 값,
가장 작은 값,
(가장 큰 값 + 가장 작은 값) / 2 한 값 소수점 두번째 자리까지 표기,
평균값 소수점 두번째 자리까지 표기
가져오기
SELECT
CONCAT_WS(', ', City, Country) AS Location,
COUNT(CustomerID)
FROM Customers
GROUP BY Country, City;
Customers테이블에서 Country, City 로 그룹화
City, Country 형식으로 Location 컬럼을 정의하고
CustomerID별로 카운팅을 해서 데이터를 가져온다.
즉, 나라 도시별로 거주하는 고객들의 수를 알 수 있다.
전체의 집계값 (단순 총계 아님)
SELECT
Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;
맨 밑에 전체 집계값이 출력된다.
집계함수 쿼리 끝마다 붙여서 사용하면 된다.
(⚠️ ORDER BY 와는 함께 사용될 수 없습니다.)
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
WITH ROLLUP;
순서별로 가장 큰 값, 가장 작은 값, 중간 값, 평균 값을 알 수 있다.
그룹화된 데이터 걸러내기
SELECT
Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;
Suppliers테이블에서 Country로 그룹화
Country와 Count 값을 가져올건데
Count가 3 이상인 데이터만 가져오기
(💡 WHERE는 그룹하기 전 데이터, HAVING은 그룹 후 집계에 사용합니다.)
SELECT
COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;
Orders테이블에서 OrderDate로 그룹화
OrderDate가 1997년도 이상인 것만
OrderDate, Count를 가져오는데
Count는 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;
Products테이블에서 CategoryID가 2보다 큰 것만 CategoryID로 그룹화
CategoryID, MAX, MIN, MedianPrice, AveragePrice를 가져오는데
AveragePrice가 20~30 이고 MedianPrice가 40미만인 데이터만 가져오기
GROUP BY 와 달리 집계함수가 사용되지 않습니다.
GROUP BY 와 달리 정렬하지 않으므로 더 빠릅니다.
SELECT DISTINCT CategoryID
FROM Products;
-- 위의 GROUP BY를 사용한 쿼리와 결과 비교
Products테이블에서 CategoryID를 안겹치게 가져오기
(정렬없이 가져옴)
SELECT COUNT DISTINCT CategoryId
FROM Products;
에러.
DISTINCT는 집계함수를 함께 사용하지 않는다.
SELECT DISTINCT Country
FROM Customers
ORDER BY Country;
Customers테이블에서 Country를 겹치지 않게 Country 오름차순으로 정렬해서 가져오기
SELECT DISTINCT Country, City
FROM Customers
ORDER BY Country, City;
Customers테이블에서 Countyr, City를 정렬해서 가져오기
SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;
GROUP BY도 함께 사용할 수 있다.
Customers테이블에서 Country로 그룹화
Country, city별로 안겹치게 몇개인지 카운팅해서 가져오기
즉, 나라별로 몇 개의 city가 있는지 알 수 있다.
복습완료