MySQL의 WHERE 절과 HAVING 절, 무엇이 다를까?
MySQL에서 데이터를 조회할 때 조건에 맞는 결과만 걸러내기 위해 WHERE 절과 HAVING 절을 사용합니다. 두 절은 비슷해 보이지만 적용 시점과 용도가 명확하게 다릅니다.
WHERE 절이란?
WHERE 절은 개별 행(row) 단위로 선택 기준을 지정하여 테이블에서 필요한 레코드만 골라내는 필터 역할을 합니다. 즉, 그룹화가 이루어지기 전에 각 행을 대상으로 조건을 평가합니다.
HAVING 절이란?
HAVING 절은 GROUP BY로 묶인 행 그룹 또는 집계 결과(SUM, COUNT, AVG 등)에 대한 필터 조건을 지정할 때 사용합니다. 그룹화 이후의 결과에 조건을 적용한다는 점이 WHERE와 가장 큰 차이입니다.
핵심 차이: 집계 함수 사용 여부
WHERE 절은 집계 함수와 함께 사용할 수 없지만, HAVING 절은 집계 함수와 함께 사용할 수 있습니다. 아래 예제를 통해 직접 확인해 보겠습니다.
1. 예제 테이블 생성
mysql> create table WhereDemo
-> (
-> Price int
-> );
Query OK, 0 rows affected (0.64 sec)
2. 레코드 삽입
mysql> insert into WhereDemo values(100); Query OK, 1 row affected (0.13 sec) mysql> insert into WhereDemo values(200); Query OK, 1 row affected (0.21 sec) mysql> insert into WhereDemo values(300); Query OK, 1 row affected (0.15 sec) mysql> insert into WhereDemo values(400); Query OK, 1 row affected (0.12 sec)
3. 전체 레코드 조회
mysql> select *from WhereDemo;
실행 결과는 다음과 같습니다.
+-------+ | Price | +-------+ | 100 | | 200 | | 300 | | 400 | +-------+ 4 rows in set (0.00 sec)
4. HAVING 절과 집계 함수 함께 사용하기
HAVING 절은 집계 함수와 함께 사용할 수 있으므로 아래 쿼리는 정상적으로 실행됩니다.
mysql> select sum(Price) from WhereDemo HAVING Sum(Price) > 500;
전체 합계가 1000이므로 조건(SUM(Price) > 500)을 만족하여 결과가 반환됩니다.
+------------+ | sum(Price) | +------------+ | 1000 | +------------+ 1 row in set (0.00 sec)
5. WHERE 절에 집계 함수를 사용하면?
반면 WHERE 절에 집계 함수를 사용하면 오류가 발생합니다.
mysql> select sum(Price) from WhereDemo where Sum(Price) > 200; ERROR 1111 (HY000): Invalid use of group function
"Invalid use of group function"이라는 에러가 발생하는 이유는 WHERE 절이 행이 그룹화되기 전에 평가되기 때문입니다. 이 시점에는 SUM()과 같은 집계 값이 아직 계산되지 않았으므로 집계 함수를 사용할 수 없습니다.
정리
- WHERE 절: 개별 행을 필터링하며 GROUP BY 이전에 적용됩니다. 집계 함수 사용 불가.
- HAVING 절: 그룹 또는 집계 결과를 필터링하며 GROUP BY 이후에 적용됩니다. 집계 함수 사용 가능.
- 일반적인 조건 필터링은 WHERE를, 집계 결과에 대한 조건은 HAVING을 사용하는 것이 올바른 방법입니다.