MySQL에서 하나의 쿼리로 여러 열에 대한 조건부 COUNT를 동시에 구하고 싶다면, 집계 함수 SUM()과 IF()를 함께 사용하면 됩니다. 이 방법을 활용하면 각 조건마다 별도의 쿼리를 실행할 필요 없이 단 한 번의 조회로 원하는 결과를 얻을 수 있습니다.
1. 테이블 생성하기
먼저 예제로 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable
(
FirstName varchar(100),
LastName varchar(100)
);
Query OK, 0 rows affected (2.80 sec)2. 샘플 데이터 삽입하기
INSERT 명령어를 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable values('Adam','Smith');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable values('John','Smith');
Query OK, 1 row affected (0.36 sec)
mysql> insert into DemoTable values('John','Doe');
Query OK, 1 row affected (1.38 sec)
mysql> insert into DemoTable values('Bob','Doe');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('Sam','Smith');
Query OK, 1 row affected (0.25 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-----------+----------+ | FirstName | LastName | +-----------+----------+ | Adam | Smith | | John | Smith | | John | Doe | | Bob | Doe | | Sam | Smith | +-----------+----------+ 5 rows in set (0.00 sec)
4. 여러 열에 대한 다중 COUNT 쿼리 실행하기
이제 핵심인 쿼리입니다. SUM()과 IF()를 조합하여 FirstName이 'John'인 행의 개수와 LastName이 'Smith'인 행의 개수를 동시에 집계할 수 있습니다.
mysql> select sum(if(FirstName='John',1,0)) as John_Count, sum(if(LastName='Smith',1,0)) as Smith_Count from DemoTable;
실행 결과는 다음과 같습니다.
+------------+-------------+ | John_Count | Smith_Count | +------------+-------------+ | 2 | 3 | +------------+-------------+ 1 row in set (0.00 sec)
동작 원리
IF(조건, 1, 0)은 조건이 참이면 1을, 거짓이면 0을 반환합니다. 따라서 FirstName이 'John'인 행은 2개('John Smith', 'John Doe')이므로 John_Count는 2가 되고, LastName이 'Smith'인 행은 3개('Adam Smith', 'John Smith', 'Sam Smith')이므로 Smith_Count는 3이 됩니다.
이처럼 SUM(IF()) 패턴을 활용하면 여러 개의 COUNT 서브쿼리를 작성하는 것보다 훨씬 간결하고 효율적으로 조건별 집계를 처리할 수 있습니다. MySQL 8.0 이상에서는 COUNT(CASE WHEN ... THEN 1 END) 또는 SUM(조건) 형태로도 동일한 결과를 얻을 수 있습니다.