MySQL에서 값 기준으로 카운트 조회하기
MySQL에서는 COUNT() 함수를 사용해 전체 레코드 수뿐만 아니라 특정 값에 해당하는 레코드 수도 함께 집계할 수 있습니다. 핵심은 IF() 함수를 COUNT() 내부에 조합하는 것입니다. 이번 글에서는 데모 테이블을 만들고, 값 조건별로 개수를 세는 방법을 단계별로 살펴보겠습니다.
1. 데모 테이블 생성
먼저 실습에 사용할 테이블을 생성합니다.
mysql> create table countValueDemo -> ( -> ShippingDatetime datetime, -> FirstValue int, -> SecondValue int -> ); Query OK, 0 rows affected (1.35 sec)
테이블에는 날짜(datetime) 컬럼과 두 개의 정수(int) 컬럼이 포함되어 있습니다.
2. 샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다. 일부러 NULL 값이 포함된 행도 넣어서, COUNT가 NULL을 어떻게 처리하는지 확인할 수 있도록 했습니다.
mysql> insert into countValueDemo values('2019-01-23',1,2);
Query OK, 1 row affected (0.24 sec)
mysql> insert into countValueDemo values('2017-02-21',NULL,2);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countValueDemo values('2016-04-12',1,NULL);
Query OK, 1 row affected (0.19 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from countValueDemo;
실행 결과는 다음과 같습니다.
+---------------------+------------+-------------+ | ShippingDatetime | FirstValue | SecondValue | +---------------------+------------+-------------+ | 2019-01-23 00:00:00 | 1 | 2 | | 2017-02-21 00:00:00 | NULL | 2 | | 2016-04-12 00:00:00 | 1 | NULL | +---------------------+------------+-------------+ 3 rows in set (0.00 sec)
4. 값 조건별로 개수 집계하기
이제 핵심 쿼리입니다. COUNT(*)로 전체 행 수를 구하고, 동시에 IF() 함수를 활용해 FirstValue가 1인 행과 SecondValue가 2인 행의 개수를 각각 집계합니다.
mysql> SELECT ShippingDatetime, -> COUNT(*), -> COUNT( IF( FirstValue = 1, 1, NULL ) ), -> COUNT( IF( SecondValue = 2, 1, NULL ) ) -> FROM countValueDemo;
실행 결과는 다음과 같습니다.
+---------------------+----------+----------------------------------------+-----------------------------------------+ | ShippingDatetime | COUNT(*) | COUNT( IF( FirstValue = 1, 1, NULL ) ) | COUNT( IF( SecondValue = 2, 1, NULL ) ) | +---------------------+----------+----------------------------------------+-----------------------------------------+ | 2019-01-23 00:00:00 | 3 | 2 | 2 | +---------------------+----------+----------------------------------------+-----------------------------------------+ 1 row in set (0.08 sec)
결과 해석
- COUNT(*): 3 — 테이블의 전체 행 수입니다.
- COUNT(IF(FirstValue = 1, 1, NULL)): 2 — FirstValue가 1인 행은 2개입니다(NULL인 행은 제외).
- COUNT(IF(SecondValue = 2, 1, NULL)): 2 — SecondValue가 2인 행 역시 2개입니다.
여기서 중요한 포인트는 COUNT() 함수가 NULL 값은 세지 않는다는 점입니다. 따라서 IF() 함수에서 조건을 만족하면 1을 반환하고, 만족하지 않으면 NULL을 반환하도록 작성하면 원하는 값만 정확하게 카운트할 수 있습니다. 이 방식은 CASE WHEN 절을 사용하는 것과 동일한 효과를 내며, 하나의 쿼리로 여러 조건의 집계 결과를 한 번에 얻을 수 있어 보고서나 통계 조회에 매우 유용합니다.