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 BY
sau 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: