개요
MySQL에서 ENUM 타입으로 선언된 열에 저장된 값 중 'NO' 값만 골라 개수를 집계해야 하는 경우가 종종 있습니다. 이 글에서는 예제 테이블을 만들고, GROUP BY와 SUM 함수를 활용해 이름별로 'NO' 값의 개수만 반환하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 이름(Name)과 수석 여부(isTopper)를 저장하는 테이블을 생성합니다. isTopper 열은 ENUM 타입으로 'YES'와 'NO' 두 값만 허용합니다.
mysql> create table DemoTable1829
(
Name varchar(20),
isTopper ENUM('YES','NO')
);
Query OK, 0 rows affected (0.00 sec)2. 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1829 values('Chris','yes');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1829 values('David','yes');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1829 values('Mike','no');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1829 values('David','yes');
Query OK, 1 row affected (0.00 sec)3. 전체 레코드 확인
SELECT 문으로 테이블의 모든 데이터를 조회해 보겠습니다.
mysql> select * from DemoTable1829;
실행 결과는 다음과 같습니다.
+-------+----------+ | Name | isTopper | +-------+----------+ | Chris | YES | | David | YES | | Mike | NO | | David | YES | +-------+----------+ 4 rows in set (0.00 sec)
4. 'NO' 값 개수만 집계하는 쿼리
핵심은 SUM(isTopper='no') 표현식입니다. MySQL에서 비교 조건식은 참일 때 1, 거짓일 때 0을 반환하므로, 이를 SUM으로 합산하면 각 그룹별 'NO' 값의 개수를 손쉽게 구할 수 있습니다.
mysql> select Name,sum(isTopper='no') from DemoTable1829 group by Name;
위 쿼리의 실행 결과는 다음과 같습니다.
+-------+--------------------+ | Name | sum(isTopper='no') | +-------+--------------------+ | Chris | 0 | | David | 0 | | Mike | 1 | +-------+--------------------+ 3 rows in set (0.00 sec)
결과 해석
출력 결과를 보면 Chris와 David는 'NO' 값을 가진 레코드가 없어 0이 반환되었고, Mike는 'NO' 값이 하나 있으므로 1이 반환되었습니다.
참고: COUNT를 활용한 대안
SUM 대신 COUNT를 사용할 수도 있습니다. 다만 COUNT는 NULL이 아닌 값의 개수를 세므로, CASE 표현식과 함께 사용해야 원하는 결과를 얻을 수 있습니다.
mysql> select Name, count(case when isTopper='no' then 1 end) as NO_Count from DemoTable1829 group by Name;
두 방법 모두 동일한 결과를 제공하지만, 조건부 집계에는 일반적으로 SUM(조건식) 방식이 더 간결하고 널리 사용됩니다.
마무리
이처럼 MySQL에서는 GROUP BY 절과 SUM 함수의 불리언 연산 특성을 활용하면 별도의 복잡한 서브쿼리 없이도 특정 값의 개수를 간단하게 집계할 수 있습니다. ENUM 타입뿐 아니라 VARCHAR 등 다른 문자열 타입의 열에도 동일하게 적용할 수 있으니 실무에서 유용하게 활용해 보시기 바랍니다.