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

MySQL에서 날짜(타임스탬프)와 열거형(ENUM) 기준으로 정렬하는 쿼리 방법

날짜(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 타입은 문자열이 아닌 내부 인덱스 번호로 저장되기 때문에, 정렬 시 알파벳 순서가 아닌 컬럼 정의 시 나열한 순서대로 정렬된다는 점도 기억해두면 유용합니다.