한빛미디어 출판사의 <MySQL로 배우는 데이터베이스 개론과 실습>을 학습하며 작성한 글입니다.
+---------+--------+--------+-----------+------------+
| 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
를 사용할 경우 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;
bookid
는 GROUP BY
에서 사용한 속성이 아니기 때문에 SELECT
절에서 사용할 수 없습니다.
다음의 규칙을 모두 만족해야 합니다.
HAVING
절은 GROUP BY
절과 함께 작성해야 한다.WHERE
절보다 뒤에 위치한다. 가격이 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절에서 조건을 입력하면 되기 때문이다.