개요
MySQL에서 특정 값(예: 'John', 'Robert' 등)이 컬럼에 몇 번 등장하는지 확인하고 싶을 때가 있습니다. 이럴 때 SUM() 집계 함수를 활용하면 여러 개의 고유 값별 발생 횟수를 단 한 번의 쿼리로 동시에 계산할 수 있습니다.
1. 샘플 테이블 생성
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable636 (
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(100)
);
Query OK, 0 rows affected (0.51 sec)
2. 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 의도적으로 중복되는 이름('John', 'Robert')을 포함시켰습니다.
mysql> insert into DemoTable636(StudentFirstName) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Sam');
Query OK, 1 row affected (0.20 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Mike');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable636(StudentFirstName) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable636(StudentFirstName) values('Robert');
Query OK, 1 row affected (0.16 sec)3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable636;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------+------------------+
| StudentId | StudentFirstName |
+-----------+------------------+
| 1 | John |
| 2 | Robert |
| 3 | Robert |
| 4 | Sam |
| 5 | Mike |
| 6 | John |
| 7 | Robert |
+-----------+------------------+
7 rows in set (0.00 sec)
4. 알려진 고유 값의 발생 횟수 계산
다음은 SUM() 함수를 사용해 미리 알고 있는(열거 가능한) 고유 값들이 각각 몇 번 나타나는지 계산하는 쿼리입니다.
mysql> select
sum(StudentFirstName='John') AS JOHN_COUNT,
sum(StudentFirstName='Robert') AS ROBERT_COUNT,
sum(StudentFirstName='Sam') AS SAM_COUNT,
sum(StudentFirstName='Mike') AS MIKE_COUNT
from DemoTable636;
실행 결과는 다음과 같습니다.
+------------+--------------+-----------+------------+
| JOHN_COUNT | ROBERT_COUNT | SAM_COUNT | MIKE_COUNT |
+------------+--------------+-----------+------------+
| 2 | 3 | 1 | 1 |
+------------+--------------+-----------+------------+
1 row in set (0.00 sec)
동작 원리
이 기법이 작동하는 이유는 MySQL에서 불리언 표현식(StudentFirstName='John')이 조건을 만족하면 1, 만족하지 않으면 0으로 평가되기 때문입니다. SUM() 함수가 이 값들을 모두 더하면 자연스럽게 해당 조건을 만족하는 행의 개수, 즉 발생 횟수가 됩니다.
이 방식은 COUNT(CASE WHEN ... THEN 1 END) 패턴과 동일한 결과를 내지만 코드가 더 간결하다는 장점이 있습니다. 다만 열거할 값이 매우 많거나 사전에 값을 알 수 없는 경우에는 GROUP BY 절을 사용해 값별 개수를 집계하는 것이 더 적합합니다.