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

MySQL 단일 쿼리로 부울(Boolean) 필드 값 집계하는 방법

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()을 조합하면 별도의 서브쿼리나 여러 번의 조회 없이도, 단 한 번의 쿼리로 부울 필드의 다양한 통계를 손쉽게 얻을 수 있습니다.