Mặc định MySQL sắp xếp theo mã ASCII (số 0-9 đứng trước chữ A-Z). Để đảo ngược: chữ cái trước, số sau, dùng IF(cot RLIKE '^[a-z]', 1, 2) trong ORDER BY.
Cú pháp
SELECT * FROM ten_bang ORDER BY IF(ten_cot RLIKE '^[a-z]', 1, 2), ten_cot;
RLIKE '^[a-z]' kiểm tra ký tự đầu là chữ cái (a-z, không phân biệt hoa/thường). Trả 1 cho chữ, 2 cho số/khác.
Ví dụ minh họa
Tạo bảng tên混合 chữ và số:
mysql> CREATE TABLE ChuCaiTruocSoSau (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Ten VARCHAR(20)
-> );
mysql> INSERT INTO ChuCaiTruocSoSau(Ten) VALUES
-> ('John'), ('Bob'), ('1Sam'), ('Carol'), ('2Larry'), ('David'), ('3Mike'), ('Robert');
Dữ liệu gốc (theo Id):
+----+--------+ | Id | Ten | +----+--------+ | 1 | John | | 2 | Bob | | 3 | 1Sam | | 4 | Carol | | 5 | 2Larry | | 6 | David | | 7 | 3Mike | | 8 | Robert | +----+--------+
Sắp xếp: chữ cái trước (A-Z), số sau (0-9)
mysql> SELECT * FROM ChuCaiTruocSoSau
-> ORDER BY IF(Ten RLIKE '^[a-z]', 1, 2), Ten;
Kết quả:
+----+--------+ | Id | Ten | +----+--------+ | 2 | Bob | | 4 | Carol | | 6 | David | | 1 | John | | 8 | Robert | | 3 | 1Sam | | 5 | 2Larry | | 7 | 3Mike | +----+--------+
Giải thích: Các tên bắt đầu bằng chữ (Bob, Carol, David, John, Robert) lên đầu, sắp xếp A-Z. Các tên bắt đầu bằng số (1Sam, 2Larry, 3Mike) xuống cuối, sắp xếp theo số.
Mở rộng: Dùng '^[0-9]' để kiểm tra số, '^[A-Za-z]' cho rõ ràng hơn.