2021-12-09 14:54 작성
My SQL basic 메모
HAVING 도입
HAVING은 SELECT에서 rows로 구성된 하나의 group 혹은 합계 추산을 위한 필터링 조건들을 명확히 하는데 사용된다.
HAVING 절은 종종 GROUP BY와 같이 사용되어 구체화된 조건에 기반해 groups를 필터링하는데 사용된다. 만약 GROUP BY 절을 빼게 되면 HAVING 절은 WHERE 절처럼 작동한다.
다음은 HAVING의 문법적 사용법은 다음과 같다:
SELECT
select_list
FROM
table_name
WHERE
search_condition
GROUP BY
group_by_expression
HAVING
group_condition;
HAVING은 GROUP BY에 의해 반환되는 각각의 group를 평가한다. 만약 결과가 true라면, 해당 row는 결과값으로 출력된다.
NOTICE: HAVING은 rows로 이루어진 각각의 group 마다 필터링 조건을 적용하지만, 반면에 WHERE은 각각의 개별 row마다 필터링 조건을 적용한다는 점에 주목해야 한다.
예시
HAVING의 작동방식을 이해하기 위해 아래와 같은 샘플 table을 이용한다고 가정한다.
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceeach*quantityOrdered) AS total
FROM
orderdetails
GROUP BY
ordernumber
HAVING
total > 60000;
output:
| ordernumber | itemsCount | total |
|---|---|---|
| 10165 | 670 | 67392.85 |
| 10287 | 595 | 61402.00 |
| 10310 | 619 | 61234.67 |
HAVING 절 안에서 복잡한 조건을 만들기 위해 OR과 AND 같은 논리 연산자를 사용할 수 있다.
다음의 예시에서 HAVING 절은 total이 1000을 초과하고, itemsCount가 600을 초과하는 group을 찾는다.
SELECT
ordernumber,
SUM(quantityOrdered) AS itemsCount,
SUM(priceEach * quantityOrdered) AS total
FROM
orderdetails
GROUP BY ordernumber
HAVING
total > 50000 AND
itemsCount > 600;
output:
| ordernumber | itemsCount | total |
|---|---|---|
| 10106 | 675 | 52151.81 |
| 10126 | 617 | 57131.92 |
| 10135 | 607 | 55601.84 |
| 10165 | 670 | 67392.85 |
| 10168 | 642 | 50743.65 |
| 10204 | 619 | 58793.53 |
| 10207 | 615 | 59265.14 |
| 10212 | 612 | 59830.55 |
| 10222 | 717 | 56822.65 |
…
Shipped 상태이며 total이 1500 보다 큰 orders를 찾는다고 가정해보자, 그렇다면 orderdetails table과 orders table을 INNER JOIN으로 합치고 status column과 total에 조건을 적용할 것이다:
SELECT
a.ordernumber,
status,
SUM(priceEach * quantityOrdered) total
FROM
orderdetails a
INNER JOIN orders b
ON b.ordernumber = a.ordernumber
GROUP BY
ordernumber,
status
HAVING
status = 'Shipped' AND
total > 1500;
output:
| ordernumber | status | total |
|---|---|---|
| 10100 | Shipped | 10223.83 |
| 10101 | Shipped | 10549.01 |
| 10102 | Shipped | 5494.78 |
| 10103 | Shipped | 50218.95 |
| 10104 | Shipped | 40206.20 |
| 10105 | Shipped | 53959.21 |
| 10106 | Shipped | 52151.81 |
| 10107 | Shipped | 22292.62 |
HAVING은 높은 수준의 보고 데이터를 생산하는데 유용한다. 예를 들어, HAVING을 이용해 이번 달, 이번 분기 혹은 이번 연도의 판매액 중 10K를 초과했던 데이터만 추출할 수 있다.