2021-12-09 14:54 작성

My SQL basic 메모

Table of contents

HAVING 도입

HAVINGSELECT에서 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;

HAVINGGROUP 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 절 안에서 복잡한 조건을 만들기 위해 ORAND 같은 논리 연산자를 사용할 수 있다.

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