MySQL에서 부울(Boolean) 필드의 값을 단일 쿼리로 집계하려면 CASE 문과 SUM() 함수를 함께 사용하면 됩니다. 이 글에서는 예제용 데모 테이블을 만들고, 학생의 합격 여부(isPassed)처럼 저장된 부울 값을 참·거짓 건수와 비율까지 한 번에 계산하는 방법을 단계별로 알아보겠습니다.
예제 테이블 생성
먼저 아래와 같이 데모 테이블을 생성합니다. isPassed 컬럼은 tinyint(1) 타입으로, 0은 불합격(false), 1은 합격(true)을 의미합니다.
mysql> create table countBooleanFieldDemo
-> (
-> StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentFirstName varchar(20),
-> isPassed tinyint(1)
-> );
Query OK, 0 rows affected (0.63 sec)
샘플 데이터 삽입
INSERT 명령을 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Larry',0);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Mike',1);
Query OK, 1 row affected (0.17 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Sam',0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Carol',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Bob',1);
Query OK, 1 row affected (0.16 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('David',1);
Query OK, 1 row affected (0.13 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Ramit',0);
Query OK, 1 row affected (0.28 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Chris',1);
Query OK, 1 row affected (0.20 sec)
mysql> insert into countBooleanFieldDemo(StudentFirstName,isPassed) values('Robert',1);
Query OK, 1 row affected (0.16 sec)
저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from countBooleanFieldDemo;
실행 결과는 다음과 같습니다.
+-----------+------------------+----------+ | StudentId | StudentFirstName | isPassed | +-----------+------------------+----------+ | 1 | Larry | 0 | | 2 | Mike | 1 | | 3 | Sam | 0 | | 4 | Carol | 1 | | 5 | Bob | 1 | | 6 | David | 1 | | 7 | Ramit | 0 | | 8 | Chris | 1 | | 9 | Robert | 1 | +-----------+------------------+----------+ 9 rows in set (0.00 sec)
단일 쿼리로 부울 값 집계하기
아래 쿼리를 사용하면 isPassed 필드의 참(1)·거짓(0) 개수와 두 값의 비율을 한 번의 쿼리로 계산할 수 있습니다.
mysql> select sum(isPassed= 1) as `True`, sum(isPassed = 0) as `False`, -> ( -> case when sum(isPassed = 1) > 0 then sum(isPassed = 0) / sum(isPassed = 1) -> end -> )As TotalPercentage -> from countBooleanFieldDemo;
실행 결과는 다음과 같습니다.
+------+-------+-----------------+ | True | False | TotalPercentage | +------+-------+-----------------+ | 6 | 3 | 0.5000 | +------+-------+-----------------+ 1 row in set (0.00 sec)
쿼리 동작 원리
- sum(isPassed = 1): MySQL에서 비교 조건이 참이면 1, 거짓이면 0을 반환합니다. 따라서 이 식을 합산하면 합격(true)인 행의 개수가 됩니다.
- sum(isPassed = 0): 같은 원리로 불합격(false)인 행의 개수를 구합니다.
- CASE 문: 합격자 수가 0보다 클 때만 나눗셈을 수행하여 0으로 나누는 오류 상황을 방지하고, 불합격 대비 합격 비율(TotalPercentage)을 계산합니다.
이처럼 CASE 문과 조건부 SUM()을 조합하면 별도의 서브쿼리나 여러 번의 조회 없이도, 단 한 번의 쿼리로 부울 필드의 다양한 통계를 손쉽게 얻을 수 있습니다.