Study/DB

[MySQL] GROUP BY HAVING 사용법 및 예제

 

HAVING 절은 GROUP BY에 의해 생성된 그룹 데이터를 대상으로 조건을 적용할 수 있습니다.

 

사용법

기본 구조는 다음과 같습니다.

SELECT [컬럼명]
FROM [테이블명]
WHERE [조건]
GROUP BY [컬럼명]
HAVING [조건]

 

WHERE 절은 테이블 데이터 전체에 조건을 걸고, HAVING 절은 그룹화된 데이터에 조건을 건다는 차이가 있습니다.

WHERE과 HAVING 절은 용도가 달라서 필요에 맞게 사용하면 됩니다.

 

HAVING 조건 예제

# 인구의 총 합이 100,000,000이 넘는 국가 조회
select Code, Name, sum(Population)
from country
group by Code
having sum(Population) > 100000000;

GROUP BY HAVING 예제 쿼리 실행 결과
GROUP BY HAVING 예제 쿼리 실행 결과

HAVING 절을 사용해서 그룹화된 데이터에 조건을 걸었습니다.

WHERE 절과 다르게, HAVING 절에는 count나 sum 같은 그룹 함수를 사용하여 조건을 걸 수 있습니다.

 

 

 

 

그룹 함수 뿐만 아니라 다음과 같이 사용할 수 있습니다.

# SELECT 절에서 사용된 컬럼 조건 사용
select Code, Name, sum(Population)
from country
group by Code
having Code = 'BGD';

select Code, Name, sum(Population)
from country
group by Code
having Name like 'P%';

# SELECT 절에 없는 그룹 함수 사용
select Code, Name, sum(Population)
from country
group by Code
having count(1) > 1;

# 컬럼 별칭을 조건에 사용
select Code, Name, sum(Population) as 'sum'
from country
group by Code
having sum > 100000000;

 

이처럼 HAVING 절에는 컬럼, 그룹 함수, 컬럼 별칭을 사용할 수 있습니다.

 

컬럼 별칭을 HAVING 절에 사용하는 것에 대해 추가적으로 설명을 드리면,

SELECT 쿼리는 FROM -> WHERE -> GROUP BY -> HAVING -> SELECT 순서로 실행됩니다.

그래서 원래대로라면 HAVING 절에서는 컬럼의 별칭을 사용할 수 없지만, MySQL이 내부에서 별도로 처리를 하기 때문에 SELECT에 사용된 별칭을 HAVING 절에서 사용할 수 있다고 합니다.

 

Reference

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

https://dba.stackexchange.com/questions/50391/why-does-mysql-allow-having-to-use-select-aliases

https://dev.mysql.com/doc/refman/8.0/en/problems-with-alias.html