Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL sắp xếp cột số theo thứ tự tăng dần (ASC)?

Vấn đề

Khi cột số được lưu trữ dưới dạng chuỗi (VARCHAR), sắp xếp mặc định sẽ theo thứ tự chữ cái (lexicographic), dẫn đến kết quả sai: 10, 100, 11, 78, 89, 97 thay vì 10, 11, 78, 89, 97, 100.

Giải pháp: Sử dụng CAST()

Hàm CAST() chuyển đổi kiểu dữ liệu, cho phép sắp xếp đúng theo giá trị số.

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Score INT
);

mysql> INSERT INTO DemoTable(Score) VALUES(10);
mysql> INSERT INTO DemoTable(Score) VALUES(100);
mysql> INSERT INTO DemoTable(Score) VALUES(11);
mysql> INSERT INTO DemoTable(Score) VALUES(97);
mysql> INSERT INTO DemoTable(Score) VALUES(78);
mysql> INSERT INTO DemoTable(Score) VALUES(89);

Dữ liệu gốc

mysql> SELECT * FROM DemoTable;
+----+-------+
| Id | Score |
+----+-------+
| 1  | 10    |
| 2  | 100   |
| 3  | 11    |
| 4  | 97    |
| 5  | 78    |
| 6  | 89    |
+----+-------+

Truy vấn sắp xếp đúng với CAST()

mysql> SELECT * FROM DemoTable 
    -> ORDER BY CAST(Score AS SIGNED INTEGER) ASC;

Kết quả đúng

+----+-------+
| Id | Score |
+----+-------+
| 1  | 10    |
| 3  | 11    |
| 5  | 78    |
| 6  | 89    |
| 4  | 97    |
| 2  | 100   |
+----+-------+

Các tùy chọn CAST() khác

  • CAST(Score AS UNSIGNED): Số nguyên không dấu
  • CAST(Score AS DECIMAL(10,2)): Số thập phân
  • Score + 0: Cách viết tắt chuyển chuỗi thành số

Lưu ý

Nếu cột đã là kiểu số (INT, DECIMAL), không cần CAST(). Chỉ cần ORDER BY Score ASC.