개요
MySQL에서 특정 열의 값이 0인 행만 골라내고 싶은데, 동시에 다른 열을 기준으로 그룹화해야 하는 경우가 있습니다. 이럴 때는 GROUP BY 절과 함께 HAVING 절을 사용하면 됩니다.
이 글에서는 실제 예제 테이블을 만들고, 단계별로 쿼리를 작성하며 원하는 결과를 얻는 과정을 살펴보겠습니다.
1. 예제 테이블 생성
먼저 연습용 테이블을 생성합니다. 고객 ID(ClientId)와 결혼 여부(isMarried)를 저장하는 간단한 구조입니다.
mysql> create table DemoTable1344
-> (
-> `SequenceId` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ClientId int,
-> isMarried tinyint(1)
-> );
Query OK, 0 rows affected (0.49 sec)- SequenceId: 자동 증가되는 기본 키
- ClientId: 고객 식별 번호
- isMarried: 결혼 여부 (0 = 미혼, 1 = 기혼)
2. 샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1344(ClientId,isMarried) values(4567,0); Query OK, 1 row affected (0.45 sec) mysql> insert into DemoTable1344(ClientId,isMarried) values(9876,0); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable1344(ClientId,isMarried) values(5432,1); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1344(ClientId,isMarried) values(4567,1); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable1344(ClientId,isMarried) values(9873,0); Query OK, 1 row affected (0.15 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1344;
실행 결과는 다음과 같습니다.
+------------+----------+-----------+ | SequenceId | ClientId | isMarried | +------------+----------+-----------+ | 1 | 4567 | 0 | | 2 | 9876 | 0 | | 3 | 5432 | 1 | | 4 | 4567 | 1 | | 5 | 9873 | 0 | +------------+----------+-----------+ 5 rows in set (0.00 sec)
여기서 주목할 점은 ClientId가 4567인 고객은 두 개의 레코드(isMarried가 각각 0과 1)를 가지고 있다는 것입니다.
4. GROUP BY와 HAVING으로 조건 조회
이제 핵심 질의입니다. ClientId를 기준으로 그룹화한 뒤, 그룹 내 isMarried 값이 0뿐인 행만 선택하려면 다음과 같이 작성합니다.
mysql> select SequenceId,ClientId,isMarried -> from DemoTable1344 -> group by ClientId -> having isMarried=0;
실행 결과:
+------------+----------+-----------+ | SequenceId | ClientId | isMarried | +------------+----------+-----------+ | 1 | 4567 | 0 | | 2 | 9876 | 0 | | 5 | 9873 | 0 | +------------+----------+-----------+ 3 rows in set (0.00 sec)
결과 해석
쿼리 실행 결과, isMarried 값이 0인 세 개의 행이 반환되었습니다. HAVING isMarried=0 조건 덕분에 그룹화된 결과 중에서 해당 조건을 만족하는 행만 필터링된 것입니다.
참고:
WHERE절은 그룹화 이전에 개별 행을 필터링하지만,HAVING절은 그룹화 이후에 집계된 결과에 조건을 적용합니다. 따라서GROUP BY와 함께 조건을 걸 때는HAVING을 사용하는 것이 올바른 방법입니다.
마무리
이처럼 MySQL에서 특정 열 값이 0인 행을 다른 열 기준으로 그룹화하여 조회하려면 GROUP BY + HAVING 조합을 활용하면 됩니다. SQL_MODE 설정에 따라 ONLY_FULL_GROUP_BY 옵션이 활성화된 환경이라면, SELECT 절에 그룹화 기준 열이 아닌 열을 포함할 때 오류가 발생할 수 있으니 이 점도 함께 유의하시기 바랍니다.