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

MySQL에서 데이터를 원하는 순서대로 정렬하는 방법 – ORDER BY IF() 완벽 가이드

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 절을 사용하는 것도 좋은 대안이니 상황에 맞게 선택하시기 바랍니다.