MySQL에서 GROUP BY와 함께 HAVING 절을 사용하면 그룹화된 결과에 조건을 적용할 수 있습니다. WHERE 절은 그룹화 이전의 개별 행에 조건을 걸지만, HAVING 절은 집계 함수(MAX, MIN, COUNT 등)를 기준으로 그룹 단위의 조건을 검사할 때 사용합니다.
기본 문법
GROUP BY와 HAVING을 함께 사용하는 기본 문법은 다음과 같습니다. 여기서는 HAVING 절에 최댓값 조건을 설정하여 특정 값보다 작은 최대값을 가진 그룹만 조회합니다.
SELECT yourColumnName FROM yourTableName GROUP BY yourColumnName HAVING MAX(yourColumnName) < yourValue;
예제 테이블 생성
실습을 위해 먼저 MySQL에서 테이블을 생성해 보겠습니다. 사용자 프로세스 ID와 스레드 ID를 저장하는 테이블입니다.
mysql> create table WhereAfterGroupDemo -> ( -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> UserProcess int, -> UserThreadId int -> ); Query OK, 0 rows affected (5.74 sec)
데이터 삽입
INSERT 명령을 사용하여 테이블에 샘플 데이터를 입력합니다.
mysql> insert into WhereAfterGroupDemo(UserProcess,UserThreadId) values(1211,3); Query OK, 1 row affected (0.10 sec) mysql> insert into WhereAfterGroupDemo(UserProcess,UserThreadId) values(1412,3); Query OK, 1 row affected (0.39 sec) mysql> insert into WhereAfterGroupDemo(UserProcess,UserThreadId) values(1510,4); Query OK, 1 row affected (0.19 sec) mysql> insert into WhereAfterGroupDemo(UserProcess,UserThreadId) values(1511,4); Query OK, 1 row affected (0.31 sec)
전체 데이터 조회
SELECT문을 사용하여 테이블의 모든 레코드를 확인합니다.
mysql> select *from WhereAfterGroupDemo;
실행 결과
+--------+-------------+--------------+ | UserId | UserProcess | UserThreadId | +--------+-------------+--------------+ | 1 | 1211 | 3 | | 2 | 1412 | 3 | | 3 | 1510 | 4 | | 4 | 1511 | 4 | +--------+-------------+--------------+ 4 rows in set (0.00 sec)
테이블에는 총 4개의 레코드가 있으며, 스레드 ID 3에는 프로세스 값 1211과 1412가, 스레드 ID 4에는 프로세스 값 1510과 1511이 각각 속해 있습니다.
GROUP BY와 HAVING을 활용한 쿼리
이제 GROUP BY와 HAVING을 함께 사용하여, 프로세스 값이 1510 미만인 스레드 ID를 조회하는 쿼리를 실행해 보겠습니다.
mysql> SELECT UserThreadId FROM WhereAfterGroupDemo GROUP BY UserThreadId HAVING MAX(UserProcess) < 1510;
실행 결과
+--------------+ | UserThreadId | +--------------+ | 3 | +--------------+ 1 row in set (0.00 sec)
결과 분석
쿼리는 스레드 ID별로 데이터를 그룹화한 후, 각 그룹의 프로세스 최댓값이 1510보다 작은 경우만 반환합니다. 스레드 ID 3의 최대 프로세스 값은 1412로 조건을 만족하지만, 스레드 ID 4의 최대 프로세스 값은 1511로 조건을 벗어나므로 결과에서 제외되었습니다.
이처럼 HAVING 절은 MAX(), MIN(), COUNT(), SUM() 같은 집계 함수의 결과에 조건을 적용할 수 있어, GROUP BY로 그룹화된 데이터를 세밀하게 필터링할 때 매우 유용합니다.