Trong hướng dẫn này, bạn sẽ học cách sắp xếp thứ tự các hàng trong tập kết quả bằng mệnh đề ORDER BY
trong 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 cú pháp này, 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
.
Từ khóa ASC
viết tắt của tăng dần (ascending) và DESC
viết tắt của giảm dần (descending). 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ả theo thứ tự tăng dần theo các giá trị của cột column1
:
ORDER BY column1 ASC;
Và mệnh đề ORDER BY
này sắp xếp kết quả theo thứ tự giảm dần theo các giá trị của cột column1
:
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 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ả 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 thứ tự kết quả theo thứ tự tăng dần của cột column1
trước và sau đó sắp xếp kết quả theo thứ tự tăng dần của cột column2
.
Có thể sắp xếp thứ tự kết quả 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 cột column1
sẽ không thay đổi trong bước này, chỉ thứ tự của các giá trị trong cột column2
thay đổi.Khi thực hiện câu lệnh SELECT
với một mệnh đề ORDER BY
, MySQL luôn đánh giá mệnh đề ORDER BY
sau mệnh đề FROM
và SELECT
:
Chúng ta sẽ sử dụng bảng customers
từ cơ sở dữ liệu mẫu để minh họa.
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;
Đầu ra:
+-----------------+------------------+
| 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 từ khóa 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;
Đầu ra:
+-----------------+------------------+
| 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 theo thứ tự tăng dần, bạn chỉ định cả hai từ khóa 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;
Đầu ra:
+-----------------+------------------+
| 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ả được đặt theo họ theo thứ tự giảm dần trước và sau đó 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 truy xuất các chi tiết đơn hàng từ bảng orderdetails
. Nó tính toán thành tiền cho từng sản phẩm và sắp xếp tập hợp kết quả dựa trên thành tiền.
SELECT
orderNumber,
orderlinenumber,
quantityOrdered * priceEach
FROM
orderdetails
ORDER BY
quantityOrdered * priceEach DESC;
Đầu ra:
+-------------+-----------------+-----------------------------+
| orderNumber | orderlinenumber | quantityOrdered * priceEach |
+-------------+-----------------+-----------------------------+
| 10403 | 9 | 11503.14 |
| 10405 | 5 | 11170.52 |
| 10407 | 2 | 10723.60 |
| 10404 | 3 | 10460.16 |
| 10312 | 3 | 10286.40 |
...
Để làm cho truy vấn dễ đọc hơn, bạn có thể gán biểu thức trong mệnh đề SELECT
một bí danh cột và sử dụng bí danh cột đó trong mệnh đề ORDER BY
như được hiển thị trong truy vấn sau:
SELECT
orderNumber,
orderLineNumber,
quantityOrdered * priceEach AS subtotal
FROM
orderdetails
ORDER BY subtotal DESC;
Đầu ra:
+-------------+-----------------+----------+
| 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 ta 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 sắp xếp 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','C'.
SELECT FIELD('A', 'A', 'B','C');
Đầu ra:
+--------------------------+
| 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');
Đầu ra:
+-------------------------+
| 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 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');
Đầu ra:
+-------------+------------+
| 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 mệnh đề ORDER BY
với tùy chọn ASC
, NULL
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;
Đầu ra:
+-----------+-----------+-----------+
| 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
, NULL
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;
Đầu ra:
+-----------+-----------+-----------+
| 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 thứ tự kết quả 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 đánh giá sau mệnh đề FROM
và SELECT
.NULL
thấp hơn giá trị không phải NULLBạn có thể vui lòng tắt trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi duy trì hoạt động của trang web.
Trong hướng dẫn này, bạn sẽ học cách sử dụng toán tử MySQL IS NULLđể kiểm tra xem một giá trị có NULL hay không.
Trong hướng dẫn này, bạn sẽ học cách sử dụng câu lệnh UPDATE JOIN trong MySQL để thực hiện cập nhật bảng chéo.
Trong hướng dẫn này, bạn sẽ học cách sử dụng mệnh đề LIMIT trong MySQL để hạn chế số hàng được trả về bởi một truy vấn.
Trong hướng dẫn này, bạn sẽ học cách sử dụng toán tử LIKE trong MySQL để truy vấn dữ liệu dựa trên một mẫu được chỉ định.