MySQL에서 데이터를 정렬할 때 기본적으로는 오름차순(ASC) 또는 내림차순(DESC)만 사용할 수 있습니다. 하지만 때로는 4, 2, 1, 3처럼 개발자가 직접 지정한 임의의 순서대로 결과를 정렬해야 하는 경우가 있습니다.
이럴 때 ORDER BY FIELD() 함수를 활용하면 원하는 사용자 지정 규칙대로 손쉽게 정렬할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
Number int
);
Query OK, 0 rows affected (0.55 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용하여 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable values(1); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable values(4); Query OK, 1 row affected (0.22 sec) mysql> insert into DemoTable values(2); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(3); Query OK, 1 row affected (0.14 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+--------+ | Number | +--------+ | 1 | | 4 | | 2 | | 3 | +--------+ 4 rows in set (0.00 sec)
현재 데이터는 입력된 순서인 1, 4, 2, 3 순으로 저장되어 있는 것을 확인할 수 있습니다.
4. FIELD() 함수로 사용자 지정 순서 정렬하기
이제 핵심인 ORDER BY FIELD() 쿼리입니다. 아래와 같이 작성하면 4, 2, 1, 3 순서대로 정렬됩니다.
mysql> select *from DemoTable order by field(Number,4,2,1,3);
출력 결과
+--------+ | Number | +--------+ | 4 | | 2 | | 1 | | 3 | +--------+ 4 rows in set (0.00 sec)
결과가 정확히 우리가 지정한 4 → 2 → 1 → 3 순서로 출력되었습니다.
FIELD() 함수의 동작 원리
FIELD(value, val1, val2, ...) 함수는 첫 번째 인자인 value가 이후 나열된 값들 중 몇 번째 위치에 해당하는지를 인덱스(1부터 시작)로 반환합니다. 예를 들어:
Number값이 4이면 → 1 반환Number값이 2이면 → 2 반환Number값이 1이면 → 3 반환Number값이 3이면 → 4 반환
ORDER BY는 이 반환값을 기준으로 오름차순 정렬하기 때문에, 결과적으로 지정한 순서대로 데이터가 정렬되는 것입니다.
참고 사항
- FIELD() 목록에 없는 값은 0을 반환하므로, 목록에 포함되지 않은 레코드는 가장 앞쪽에 정렬됩니다.
- 문자열 컬럼에도 동일하게 적용할 수 있어, 특정 상태값('완료', '진행중', '대기') 순서로 정렬하는 등 다양한 상황에서 유용하게 활용됩니다.
이처럼 ORDER BY FIELD()를 사용하면 별도의 정렬용 컬럼이나 CASE 문 없이도 간단하고 직관적으로 사용자 지정 정렬을 구현할 수 있습니다.