날짜(DATE) 컬럼과 열거형(ENUM) 컬럼을 동시에 기준으로 데이터를 정렬하려면 ORDER BY DATE() 구문을 활용하면 됩니다. 이 글에서는 실제 예제를 통해 두 조건을 함께 적용해 정렬하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 DATE 타입의 컬럼과 ENUM 타입의 컬럼을 가진 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> JoiningDate date,
-> Status ENUM('Good','Excellent','Bad')
-> );
Query OK, 0 rows affected (0.58 sec)
2. 레코드 삽입하기
INSERT 명령어를 사용해 테이블에 몇 개의 레코드를 추가합니다. 이때 일부 레코드는 날짜 값 없이 상태(Status) 값만 입력합니다.
mysql> insert into DemoTable values('2019-01-21','Excellent');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Status) values('Bad');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Status) values('Good');
Query OK, 1 row affected (0.13 sec)3. 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-------------+-----------+
| JoiningDate | Status |
+-------------+-----------+
| 2019-01-21 | Excellent |
| NULL | Bad |
| NULL | Good |
+-------------+-----------+
3 rows in set (0.00 sec)
4. 날짜와 ENUM 기준으로 정렬하기
이제 날짜(JoiningDate)를 오름차순으로 먼저 정렬하고, 그다음 ENUM 타입인 Status를 기준으로 정렬하는 쿼리입니다.
mysql> select *from DemoTable
-> order by DATE(JoiningDate) ASC, Status asc;
실행 결과는 다음과 같습니다.
+-------------+-----------+
| JoiningDate | Status |
+-------------+-----------+
| NULL | Good |
| NULL | Bad |
| 2019-01-21 | Excellent |
+-------------+-----------+
3 rows in set (0.00 sec)
정렬 결과 분석
결과를 보면 흥미로운 점을 확인할 수 있습니다. MySQL에서는 기본적으로 NULL 값을 오름차순 정렬 시 가장 앞에 배치하기 때문에, JoiningDate가 NULL인 레코드들이 먼저 출력되었습니다. 그리고 NULL 그룹 내부에서는 ENUM 컬럼인 Status의 선언 순서(Good → Excellent → Bad)에 따라 'Good'이 'Bad'보다 먼저 정렬된 것을 볼 수 있습니다.
만약 NULL 값을 마지막에 배치하고 싶다면 다음과 같이 ISNULL() 함수를 활용할 수 있습니다.
mysql> select *from DemoTable
-> order by ISNULL(JoiningDate), DATE(JoiningDate) ASC, Status asc;
또한 ENUM 타입은 문자열이 아닌 내부 인덱스 번호로 저장되기 때문에, 정렬 시 알파벳 순서가 아닌 컬럼 정의 시 나열한 순서대로 정렬된다는 점도 기억해두면 유용합니다.