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를 초과했던 데이터만 추출할 수 있다.