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

MySQL ENUM 값은 표현식에서 어떻게 사용될까? 인덱스 기반 연산 완벽 정리

MySQL 열거형(ENUM) 값과 표현식

MySQL에서 ENUM(열거형) 컬럼에 저장된 각 값은 내부적으로 인덱스 번호와 연결되어 있습니다. 이때 인덱스는 1부터 시작하며, 빈 문자열('')은 0, NULL은 NULL로 처리됩니다.

따라서 ENUM 값을 산술 표현식이나 집계 함수에 사용하면, MySQL은 문자열 자체가 아니라 연결된 인덱스 숫자를 기준으로 모든 계산을 수행합니다. 아래 예제를 통해 이 동작 방식을 확인해 보겠습니다.

예제 테이블 준비

mysql> Select * from Result;
+-----+--------+-------+
| Id  | Name   | Grade |
+-----+--------+-------+
| 100 | Gaurav | GOOD  |
| 101 | Rahul  | POOR  |
| 102 | Rahul  | NULL  |
| 103 | Mohan  |       |
+-----+--------+-------+
4 rows in set (0.00 sec)

위 테이블의 Grade 컬럼은 ENUM 타입으로 선언되어 있으며, 예를 들어 ENUM('POOR','GOOD')과 같이 정의되었다면 각 값의 인덱스는 다음과 같습니다.

  • GOOD → 인덱스 2
  • POOR → 인덱스 1
  • NULL → NULL
  • 빈 문자열('') → 인덱스 0

SUM() 함수에 ENUM 값 사용하기

mysql> Select SUM(Grade) from result;
+------------+
| SUM(Grade) |
+------------+
|          3 |
+------------+
1 row in set (0.00 sec)

SUM(Grade)의 결과가 3인 이유는, GOOD(2) + POOR(1) = 3으로 계산되었기 때문입니다. NULL과 빈 문자열 행은 합산에서 제외되거나 0으로 처리됩니다.

AVG() 함수에 ENUM 값 사용하기

mysql> Select AVG(Grade) from result;
+------------+
| AVG(Grade) |
+------------+
|          1 |
+------------+
1 row in set (0.00 sec)

AVG(Grade) 역시 인덱스 값을 기준으로 평균을 계산합니다. 유효한 인덱스 값(2와 1)의 평균이 계산되어 결과적으로 1이 반환됩니다.

산술 연산자와 함께 사용하기

mysql> Select Grade+0 from result;
+---------+
| Grade+0 |
+---------+
|       2 |
|       1 |
|    NULL |
|       0 |
+---------+
4 rows in set (0.00 sec)

mysql> Select Grade-1 from result;
+---------+
| Grade-1 |
+---------+
|       1 |
|       0 |
|    NULL |
|      -1 |
+---------+
4 rows in set (0.00 sec)

Grade+0 쿼리 결과를 보면 각 ENUM 값이 실제로 어떤 인덱스 숫자와 매핑되어 있는지 명확하게 드러납니다. GOOD은 2, POOR는 1, NULL은 그대로 NULL, 빈 문자열은 0으로 변환되었습니다. 마찬가지로 Grade-1 연산에서도 인덱스 값에서 1을 뺀 결과가 반환됩니다.

정리

이처럼 MySQL에서 ENUM 값을 표현식에 사용하면 문자열 비교가 아닌 내부 인덱스 숫자 기반의 산술 연산이 수행됩니다. 따라서 ENUM 컬럼을 수치 계산에 활용할 때는 각 값의 인덱스 매핑 규칙(1부터 시작, 빈 문자열은 0, NULL은 NULL 유지)을 반드시 기억해야 의도하지 않은 결과를 피할 수 있습니다.