MySQL에서 알파벳순이나 오름차순·내림차순 같은 기본 정렬이 아닌, 사용자가 지정한 특정 단어(값)의 순서대로 데이터를 정렬하고 싶다면 ORDER BY 절과 함께 FIELD() 함수를 사용해야 합니다.
FIELD() 함수는 두 번째 인수부터 나열된 값들 중에서 첫 번째 인수와 일치하는 값의 위치 인덱스를 반환합니다. 이 특성을 활용하면 원하는 순서를 직접 정의하여 정렬할 수 있습니다.
예제를 통해 살펴보겠습니다. 먼저 테이블을 생성합니다.
mysql> create table DemoTable
(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentFirstName varchar(20),
StudentFavouriteSubject varchar(100)
);
Query OK, 0 rows affected (0.52 sec)테이블에 샘플 데이터 삽입하기
INSERT 명령을 사용해 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('Larry','Java');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('Sam','C');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('Bob','MongoDB');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(StudentFirstName,StudentFavouriteSubject) values('David','MySQL');
Query OK, 1 row affected (0.17 sec)저장된 전체 레코드 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> select *from DemoTable;
위 쿼리는 다음과 같은 결과를 출력합니다.
+-----------+------------------+-------------------------+ | StudentId | StudentFirstName | StudentFavouriteSubject | +-----------+------------------+-------------------------+ | 1 | Larry | Java | | 2 | Sam | C | | 3 | Bob | MongoDB | | 4 | David | MySQL | +-----------+------------------+-------------------------+ 4 rows in set (0.00 sec)
ORDER BY FIELD()로 사용자 정의 순서 정렬하기
이제 FIELD() 함수를 사용해 'MongoDB', 'MySQL', 'Java', 'C' 순서대로 과목을 정렬하는 쿼리를 실행해 보겠습니다.
mysql> select *from DemoTable ORDER BY FIELD(`StudentFavouriteSubject`, 'MongoDB','MySQL','Java','C');
실행 결과는 다음과 같습니다.
+-----------+------------------+-------------------------+ | StudentId | StudentFirstName | StudentFavouriteSubject | +-----------+------------------+-------------------------+ | 3 | Bob | MongoDB | | 4 | David | MySQL | | 1 | Larry | Java | | 2 | Sam | C | +-----------+------------------+-------------------------+ 4 rows in set (0.03 sec)
FIELD() 함수 동작 원리
출력 결과를 보면 컬럼 값이 FIELD() 함수에 나열한 순서('MongoDB' → 'MySQL' → 'Java' → 'C') 그대로 정렬된 것을 확인할 수 있습니다.
참고로, 목록에 없는 값은 인덱스 0을 반환하므로 해당 행들은 가장 앞쪽에 배치됩니다. 내림차순(DESC)으로 정렬하면 목록에 없는 값들이 뒤쪽으로 밀려나게 되니, 상황에 맞게 활용하시기 바랍니다.