DATABASE

[MySQL] GROUP BY 와 HAVING 알아보기

yoonddo 2023. 7. 19. 17:32

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절 앞에 사용한다.