[SQL] GROUP BY 와 HAVING 사용 시 주의사항

신재우·2023년 9월 1일
0

한빛미디어 출판사의 <MySQL로 배우는 데이터베이스 개론과 실습>을 학습하며 작성한 글입니다.

Orders 테이블

+---------+--------+--------+-----------+------------+
| orderid | custid | bookid | saleprice | orderdate  |
+---------+--------+--------+-----------+------------+
|       1 |      1 |      1 |      6000 | 2014-07-01 |
|       2 |      1 |      3 |     21000 | 2014-07-03 |
|       3 |      2 |      5 |      8000 | 2014-07-03 |
|       4 |      3 |      6 |      6000 | 2014-07-04 |
|       5 |      4 |      7 |     20000 | 2014-07-05 |
|       6 |      1 |      2 |     12000 | 2014-07-07 |
|       7 |      4 |      8 |     13000 | 2014-07-07 |
|       8 |      3 |     10 |     12000 | 2014-07-08 |
|       9 |      2 |     10 |      7000 | 2014-07-09 |
|      10 |      3 |      8 |     13000 | 2014-07-10 |
+---------+--------+--------+-----------+------------+

GROUP BY <속성>

GROUP BY를 사용할 경우 SELECT 절에는 GROUP BY에서 사용한 속성집계 함수만 나올 수 있습니다.

집계 함수는 COUNT, SUM, AVG, MIN, MAX를 의미합니다.

맞는 예

SELECT custid, SUM(saleprice)
FROM Orders
GROUP BY custid;

틀린 예

SELECT bookid, SUM(saleprice)
FROM Orders
GROUP BY custid;

bookidGROUP BY에서 사용한 속성이 아니기 때문에 SELECT절에서 사용할 수 없습니다.

HAVING <검색조건>

다음의 규칙을 모두 만족해야 합니다.

  1. HAVING 절은 GROUP BY절과 함께 작성해야 한다.
  2. WHERE 절보다 뒤에 위치한다.
  3. 집계함수를 사용한다.

맞는 예

가격이 8천 원 이상인 도서를 구매한 고객에 대하여 고객별 주문 도서 총 수량을 구한다. 단, 책을 두 권 이상 구매한 고객만 구한다.

SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING count(*) >= 2;

틀린 예

# 1. GROUP BY 없음
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
HAVING count(*) >= 2;
# 2. WHERE 절 앞에 위치
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
HAVING count(*) >= 2
WHERE saleprice >= 8000
GROUP BY custid;
# 3. 집계함수
SELECT custid, COUNT(*) AS 도서수량
FROM Orders
WHERE saleprice >= 8000
GROUP BY custid
HAVING custid = 2;

1, 2번 예는 에러가 발생한다. 3번 예는 실행되지만 올바른 사용법이 아니다. WHERE절에서 조건을 입력하면 되기 때문이다.

0개의 댓글