Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL의 WHERE 절 vs HAVING 절, 차이점 완벽 정리

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을 사용하는 것이 올바른 방법입니다.