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

MySQL에서 특정 순서대로 레코드 가져오기 – ORDER BY IF() 활용법

MySQL에서는 ORDER BY IF() 구문을 활용하면 원하는 조건에 맞는 레코드를 우선적으로 표시하고, 나머지 레코드를 지정한 기준으로 정렬할 수 있습니다. 이번 글에서는 예제 테이블을 만들고, 특정 학과(Branch)의 데이터를 앞쪽에 배치하는 방법을 단계별로 살펴보겠습니다.

1. 예제 테이블 생성

먼저 아래 쿼리로 테스트용 테이블을 생성합니다.

mysql> create table DemoTable
(
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName varchar(20),
    Branch varchar(20)
);
Query OK, 0 rows affected (1.96 sec)

2. 샘플 데이터 삽입

INSERT 명령어를 사용해 여러 개의 레코드를 추가합니다.

mysql> insert into DemoTable(FirstName,Branch) values('John','CS');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable(FirstName,Branch) values('Carol','ME');
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable(FirstName,Branch) values('David','ME');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName,Branch) values('Bob','CE');
Query OK, 1 row affected (0.35 sec)
mysql> insert into DemoTable(FirstName,Branch) values('Robert','EE');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(FirstName,Branch) values('Chris','EEE');
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable(FirstName,Branch) values('James','ME');
Query OK, 1 row affected (0.56 sec)

3. 전체 레코드 조회

SELECT 문으로 테이블의 모든 데이터를 확인해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+----+-----------+--------+
| Id | FirstName | Branch |
+----+-----------+--------+
|  1 | John      | CS     |
|  2 | Carol     | ME     |
|  3 | David     | ME     |
|  4 | Bob       | CE     |
|  5 | Robert    | EE     |
|  6 | Chris     | EEE    |
|  7 | James     | ME     |
+----+-----------+--------+
7 rows in set (0.00 sec)

4. 특정 순서로 정렬하는 쿼리

이제 Branch가 'ME'인 레코드를 가장 먼저 표시하고, 나머지 레코드는 Branch 기준으로 오름차순 정렬하는 쿼리를 작성해 보겠습니다.

mysql> select *from DemoTable order by if(Branch='ME',1,0) DESC,Branch;

실행 결과는 다음과 같습니다.

+----+-----------+--------+
| Id | FirstName | Branch |
+----+-----------+--------+
|  2 | Carol     | ME     |
|  3 | David     | ME     |
|  7 | James     | ME     |
|  4 | Bob       | CE     |
|  1 | John      | CS     |
|  5 | Robert    | EE     |
|  6 | Chris     | EEE    |
+----+-----------+--------+
7 rows in set (0.00 sec)

동작 원리

IF(Branch='ME', 1, 0)은 Branch 값이 'ME'이면 1을, 그렇지 않으면 0을 반환합니다. 이 값을 내림차순(DESC)으로 정렬하면 'ME'에 해당하는 레코드가 항상 상단에 위치하게 됩니다. 이후 두 번째 정렬 기준인 Branch 오름차순이 적용되어, 나머지 레코드들은 알파벳 순으로 깔끔하게 정렬됩니다.

이처럼 ORDER BY 절과 IF() 함수를 조합하면 별도의 CASE 문 없이도 간결하게 우선순위 기반 정렬을 구현할 수 있으며, 조건이 여러 개일 경우에는 CASE WHEN을 함께 활용하면 더욱 유연한 처리가 가능합니다.