Mệnh đề ORDER BY trong MySQL

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.

Giới thiệu về 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;

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:

  • Đầu tiên, sắp xếp thứ tự kết quả theo các giá trị cột column1 theo thứ tự tăng dần.
  • Sau đó, sắp xếp thứ tự kết quả theo các giá trị cột 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 đề FROMSELECT:

Mệnh đề ORDER BY trong MySQL

Ví dụ về ORDER BY trong MySQL

Chúng ta sẽ sử dụng bảng customers từ cơ sở dữ liệu mẫu để minh họa.

Ví dụ về ORDER BY trong MySQL

Sử dụng mệnh đề ORDER BY trong MySQL để sắp xếp kết quả theo một cột

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            |
....

Sử dụng mệnh đề ORDER BY trong MySQL để sắp xếp kết quả được thiết lập theo nhiều cột

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 DESCASC 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.

Sử dụng mệnh đề ORDER BY trong MySQL để sắp xếp kết quả được đặt bằng một biểu thức

Xem bảng orderdetails sau từ cơ sở dữ liệu mẫu.

Ví dụ về ORDER BY trong MySQL

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.

Sử dụng mệnh đề ORDER BY trong MySQL để sắp xếp dữ liệu bằng danh sách tùy chỉnh

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.

Ví dụ về ORDER BY trong MySQL

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:

  • In Process
  • On Hold
  • Canceled
  • Resolved
  • Disputed
  • Shipped

Để 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    |
...

ORDER BY và NULL trong MySQL

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)

Tóm lược

  • Sử dụng mệnh đề ORDER BY để sắp xếp thứ tự kết quả theo một hoặc nhiều cột.
  • Sử dụng tùy chọn 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.
  • Mệnh đề ORDER BY được đánh giá sau mệnh đề FROMSELECT.
  • Trong MySQL, NULL thấp hơn giá trị không phải NULL
MySQL
Bài Viết Liên Quan:
Toán Tử IS NULL Trong MySQL
Nụ Nguyễn 01/04/2022
Toán Tử IS NULL Trong MySQL

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.

Câu lệnh UPDATE JOIN trong MySQL
Trung Nguyen 06/03/2022
Câu lệnh UPDATE JOIN trong MySQL

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.

Mệnh đề LIMIT trong MySQL
Trung Nguyen 05/03/2022
Mệnh đề LIMIT trong MySQL

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.

Toán tử LIKE trong MySQL
Trung Nguyen 04/03/2022
Toán tử LIKE trong MySQL

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.