ORDER BY
mệnh đề thường được sử dụng trong SQL để sắp xếp kết quả của một truy vấn.
Nó cho phép bạn chỉ định thứ tự trả về kết quả.
Bạn có thể chỉ định xem các kết quả được sắp xếp theo thứ tự tăng dần hay giảm dần. Bạn cũng có thể chỉ định nhiều cột để sắp xếp.
Ví dụ
Dưới đây là một ví dụ để chứng minh ORDER BY
mệnh đề.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId ASC;
Kết quả:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | | 1002 | Sledge Hammer | 33.49 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | +------------+---------------------------------+----------------+
ASC
một phần có nghĩa là tăng dần . Khi bạn sử dụng ORDER BY
, nó mặc định là tăng dần, vì vậy bạn có thể bỏ qua ASC
một phần nếu bạn muốn.
Vì vậy, chúng tôi cũng có thể viết truy vấn như sau:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId;
Thứ tự giảm dần
Để sắp xếp nó theo giảm dần đặt hàng, sử dụng DESC
.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC;
Kết quả:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Đặt hàng theo nhiều cột
Bạn có thể chỉ định nhiều cột để sắp xếp theo. Điều này cho phép bạn chỉ định cách sắp xếp các hàng khi có nhiều hàng có cùng giá trị trong cột được sắp xếp đầu tiên.
Có thể dễ dàng hơn để chứng minh điều này bằng một ví dụ.
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName DESC, ProductPrice DESC;
Kết quả:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------------+---------------------------------+----------------+
Nếu chúng ta tập trung vào ba hàng với VendorId
trong tổng số 1001
, chúng ta có thể thấy rằng ví dụ trước đã trả về tên sản phẩm theo thứ tự tăng dần, nhưng trong ví dụ này, chúng tôi đã trả lại chúng theo thứ tự giảm dần. Điều này là do, chúng tôi đã chỉ định ProductName
là cột thứ hai trong ORDER BY
của chúng tôi và chúng tôi đã chỉ định DESC
cho thứ tự giảm dần.
Cột thứ hai chỉ có hiệu lực nếu có các bản sao trong ORDER BY
đầu tiên cột. Nếu không, bất kỳ cột nào tiếp theo đều không có liên quan nếu tiếp tục phân loại.
Nếu chúng ta xem ProductPrice
, chúng tôi có thể thấy rằng cột này không ảnh hưởng đến việc sắp xếp, mặc dù chúng tôi đã chỉ định ProductPrice DESC
. Chúng ta có thể thấy rằng tất cả giá đều theo thứ tự tăng dần, mặc dù chúng tôi khăng khăng rằng chúng phải theo thứ tự giảm dần. Lý do cột này không có hiệu lực là vì không có bản sao trong cột đã sắp xếp trước đó. Do đó, thứ tự của hai cột đầu tiên ảnh hưởng đến kết quả, nhưng thứ tự của cột thứ ba thì không.
Điều này không có nghĩa là cột thứ ba sẽ không bao giờ có bất kỳ tác dụng nào. Nếu sau này chúng tôi lắp một Left handed screwdriver
khác , nhưng ở một mức giá khác, sau đó là ProductPrice
thứ tự của cột sẽ có hiệu lực, do có các giá trị trùng lặp trong ProductName
cột.
Kết hợp Tăng dần với Giảm dần
Bạn có thể trộn từng cột với thứ tự tăng dần và giảm dần. Chúng không nhất thiết phải giống nhau. Ví dụ, chúng tôi có thể làm điều này:
SELECT
VendorId,
ProductName,
ProductPrice
FROM Products
ORDER BY VendorId DESC, ProductName ASC, ProductPrice DESC;
Kết quả:
+------------+---------------------------------+----------------+ | VendorId | ProductName | ProductPrice | |------------+---------------------------------+----------------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Chainsaw | 245.00 | | 1003 | Straw Dog Box | 55.99 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Left handed screwdriver | 25.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Long Weight (green) | 11.99 | +------------+---------------------------------+----------------+
Sắp xếp theo Bí danh cột
ORDER BY
mệnh đề chấp nhận bí danh cột như một cột được sắp xếp theo.
Ví dụ, chúng tôi có thể làm điều này:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY ID DESC, Name DESC, Price DESC;
Kết quả:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Thứ tự theo cột không có trong danh sách CHỌN
ORDER BY
mệnh đề chấp nhận các cột không được chỉ định trong SELECT
danh sách.
Nói cách khác, bạn không bắt buộc phải chọn một cột để sắp xếp theo cột đó.
Ví dụ:
SELECT
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY VendorId DESC, Name DESC, Price DESC;
Kết quả:
+---------------------------------+---------+ | Name | Price | |---------------------------------+---------| | Bottomless Coffee Mugs (4 Pack) | 9.99 | | Straw Dog Box | 55.99 | | Chainsaw | 245.00 | | Sledge Hammer | 33.49 | | Long Weight (green) | 11.99 | | Long Weight (blue) | 14.75 | | Left handed screwdriver | 25.99 | +---------------------------------+---------+
Tại đây, chúng tôi đã đặt hàng theo VendorId
, ngay cả khi chúng tôi không đưa nó vào SELECT
danh sách.
Sắp xếp theo ID cột
ORDER BY
mệnh đề cũng chấp nhận ID cột thay cho tên cột.
Ví dụ, chúng tôi có thể làm điều này:
SELECT
VendorId AS ID,
ProductName AS Name,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Kết quả:
+------+---------------------------------+---------+ | ID | Name | Price | |------+---------------------------------+---------| | 1004 | Bottomless Coffee Mugs (4 Pack) | 9.99 | | 1003 | Straw Dog Box | 55.99 | | 1003 | Chainsaw | 245.00 | | 1002 | Sledge Hammer | 33.49 | | 1001 | Long Weight (green) | 11.99 | | 1001 | Long Weight (blue) | 14.75 | | 1001 | Left handed screwdriver | 25.99 | +------+---------------------------------+---------+
Tuy nhiên, điều này không được khuyến khích.
Đầu tiên, nó làm cho truy vấn khó đọc và hiểu hơn đối với người khác.
Thứ hai, nếu sau đó ai đó thay đổi thứ tự của các cột trong SELECT
danh sách, họ cũng sẽ phải thay đổi thứ tự của ORDER BY
danh sách. Bạn sẽ rất dễ quên thực hiện việc này và kết quả của truy vấn sẽ không đúng thứ tự.
Đây là một ví dụ về ý tôi muốn nói.
SELECT
ProductName AS Name,
VendorId AS ID,
ProductPrice AS Price
FROM Products
ORDER BY 1 DESC, 2 DESC, 3 DESC;
Kết quả:
+---------------------------------+------+---------+ | Name | ID | Price | |---------------------------------+------+---------| | Straw Dog Box | 1003 | 55.99 | | Sledge Hammer | 1002 | 33.49 | | Long Weight (green) | 1001 | 11.99 | | Long Weight (blue) | 1001 | 14.75 | | Left handed screwdriver | 1001 | 25.99 | | Chainsaw | 1003 | 245.00 | | Bottomless Coffee Mugs (4 Pack) | 1004 | 9.99 | +---------------------------------+------+---------+
Tất cả những gì tôi làm là di chuyển ProductPrice
vị trí của cột trong SELECT
và nó hoàn toàn làm rối thứ tự kết quả.
Đặt hàng mặc định
Trong SQL, nếu bạn không sử dụng ORDER BY
, không có gì đảm bảo kết quả của bạn sẽ theo thứ tự. Mặc dù nó có thể trông giống như cơ sở dữ liệu của bạn đang sắp xếp các kết quả theo một cột cụ thể, điều này có thể không thực sự đúng như vậy.
Nói chung, không có ORDER BY
, dữ liệu sẽ được sắp xếp theo thứ tự mà nó được tải vào bảng. Tuy nhiên, nếu các hàng đã bị xóa hoặc cập nhật, thứ tự sẽ bị ảnh hưởng bởi cách DBMS sử dụng lại không gian lưu trữ đã thu hồi.
Do đó, đừng dựa vào DBMS để sắp xếp kết quả theo bất kỳ thứ tự có ý nghĩa nào. Nếu bạn muốn các kết quả của mình được sắp xếp, hãy sử dụng ORDER BY
mệnh đề.
Đặt hàng có Ngoại lệ
Bạn có thể gặp phải những lúc bạn cần đưa một ngoại lệ vào ORDER BY
của mình mệnh đề.
Ví dụ:bạn muốn sắp xếp theo thứ tự bảng chữ cái của một cột ngoại trừ một hàng. Bạn có thể muốn một hàng (hoặc một số hàng) xuất hiện ở trên cùng, trong khi tất cả các hàng còn lại được sắp xếp theo một thứ tự cụ thể.
May mắn thay, có một cách dễ dàng để làm điều này. Xem Cách viết Mệnh đề ORDER BY có Ngoại lệ nếu bạn cần làm điều này.