데이터베이스/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;

'데이터베이스 > SQL' 카테고리의 다른 글

[SQL] JOIN  (0) 2021.02.26
[SQL] ORDER BY  (0) 2021.02.26
[SQL] SELECT, INSERT, UPDATE, DELETE  (0) 2021.02.26