MySQL에서 일반적인 오름차순이나 내림차순 정렬이 아닌, 특정 값들을 우선적으로 배치하고 싶을 때가 있습니다. 이럴 때 ORDER BY 절과 IF() 함수를 함께 사용하면 원하는 순서대로 데이터를 손쉽게 정렬할 수 있습니다.
ORDER BY IF() 기본 문법
SELECT * FROM yourTableName
ORDER BY IF(yourColumnName=yourValue1 OR yourColumnName=yourValue2 OR yourColumnName=yourValue3,
yourColumnName, ~yourColumnName) ASC;
이 문법의 핵심은 다음과 같습니다.
- 조건에 해당하는 값(예: 300, 100, 10)은 그대로 양수로 반환되어 먼저 정렬됩니다.
- 조건에 해당하지 않는 값은 비트 NOT 연산자(
~)를 적용해 음수가 되므로, 오름차순 정렬 시 뒤로 밀려나게 됩니다.
예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다.
mysql> CREATE TABLE arrangeDataInSpecificOrder
-> (
-> StudentId int,
-> StudentName varchar(20)
-> );
Query OK, 0 rows affected (0.64 sec)
데이터 삽입하기
INSERT 명령어를 사용해 샘플 데이터를 입력합니다.
mysql> INSERT INTO arrangeDataInSpecificOrder VALUES(10,'Larry');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO arrangeDataInSpecificOrder VALUES(15,'Mike');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO arrangeDataInSpecificOrder VALUES(100,'Sam');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO arrangeDataInSpecificOrder VALUES(70,'Carol');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO arrangeDataInSpecificOrder VALUES(90,'Bob');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO arrangeDataInSpecificOrder VALUES(300,'David');
Query OK, 1 row affected (0.12 sec)
전체 데이터 조회하기
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> SELECT * FROM arrangeDataInSpecificOrder;
실행 결과는 다음과 같습니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 10 | Larry |
| 15 | Mike |
| 100 | Sam |
| 70 | Carol |
| 90 | Bob |
| 300 | David |
+-----------+-------------+
6 rows in set (0.00 sec)
특정 순서로 정렬하는 쿼리 실행하기
이제 StudentId가 300, 100, 10인 학생을 우선적으로 오름차순 정렬하고, 나머지 데이터는 그 뒤에 배치하는 쿼리를 실행해 보겠습니다.
mysql> SELECT * FROM arrangeDataInSpecificOrder
ORDER BY IF(StudentId=300 OR StudentId=100 OR StudentId=10,
StudentId, ~StudentId) ASC;
실행 결과는 다음과 같습니다.
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 10 | Larry |
| 100 | Sam |
| 300 | David |
| 90 | Bob |
| 70 | Carol |
| 15 | Mike |
+-----------+-------------+
6 rows in set (0.00 sec)
결과 분석
출력 결과를 보면 조건에 포함된 10 → 100 → 300 순서로 먼저 정렬되고, 나머지 행들은 90 → 70 → 15 순서로 뒤따르는 것을 확인할 수 있습니다.
그 이유는 다음과 같습니다.
- 조건이 참인 행:
IF()가StudentId값을 그대로 반환하므로 양수(10, 100, 300)가 되어 오름차순 정렬 시 앞쪽에 위치합니다. - 조건이 거짓인 행:
~StudentId(비트 NOT 연산) 결과가 음수가 되므로 자동으로 뒤쪽에 배치됩니다. 예를 들어~90은 -91,~70은 -71,~15는 -16이 되어 -91 < -71 < -16 순서로 정렬됩니다.
마무리
이처럼 ORDER BY IF()를 활용하면 별도의 CASE 문 없이도 간결하게 우선순위 기반 정렬을 구현할 수 있습니다. 우선순위 조건이 많아지거나 복잡해진다면 CASE WHEN 절을 사용하는 것도 좋은 대안이니 상황에 맞게 선택하시기 바랍니다.