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;
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