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

MySQL ORDER BY로 알파벳 먼저, 숫자 나중에 정렬하는 방법

MySQL에서 알파벳 먼저, 숫자 나중에 정렬하기

MySQL에서 데이터를 정렬할 때 알파벳으로 시작하는 값이 먼저 오고, 숫자로 시작하는 값이 그 뒤에 오도록 처리해야 하는 경우가 있습니다. 이럴 때는 ORDER BY 절과 함께 정규식(regular expression)을 활용하면 간단하게 해결할 수 있습니다.

기본 문법

SELECT *FROM yourTableName
ORDER BY IF(yourColumnName RLIKE '^[a-z]', 1, 2),yourColumnName;

위 쿼리의 작동 원리를 살펴보겠습니다. RLIKE '^[a-z]'는 해당 컬럼의 값이 소문자 알파벳으로 시작하는지 검사합니다. 알파벳으로 시작하면 1을 반환하고, 그렇지 않으면(숫자로 시작하면) 2를 반환합니다. 오름차순 정렬에서 1이 2보다 앞에 위치하므로, 결과적으로 알파벳 항목이 먼저 출력되고 숫자 항목은 뒤쪽에 배치됩니다.

예제 테이블 생성

실제 동작을 확인하기 위해 테스트용 테이블을 먼저 만들어 보겠습니다.

mysql> create table AlphabetFirstThenNumberDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(20),
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.95 sec)

데이터 삽입

INSERT 명령을 사용해 알파벳으로 시작하는 이름과 숫자로 시작하는 이름을 섞어서 입력합니다.

mysql> insert into AlphabetFirstThenNumberDemo(Name) values('John');
Query OK, 1 row affected (0.37 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('Bob');
Query OK, 1 row affected (0.21 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('1Sam');
Query OK, 1 row affected (0.17 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('Carol');
Query OK, 1 row affected (0.22 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('2Larry');
Query OK, 1 row affected (0.31 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('David');
Query OK, 1 row affected (0.27 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('3Mike');
Query OK, 1 row affected (0.14 sec)
mysql> insert into AlphabetFirstThenNumberDemo(Name) values('Robert');
Query OK, 1 row affected (0.10 sec)

전체 데이터 확인

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select *from AlphabetFirstThenNumberDemo;

실행 결과는 다음과 같습니다. 현재는 입력 순서대로 저장되어 있어 정렬 규칙이 적용되지 않은 상태입니다.

+----+--------+
| Id | Name   |
+----+--------+
|  1 | John   |
|  2 | Bob    |
|  3 | 1Sam   |
|  4 | Carol  |
|  5 | 2Larry |
|  6 | David  |
|  7 | 3Mike  |
|  8 | Robert |
+----+--------+
8 rows in set (0.00 sec)

알파벳 우선 정렬 쿼리 실행

이제 알파벳이 먼저 오고 숫자가 뒤따르도록 정렬하는 쿼리를 실행합니다.

mysql> select *from AlphabetFirstThenNumberDemo
    -> ORDER BY IF(Name RLIKE '^[a-z]', 1, 2),Name;

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

+----+--------+
| Id | Name   |
+----+--------+
|  2 | Bob    |
|  4 | Carol  |
|  6 | David  |
|  1 | John   |
|  8 | Robert |
|  3 | 1Sam   |
|  5 | 2Larry |
|  7 | 3Mike  |
+----+--------+
8 rows in set (0.00 sec)

결과를 보면 Bob, Carol, David, John, Robert처럼 알파벳으로 시작하는 이름들이 가나다순으로 먼저 정렬되었고, 그 뒤에 1Sam, 2Larry, 3Mike처럼 숫자로 시작하는 이름들이 차례로 정렬된 것을 확인할 수 있습니다.

추가 팁

만약 대문자로 시작하는 값도 함께 처리해야 한다면 정규식 패턴을 '^[a-zA-Z]'로 변경하면 됩니다. 또한 MySQL 8.0 이상 버전에서는 REGEXP_LIKE() 함수를 사용해 같은 로직을 구현할 수도 있습니다. 이 기법은 회원명, 제품 코드 등 문자와 숫자가 섞인 데이터를 의미 있는 순서로 정렬해야 할 때 실무에서 유용하게 활용됩니다.