Trong bài viết này, bạn sẽ học cách sắp xếp các hàng trong tập kết quả bằng cách sử dụng mệnh đề ORDER BY của MySQL.
Khi bạn sử dụng câu lệnh SELECT để truy vấn dữ liệu từ một bảng, thứ tự của các hàng trong tập kết quả là không xác định. Để sắp xếp các hàng trong tập kết quả, bạn thêm mệnh đề ORDER BY vào câu lệnh SELECT.
Sau đây minh họa cú pháp của mệnh đề ORDER BY:
SELECT select_list FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;
Trong đoạn code trên, bạn chỉ định một hoặc nhiều cột mà bạn muốn sắp xếp sau mệnh đề ORDER BY .
ASC là viết tắt của tăng dần và DESC là viết tắt của giảm dần. Bạn sử dụng ASC để sắp xếp tập kết quả theo thứ tự tăng dần và DESC để sắp xếp tập kết quả theo thứ tự giảm dần tương ứng.
Mệnh đề ORDER BY này sắp xếp kết quả được đặt theo các giá trị column1 theo thứ tự tăng dần:
ORDER BY column1 ASC;
Và mệnh đề ORDER BY này sắp xếp kết quả được đặt bởi các giá trị column1 theo thứ tự giảm dần:
ORDER BY column1 DESC;
Theo mặc định, mệnh đề ORDER BY sử dụng ASC nếu bạn không chỉ định rõ ràng bất kỳ tùy chọn nào. Do đó, các mệnh đề ORDER BY sau đây là tương đương:
ORDER BY column1 ASC;
Và:
ORDER BY column1;
Nếu bạn muốn sắp xếp kết quả được đặt theo nhiều cột, bạn chỉ định danh sách các cột được phân tách bằng dấu phẩy trong mệnh đề ORDER BY:
ORDER BY column1, column2;
Trong trường hợp này, mệnh đề ORDER BY sắp xếp kết quả được đặt bởi column1 theo thứ tự tăng dần trước và sắp xếp kết quả được sắp xếp bởi column2 theo thứ tự tăng dần.
Có thể sắp xếp kết quả được đặt theo một cột theo thứ tự tăng dần và sau đó theo một cột khác theo thứ tự giảm dần:
ORDER BY
column1 ASC,
column2 DESC;Trong trường hợp này, mệnh đề ORDER BY:
column1 theo thứ tự tăng dần.column2 theo thứ tự giảm dần. Lưu ý rằng thứ tự của các giá trị trong column1 sẽ không thay đổi trong bước này, chỉ thứ tự của các giá trị trong column2 thay đổi.Khi thực hiện câu lệnh SELECT với mệnh đề ORDER BY, MySQL luôn đánh giá mệnh đề ORDER BYsau mệnh đề FROM và SELECT:

Chúng tôi sẽ sử dụng bảng customers từ cơ sở dữ liệu mẫu để trình diễn.

Truy vấn sau sử dụng mệnh đề ORDER BY để sắp xếp khách hàng theo họ của họ theo thứ tự tăng dần.
SELECT contactLastname, contactFirstname FROM customers ORDER BY contactLastname;
Kết quả:
+-----------------+------------------+ | contactLastname | contactFirstname | +-----------------+------------------+ | Accorti | Paolo | | Altagar,G M | Raanan | | Andersen | Mel | | Anton | Carmen | | Ashworth | Rachel | | Barajas | Miguel | ...
Nếu bạn muốn sắp xếp khách hàng theo họ theo thứ tự giảm dần, bạn sử dụng DESC sau cột contactLastname trong mệnh đề ORDER BY như được hiển thị trong truy vấn sau:
SELECT contactLastname, contactFirstname FROM customers ORDER BY contactLastname DESC;
Kết quả:
+-----------------+------------------+ | contactLastname | contactFirstname | +-----------------+------------------+ | Young | Jeff | | Young | Julie | | Young | Mary | | Young | Dorothy | | Yoshido | Juri | | Walker | Brydey | | Victorino | Wendy | | Urs | Braun | | Tseng | Jerry | ....
Nếu bạn muốn sắp xếp khách hàng theo họ theo thứ tự giảm dần và sau đó theo tên đầu tiên theo thứ tự tăng dần, bạn chỉ định cả DESC và ASC trong các cột tương ứng này như sau:
SELECT
contactLastname,
contactFirstname
FROM
customers
ORDER BY
contactLastname DESC ,
contactFirstname ASC;Kết quả:
+-----------------+------------------+ | contactLastname | contactFirstname | +-----------------+------------------+ | Young | Dorothy | | Young | Jeff | | Young | Julie | | Young | Mary | | Yoshido | Juri | | Walker | Brydey | | Victorino | Wendy | | Urs | Braun | | Tseng | Jerry | | Tonini | Daniel | ...
Trong ví dụ này, mệnh đề ORDER BY sắp xếp kết quả theo họ theo thứ tự giảm dần trước rồi sắp xếp kết quả được sắp xếp theo tên theo thứ tự tăng dần để tạo ra tập kết quả cuối cùng.
Xem bảng orderdetails sau từ cơ sở dữ liệu mẫu.

Truy vấn sau đây chọn các chi tiết đơn hàng từ bảng orderdetails . Nó tính tổng phụ cho từng mục hàng và sắp xếp tập hợp kết quả dựa trên tổng phụ.
SELECT
orderNumber,
orderlinenumber,
quantityOrdered * priceEach
FROM
orderdetails
ORDER BY
quantityOrdered * priceEach DESC;Kết quả:
+-------------+-----------------+----------+ | orderNumber | orderLineNumber | subtotal | +-------------+-----------------+----------+ | 10403 | 9 | 11503.14 | | 10405 | 5 | 11170.52 | | 10407 | 2 | 10723.60 | | 10404 | 3 | 10460.16 | | 10312 | 3 | 10286.40 | | 10424 | 6 | 10072.00 | | 10348 | 8 | 9974.40 | | 10405 | 3 | 9712.04 | | 10196 | 5 | 9571.08 | | 10206 | 6 | 9568.73 | ...
Trong ví dụ này, chúng tôi sử dụng subtotal làm bí danh cột cho biểu thức quantityOrdered * priceEach và sắp xếp kết quả được đặt theo bí danh subtotal .
Vì MySQL đánh giá mệnh đề SELECT trước mệnh đề ORDER BY , bạn có thể sử dụng bí danh cột được chỉ định trong mệnh đề SELECT trong mệnh đề ORDER BY.
Hàm FIELD() có cú pháp sau:
FIELD(str, str1, str2, ...)
Hàm FIELD() trả về vị trí của str trong danh sách str1, str2,…. Nếu str không có trong danh sách, hàm FIELD() trả về 0. Ví dụ: truy vấn sau trả về 1 vì vị trí của chuỗi 'A', là vị trí đầu tiên trong danh sách 'A', 'B' và'C':
SELECT FIELD('A', 'A', 'B','C');Kết quả:
+--------------------------+
| FIELD('A', 'A', 'B','C') |
+--------------------------+
| 1 |
+--------------------------+
1 row in set (0.00 sec)Và ví dụ sau trả về 2:
SELECT FIELD('B', 'A','B','C');Kết quả:
+-------------------------+
| FIELD('B', 'A','B','C') |
+-------------------------+
| 2 |
+-------------------------+
1 row in set (0.00 sec)Hãy lấy một ví dụ thực tế hơn.
Xem bảng orders sau từ cơ sở dữ liệu mẫu.

Giả sử rằng bạn muốn sắp xếp các đơn hàng bán hàng dựa trên trạng thái của chúng theo thứ tự sau:
Để làm điều này, bạn có thể sử dụng hàm FIELD() để ánh xạ từng trạng thái đơn hàng thành một số và sắp xếp kết quả theo kết quả của hàm FIELD():
SELECT
orderNumber, status
FROM
orders
ORDER BY FIELD(status,
'In Process',
'On Hold',
'Cancelled',
'Resolved',
'Disputed',
'Shipped');Kết quả:
+-------------+------------+ | orderNumber | status | +-------------+------------+ | 10425 | In Process | | 10421 | In Process | | 10422 | In Process | | 10420 | In Process | | 10424 | In Process | | 10423 | In Process | | 10414 | On Hold | | 10401 | On Hold | | 10334 | On Hold | | 10407 | On Hold | ...
Trong MySQL, NULL đứng trước các giá trị không phải NULL. Do đó, khi bạn đặt mệnh đề ORDER BY với tùy chọn ASC , NULLs xuất hiện đầu tiên trong tập kết quả.
Ví dụ: truy vấn sau sử dụng mệnh đề ORDER BY để sắp xếp nhân viên theo các giá trị trong cột reportsTo .
SELECT
firstName, lastName, reportsTo
FROM
employees
ORDER BY reportsTo;Kết qua:
+-----------+-----------+-----------+ | firstName | lastName | reportsTo | +-----------+-----------+-----------+ | Diane | Murphy | NULL | | Mary | Patterson | 1002 | | Jeff | Firrelli | 1002 | | William | Patterson | 1056 | | Gerard | Bondur | 1056 | ...
Tuy nhiên, nếu bạn sử dụng ORDER BY với tùy chọn DESC , NULLs sẽ xuất hiện cuối cùng trong tập kết quả. Ví dụ:
SELECT
firstName, lastName, reportsTo
FROM
employees
ORDER BY reportsTo DESC;Kết quả:
+-----------+-----------+-----------+ | firstName | lastName | reportsTo | +-----------+-----------+-----------+ | Yoshimi | Kato | 1621 | | Leslie | Jennings | 1143 | | Leslie | Thompson | 1143 | | Julie | Firrelli | 1143 | | .... | Mami | Nishi | 1056 | | Mary | Patterson | 1002 | | Jeff | Firrelli | 1002 | | Diane | Murphy | NULL | +-----------+-----------+-----------+ 23 rows in set (0.00 sec)
ORDER BY để sắp xếp kết quả được đặt theo một hoặc nhiều cột.ASC để sắp xếp tập kết quả theo thứ tự tăng dần và tùy chọn DESC để sắp xếp tập kết quả theo thứ tự giảm dần.ORDER BY được đặt sau mệnh đề FROM và SELECT.NULL thấp hơn các giá trị không phải NULL.Bài viết liên quan:
Các bạn có thể xem thêm ở đây: https://www.mysqltutorial.org/mysql-order-by/
Bình luận: