ENUM 타입으로 선언된 컬럼이 포함된 MySQL 테이블에서 각 항목(값)별 개수를 구하고 싶다면, GROUP BY 절과 집계 함수인 COUNT()를 함께 사용하면 됩니다. 이 조합은 특정 컬럼의 고유한 값들을 그룹으로 묶은 뒤, 각 그룹에 속한 행의 수를 손쉽게 집계해 줍니다.
아래에서 실제 예제를 통해 단계별로 살펴보겠습니다.
1. ENUM 컬럼을 가진 테이블 생성하기
먼저 Size라는 ENUM 컬럼을 포함하는 테이블을 생성합니다. ENUM은 미리 정의해 둔 값 목록('S', 'M', 'L', 'XL') 중 하나만 저장할 수 있는 편리한 데이터 타입입니다.
mysql> create table DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Size ENUM('S','M','L','XL')
);
Query OK, 0 rows affected (0.69 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 여러 개의 레코드를 추가합니다. 의도적으로 같은 크기 값을 반복해서 삽입하여, 나중에 그룹별 개수가 어떻게 집계되는지 확인할 수 있도록 했습니다.
mysql> insert into DemoTable(Size) values('L');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(Size) values('S');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Size) values('S');
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable(Size) values('M');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Size) values('XL');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(Size) values('M');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(Size) values('M');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(Size) values('M');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable(Size) values('XL');
Query OK, 1 row affected (0.08 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+----+------+ | Id | Size | +----+------+ | 1 | L | | 2 | S | | 3 | S | | 4 | M | | 5 | XL | | 6 | M | | 7 | M | | 8 | M | | 9 | XL | +----+------+ 9 rows in set (0.00 sec)
총 9개의 레코드가 저장되어 있습니다. 이제 각 ENUM 값이 몇 번씩 등장했는지 집계해 보겠습니다.
4. ENUM 값별 개수 집계 쿼리
GROUP BY 절로 Size 컬럼의 값을 그룹화하고, COUNT() 함수로 각 그룹의 행 수를 계산합니다. 별칭(Alias)을 사용해 결과 컬럼 이름을 Frequency로 지정하면 가독성이 더 좋아집니다.
mysql> SELECT tbl.Size, COUNT(1) AS Frequency
FROM DemoTable tbl
GROUP BY tbl.Size;위 쿼리는 다음과 같은 결과를 출력합니다.
+------+-----------+ | Size | Frequency | +------+-----------+ | L | 1 | | S | 2 | | M | 4 | | XL | 2 | +------+-----------+ 4 rows in set (0.00 sec)
결과 해석 및 참고 사항
결과를 보면 L은 1개, S는 2개, M은 4개, XL은 2개씩 존재함을 한눈에 알 수 있습니다. 총합(1 + 2 + 4 + 2 = 9)이 전체 행 수와 일치하는 것도 확인됩니다.
추가로 알아두면 좋은 내용은 다음과 같습니다.
- COUNT(1) vs COUNT(*): 두 표현식 모두 그룹 내 전체 행 수를 반환하므로 성능상 차이는 없습니다. 다만 COUNT(컬럼명)처럼 특정 컬럼을 지정하면 해당 컬럼이 NULL인 행은 제외되니 주의해야 합니다.
- NULL 처리: ENUM 컬럼에 NULL이 허용되어 있다면, GROUP BY 결과에 NULL 그룹도 함께 표시될 수 있습니다. 필요하다면 WHERE 절로 NULL 값을 먼저 필터링하세요.
- 정렬 순서: ENUM 값은 기본적으로 정의 순서(내부 인덱스 순)대로 정렬됩니다. 만약 알파벳순으로 정렬하고 싶다면 쿼리 끝에 ORDER BY CAST(tbl.Size AS CHAR)를 추가하면 됩니다.
- 빈도순 정렬: 개수가 많은 순서대로 보고 싶다면 ORDER BY Frequency DESC를 붙여주면 됩니다.
이처럼 GROUP BY와 COUNT()만 활용하면 ENUM 컬럼뿐 아니라 어떤 컬럼이든 값별 분포를 간단하게 집계할 수 있습니다.