본문 바로가기
DB & SQL

MySQL HAVING

by pms93 2023. 1. 11.

HAVING절은 WHERE절과 동일하게 조건을 수행할 때 사용한다.

WHERE절이 있는데 왜 HAVING절을 사용하는지에 대한 이유는 통계레코드에 대해선 WHERE절을 통해 조건을 명시할 수 없기 때문이다.

W3Schools에서 제공하는 Demo Database를 통해 예시를 알아보자.

 

● Customers

 - 고객명단 테이블

 - CustomerID == PK

( W3Schools Demo Database 인용 )

● Orders

 - 주문내역 테이블

 - OrderID, CustomerID == PK

( W3Schools Demo Database 인용 )

● Products

 - 상품 테이블

 - ProductID, CategoryID == PK

( W3Schools Demo Database 인용 )

● Categories

 - 카테고리 테이블

 - CategoryID == PK

( W3Schools Demo Database 인용 )

● OrderDetails

 - OrderDetailID, OrderID, ProductID == PK

 - Quantity = 수량

( W3Schools Demo Database 인용 )

ex) 각 나라별 몇명의 고객이 분포되어 있는지에 대한 집계를 한다. ( 단, 거주자 5명 이하의 데이터는 레코드에 포함시키지 않는다. )

SELECT COUNTRY,
               COUNT(CustomerID)
FROM Customers
GROUP BY COUNTRY
HAVING COUNT(CustomerID) > 5  
-> HAVING절 뒤에 COUNT(CustomerID) > 5 조건을 명시함으로서 5이하의 데이터는 레코드에 포함되지 않게끔 할 수 있다.

( W3Schools Demo Database 인용 )

 

ex) 주문내역이 15회 이상인 고객들에 한하여 래코드를 반환받는다.

SELECT CustomerName name,
               COUNT(OrderID)
FROM (Customers
LEFT JOIN Orders
             ON Customers.CustomerID = Orders.CustomerID)
GROUP BY CustomerName
HAVING COUNT(OrderID) > 15

( W3Schools Demo Database 인용 )

모든 고객의 이름과 COUNT와 GROUP BY를 통해 주문 횟수를 집계한다. 이후 HAVING절에 조건을 명시함으로서 주문내역 15회 이상인 고객만 반환받고 있다.

 

ex) 카테고리별 상품들의 평균 가격과 판매된 총 개수를 집계한다. ( 총 판매개수 200개 이상만 집계 )

SELECT Categories.CategoryName,
               AVG(Products.Price) AverageOfPrice,
               COUNT(Quantity) CountOfQuantity
FROM Products
INNER JOIN Categories
               ON Products.CategoryID = Categories.CategoryID
INNER JOIN OrderDetails
               ON Products.ProductID = OrderDetails.ProductID
GROUP BY CategoryName
HAVING COUNT(Quantity) > 200
ORDER BY CountOfQuantity

( W3Schools Demo Database 인용 )

먼저 Products테이블과 Categories테이블을 공용Column인 CategoryID로 INNER JOIN함으로서 CategoryName과 AVG(Products.Price)를 반환받는다.

이후 OrderDetails와 공용Column인 ProductID로 INNER JOIN함으로서 COUNT(Quantity)를 반환받는다.

위 레코드를 CategoryName으로 GROUP지정 후 HAVING절에 판매수량(Quantity)이 200개 이상의 조건을 명시함으로서 위 사진과 같은 레코드를 반환받고 있다.

'DB & SQL' 카테고리의 다른 글

MySQL EXISTS / NOT EXISTS  (0) 2023.01.12
My SQL 변수선언(ROWNUM)  (0) 2023.01.11
MySQL GROUP BY  (0) 2023.01.11
MySQL UNION  (0) 2023.01.05
MySQL JOIN문  (0) 2023.01.04