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

MySQL 단일 쿼리에서 여러 COUNT() 한 번에 구현하기 – CASE 문 활용법

단일 MySQL 쿼리에서 여러 COUNT() 구현하기

조건별 레코드 개수를 각각 별도의 쿼리로 조회하지 않고, 하나의 쿼리에서 여러 COUNT() 값을 동시에 얻으려면 CASE 문을 활용하면 됩니다. 이 방식은 집계 보고서를 만들 때 쿼리 실행 횟수를 줄여 성능 면에서도 유리합니다.

먼저 실습용 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
-> (
-> LastName varchar(100)
-> );
Query OK, 0 rows affected (0.60 sec)

1. 테이블에 데이터 삽입

INSERT 명령으로 몇 개의 레코드를 추가합니다.

mysql> insert into DemoTable values('Smith');
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values('Brown');
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values('Brown');
Query OK, 1 row affected (0.13 sec)

mysql> insert into DemoTable values('Smith');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values('Taylor');
Query OK, 1 row affected (0.15 sec)

mysql> insert into DemoTable values('Taylor');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values('Miller');
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values('Miller');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable values('Miller');
Query OK, 1 row affected (0.12 sec)

2. 저장된 전체 레코드 확인

SELECT 문으로 테이블의 모든 레코드를 조회합니다.

mysql> select *from DemoTable;

출력 결과

+----------+
| LastName |
+----------+
| Smith |
| Brown |
| Brown |
| Smith |
| Taylor |
| Taylor |
| Miller |
| Miller |
| Miller |
+----------+
9 rows in set (0.00 sec)

3. CASE 문으로 여러 COUNT()를 하나의 쿼리에서 처리

다음은 CASE 문을 이용해 단일 쿼리에서 조건별 COUNT() 값을 함께 구하는 쿼리입니다. 각 컬럼이 어떤 성씨의 빈도를 나타내는지 알 수 있도록 별칭(alias)을 서로 다르게 지정했습니다.

mysql> select COUNT(CASE WHEN LastName='Smith' THEN 1 END) AS SmithFrequency,
-> COUNT(CASE WHEN LastName='Brown' THEN 1 END) AS BrownFrequency,
-> COUNT(CASE WHEN LastName='Taylor' THEN 1 END) AS TaylorFrequency,
-> COUNT(CASE WHEN LastName='Miller' THEN 1 END) AS MillerFrequency
-> from DemoTable;

출력 결과

+----------------+----------------+-----------------+-----------------+
| SmithFrequency | BrownFrequency | TaylorFrequency | MillerFrequency |
+----------------+----------------+-----------------+-----------------+
| 2 | 2 | 2 | 3 |
+----------------+----------------+-----------------+-----------------+
1 row in set (0.00 sec)

동작 원리와 참고 사항

CASE WHEN LastName='Smith' THEN 1 END는 조건이 일치할 때만 1을 반환하고, 그렇지 않으면 NULL을 반환합니다. COUNT() 함수는 NULL을 세지 않기 때문에, 결과적으로 각 조건에 해당하는 행만 정확히 집계됩니다.

이처럼 CASE 문과 COUNT()를 조합하면 여러 번의 쿼리 없이도 조건별 통계를 한 번에 계산할 수 있어, 대시보드나 리포트용 집계 쿼리 작성 시 매우 유용합니다.