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

MySQL에서 WHERE 절에 SUM() 함수를 쓸 수 없는 이유와 HAVING 절 활용법

MySQL에서는 집계 함수인 SUM()의 결과를 WHERE 절에서 직접 사용할 수 없습니다. 대신 HAVING 절을 사용해야 합니다. 그 이유는 WHERE 절이 그룹화가 이루어지기 전에 행 단위로 필터링하는 반면, HAVING 절은 GROUP BY로 그룹화된 이후의 집계 결과에 대해 조건을 적용하기 때문입니다.

아래 예제를 통해 실제 동작 방식을 살펴보겠습니다.

1. 테이블 생성

먼저 예제에 사용할 테이블을 생성합니다.

mysql> create table DemoTable
(
    Name varchar(50),
    Price int
);
Query OK, 0 rows affected (0.79 sec)

2. 데이터 삽입

INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.

mysql> insert into DemoTable values('Chris',30);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('David',40);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('Chris',10);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Mike',44);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable values('David',5);
Query OK, 1 row affected (0.17 sec)

3. 전체 데이터 조회

SELECT 문으로 테이블의 모든 레코드를 확인합니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+-------+-------+
| Name  | Price |
+-------+-------+
| Chris | 30    |
| David | 40    |
| Chris | 10    |
| Mike  | 44    |
| David | 5     |
+-------+-------+
5 rows in set (0.00 sec)

4. HAVING 절에서 SUM() 결과 사용하기

이제 이름(Name)별로 가격(Price)의 합계를 구한 뒤, 합계가 40보다 큰 그룹만 조회하는 쿼리입니다. 여기서 SUM() 함수의 결과에 조건을 적용하기 위해 HAVING 절을 사용합니다.

mysql> select Name,SUM(Price) AS Total_Price from DemoTable group by Name having Total_Price > 40;

실행 결과는 다음과 같습니다.

+-------+-------------+
| Name  | Total_Price |
+-------+-------------+
| David | 45          |
| Mike  | 44          |
+-------+-------------+
2 rows in set (0.03 sec)

정리

  • WHERE 절: 그룹화 이전의 개별 행을 필터링하므로 SUM(), COUNT(), AVG() 같은 집계 함수를 사용할 수 없습니다.
  • HAVING 절: GROUP BY로 그룹화된 이후의 집계 결과에 조건을 적용할 수 있습니다.

따라서 MySQL에서 SUM() 함수의 결과를 조건으로 활용하려면 반드시 HAVING 절을 사용해야 하며, 별칭(Alias)을 지정하면 위 예제처럼 더 읽기 쉬운 쿼리를 작성할 수 있습니다.