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

MySQL에서 특정 열 값이 0인 행만 조회하는 방법 – GROUP BY와 HAVING 절 활용하기

개요

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 절에 그룹화 기준 열이 아닌 열을 포함할 때 오류가 발생할 수 있으니 이 점도 함께 유의하시기 바랍니다.