반응형
MySQL에서 고정된 값들 중 하나만 저장해야 할 컬럼이 있을 때 ENUM 타입은 매우 유용한 데이터 타입이다. 특히 사용자 상태, 주문 상태, 결제 수단, 성별 등 정해진 값의 목록이 있을 경우 ENUM을 활용하면 데이터 무결성 유지, 공간 절약, 쿼리 간결화에 큰 이점을 제공한다.
✅ ENUM이란?
ENUM은 미리 정의한 문자열 목록 중 하나를 저장할 수 있는 데이터 타입이다. 내부적으로는 해당 값의 순서 인덱스(integer) 값으로 저장되어, 저장 공간이 작고 정렬 성능이 좋다.
기본 문법
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
status ENUM('active', 'inactive', 'pending')
);
이 테이블의 status 컬럼은 'active', 'inactive', 'pending' 중 하나의 값만 가질 수 있다.
반응형
✅ ENUM 컬럼 SELECT 조회 예제
가장 기본적인 SELECT 문이다.
SELECT name, status
FROM users
WHERE status = 'active';
ENUM 타입은 문자열로 비교가 가능하므로 일반적인 조건절에 사용할 수 있다.
✅ ENUM의 인덱스(정수값)로 조회하기
MySQL 내부에서는 ENUM('active', 'inactive', 'pending')을 각각 1, 2, 3으로 저장한다.
SELECT name, status
FROM users
WHERE status = 1;
이렇게 정수값으로도 비교가 가능하지만, 가독성이 떨어지므로 문자열을 사용하는 것이 권장된다.
✅ 정렬 시 자동으로 정의 순서대로 정렬된다
SELECT name, status
FROM users
ORDER BY status;
위 쿼리는 'active' → 'inactive' → 'pending' 순으로 정렬된다. 일반 문자열 타입이라면 알파벳 순서로 정렬되지만, ENUM은 정의된 순서대로 정렬되므로 비즈니스 로직에 맞춘 정렬이 가능하다.
✅ ENUM과 CASE 문을 활용한 보기 좋은 출력
SELECT name,
CASE status
WHEN 'active' THEN '활성 사용자'
WHEN 'inactive' THEN '비활성 사용자'
WHEN 'pending' THEN '승인 대기 중'
END AS status_ko
FROM users;
ENUM 컬럼을 그대로 사용할 수도 있지만, CASE 문을 이용해 출력 메시지를 한국어로 바꾸면 사용자 인터페이스에도 유리하다.
반응형
✅ ENUM 활용 예제: 주문 상태 관리
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
order_status ENUM('결제대기', '결제완료', '배송중', '배송완료', '취소')
);
특정 상태 주문 조회
SELECT *
FROM orders
WHERE order_status = '배송중';
복수 상태 조건
SELECT *
FROM orders
WHERE order_status IN ('배송중', '배송완료');
✅ ENUM의 장점 정리
장점 | 설명 |
데이터 무결성 보장 | 허용된 값 외에는 입력 불가 |
공간 절약 | 내부적으로 정수로 저장됨 |
정렬 편의성 | 정의한 순서대로 정렬됨 |
가독성 높은 SELECT 쿼리 | 문자열 조건 사용 가능 |
✅ ENUM 사용 시 주의사항
- ENUM 값 변경은 ALTER TABLE을 사용해야 하므로 수정이 자주 필요한 필드는 ENUM보다 별도 테이블 참조가 유리하다.
- NULL도 ENUM 값에 포함할 수 있지만, 명시적으로 넣어야 한다.
- ENUM은 다국어 시스템이나 동적으로 상태가 바뀌는 구조에는 적합하지 않을 수 있다.
✅ 공식 문서 링크
- ENUM Data Type (MySQL Reference):
https://dev.mysql.com/doc/refman/8.0/en/enum.html
반응형
'DB' 카테고리의 다른 글
[MySQL] SELECT INTO OUTFILE + LOAD DATA INFILE 완벽 가이드 – 쿼리 결과 파일로 저장하고 다시 불러오는 방법 (0) | 2025.06.30 |
---|---|
[MySQL] SELECT INTO OUTFILE로 결과를 파일로 저장하는 방법 총정리 (0) | 2025.06.30 |
[MySQL] UNION과 UNION ALL 완전정복 – 다중 SELECT 결과 통합의 모든 것 (0) | 2025.06.30 |
[MySQL] ENUM 성능 최적화와 실무 활용 팁 총정리 (0) | 2025.06.30 |
[MySQL] SELECT 쿼리를 VIEW로 추상화 (복잡한 SQL을 깔끔하게 관리) (1) | 2025.06.30 |
[MySQL] LOCK IN SHARE MODE 완전 정복 – 공유잠금, 읽기전용 (0) | 2025.06.30 |
[MySQL] SELECT FOR UPDATE 완벽 가이드 – 동시성 제어의 핵심 키워드 (0) | 2025.06.30 |
[MySQL] JSON 컬럼 SELECT 조회 완벽 가이드 (0) | 2025.06.26 |