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

MySQL에서 ENUM 컬럼 값별 항목 수를 계산하는 방법

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 컬럼뿐 아니라 어떤 컬럼이든 값별 분포를 간단하게 집계할 수 있습니다.