Sắp xếp dữ liệu trong câu truy vấn MySQL với ORDER BY

16/08/2022 - lượt xem
Chia sẻ
 
Rate this post

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.

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 đ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:

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

Ví dụ về ORDER BY trong MySQL

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

A) Sử dụng mệnh đề ORDER BY trong MySQL để sắp xếp kết quả được đặt theo ví dụ 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;

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

B) 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 ví dụ

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.

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

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.

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' 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:

  • 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');

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

MySQL ORDER BY và NULL

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)

Tổng kết

  • Có thể sử dụng mệnh đề  ORDER BY  để sắp xếp kết quả được đặt 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 đặt sau mệnh đề  FROM và  SELECT.
  • Trong MySQL,  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/

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm