데이터베이스/SQL
[SQL] GROUP BY, HAVING
4Legs
2021. 2. 26. 17:45
집계 함수와 GROUP
COUNT, SUM, AVG, MAX, MIN
- Customers 테이블에서 국적이 영국인 고객의 수를 조회
SELECT COUNT(*) AS Result
FROM Customers
WHERE Country = 'UK';
COUNT는 NULL값을 세지 않는다.
Products 테이블에서 2번 카테고리에 속한 제품의 가격 총합을 조회
SELECT CategoryID, SUM(Price) as SumOfPrice
FROM Products
WHERE CategoryID = 2;
- OrderDetails 테이블에서 10248번 주문의 평균 구매수량 조회
SELECT OrderID, AVG(Quantity) as AvgOfQuantity
FROM OrderDetails
WHERE OrderID = 10248;
- OrderDetails 테이블에서 가장 많은 수량의 주문에 대해 주문 번호, 제품 번호, 구매 수량 조회
SELECT OrderID, ProductID, MAX(Quantity) AS MaxOfQuantity
FROM OrderDetails;
DISTINCT
- Products 테이블에서 가격이 50달러 이상인 제품을 포함하는 카테고리 아이디를 조회
SELECT DISTINCT CategoryID
FROM Products
WHERE Price >= 50;
- DISTINCT 를 제거하면 6이 두 번 조회된다.
GROUP BY
데이터들을 원하는 그룹으로 나눈다. GROUP BY 절에 들어가는 칼럼명은 반드시 SELECT 절에도 들어가야 한다.
- Customers 테이블에서 각 국적 별 고객 수를 조회
SELECT Country, COUNT(CustomerID) AS NumOfCustomer
FROM Customers
GROUP BY Country
ORDER BY NumOfCustomer DESC;
- Products 테이블에서 각 카테고리 별 평균 가격 조회
SELECT CategoryID, AVG(Price) AS AvgPrice
FROM Products
GROUP BY CategoryID;
- 집계 함수 없이 사용하면 DISTINCT와 비슷한 용도로 사용할 수 있다.
//각 카테고리의 아이디를 한 번씩 출력한다.
SELECT CategoryID
FROM Products
GROUP BY CategoryID;
HAVING
WHERE 절에는 집계 함수를 사용할 수 없다.
HAVING 절은 집계함수로 조건식을 구성할 때 사용한다.
GROUP BY 절과 함께 사용한다.
WHERE 절에서 먼저 조건에 의해 컬럼들이 걸러진 후에 HAVING 절에 의해 그룹화된다.
Orders 테이블에서 5번 이상 주문한 고객의 아이디와 그 횟수를 출력
SELECT CustomerID, COUNT(OrderID) AS OrderCnt
FROM Orders
GROUP BY CustomerID
HAVING OrderCnt >= 5;