GROUP BY
GROUP BY문은 동일한 값을 가진 컬럼을 기준으로 그룹별 연산을 적용한다.
그룹화를 하기 위해 집계함수 (COUNT, MAX, MIN, SUM, AVG)와 함께 자주 사용된다.
예시 테이블 BOOK
BOOK_NAME | CATEGORY | PRICE |
세이노의 가르침 | 소설 | 7000 |
꿀벌의 예언1 | 소설 | 14000 |
돈의속성 | 재테크 | 16000 |
구의 증명 | 소설 | 10800 |
바다가 들리는 편의점 | 소설 | 14000 |
너무나 많은 여름이 | 소설 | 14000 |
미식가의 수첩 | 요리 | 17000 |
집으로 초대 | 요리 | 27000 |
마음의 자유 | 에세이 | 15000 |
예를들어 위와 같이 BOOK 테이블이 있다고 가정하고 카테고리의 종류와 갯수를 구하고자 한다.
그럼 다음과 같이 SQL문을 작성할 수 있다.
SELECT CATEGORY , COUNT(*)
FROM BOOK
GROUP BY CATEGORY
이를 실행하면 결과는 다음과 같다.
CATEGORY | COUNT(*) |
소설 | 5 |
재테크 | 1 |
요리 | 2 |
에세이 | 1 |
GROUP BY로 CATEGORY의 중복된 결과 값들을 하나로 묶어준다고 생각하면 된다.
HAVING
GROUP BY 절에서 생성된 결과값 중 원하는 조건에 부함하는 데이터만 볼 때 사용한다.
GROUP BY문과 ORDER BY문 사이에 작성한다.
위의 BOOK 테이블에서 GROUP BY CATEGORY 해준 결과값에서 CATEGORY가 2개 이상인
결과들만 다시 구하려고 한다. 그럼 아래와 같이 SQL문을 작성할 수 있다.
SELECT CATEGORY , COUNT(*)
FROM BOOK
GROUP BY CATEGORY
HAVING COUNT(*) >= 2
실행하면 결과는 다음과 같다
CATEGORY | COUNT(*) |
소설 | 5 |
요리 | 2 |
CATEGORY에 특정 문자가 포함된 결과만 구하고싶으면 다음과 같이 작성할 수 있다.
SELECT CATEGORY , COUNT(*)
FROM BOOK
GROUP BY CATEGORY
HAVING CATEGORY LIKE '%소%';
결과는 다음과 같다.
CATEGORY | COUNT(*) |
소설 | 5 |
같은 카테고리의 도서들의 총가격을 구하고 싶다면 다음과 같이 작성할 수 있다.
SELECT CATEGORY , COUNT(*) , SUM(PRICE) AS PRICE
FROM BOOK
GROUP BY CATEGORY
결과는 다음과 같다.
CATEGORY | COUNT(*) | PRICE |
소설 | 5 | 59,800 |
재테크 | 1 | 15,000 |
요리 | 2 | 44,000 |
에세이 | 1 | 16,000 |
이 때 총 가격이 20000원 이상인 결과만 구하고 싶다면 다음과 같이 작성할 수 있다.
SELECT CATEGORY , COUNT(*) , SUM(PRICE) AS PRICE
FROM BOOK
GROUP BY CATEGORY
HAVING PRICE >= 20000
CATEGORY | COUNT(*) | PRICE |
소설 | 5 | 59,800 |
요리 | 2 | 44,000 |
HAVING / WHERE 차이점
- HAVING절과 WHERE절은 비슷하지만 HAVING은 그룹 전체, WHERE은 개별 행에 적용된다.
- HAVING은 SQL SELECT문이 집계 값이 지정된 조건을 충족하는 행만 반환하도록 지정하는 SQL 절이다.
WHERE은 단일테이블에서 데이터를 가져오거나 여러 테이블과 결합해 조건을 지정하는데 사용되는 SQL절이다. - HAVING절은 그룹을 필터링 하는데 사용하며 WHERE절은 행을 필터링 하는데 사용한다.
- 집계함수는 HAVING절과 함께 사용할 수 있다.
- WHERE절은 HAVING절에 포함된 하위 쿼리에 있지 않으면 집계함수와 함께 사용할 수 없다.
HAVING절은 GROUP BY절 뒤에 사용하며 WHERE절은 GROUP BY절 앞에 사용한다.
'DATABASE' 카테고리의 다른 글
JDBC, Spring JDBC, MyBatis, JPA 의 DB 접근 방식 알아보기 (0) | 2023.12.13 |
---|---|
[MySQL] WITH문 알아보기 (0) | 2023.07.20 |
[MySQL] 트랜잭션 (Transaction) 알아보기 (0) | 2023.07.10 |
[MySQL] 서브 쿼리 (SubQuery) 알아보기 (0) | 2023.07.08 |
[MySQL] DATEDIFF(), DATEADD() 함수 알아보기 (0) | 2023.07.06 |