SQL ORDER BY

摘要:在本教程中,您將學習如何使用 SQL ORDER BY 子句,根據一個或多個行的值,按升序或降序對結果集進行排序。

SQL ORDER BY 子句簡介 #

ORDER BYSELECT 語句的一個可選子句。ORDER BY 子句允許您按一個或多個排序表示式,以升序和/或降序對結果集進行排序。

以下是 ORDER BY 子句的語法:

SELECT
  select_list
FROM
  table_name
ORDER BY
  sort_expression [ASC | DESC];Code language: SQL (Structured Query Language) (sql)

在此語法中:

  • 首先,在 ORDER BY 子句中指定一個排序表示式 (sort_expression),您希望根據它來對結果集進行排序。sort_expression 可以是表列,也可以是涉及表列的表示式。
  • 其次,使用 ASC 按升序對結果集進行排序,使用 DESC 按降序對結果集進行排序。

ASCDESC 分別代表升序(ascending)和降序(descending)。

ORDER BY 子句預設使用 ASC 選項。這意味著,如果您沒有指定 ASCDESCORDER BY 子句會按 sort_expression 以升序對結果集中的行進行排序。

請注意,如果您不指定 ORDER BY 子句,SELECT 語句將不會對結果集進行排序。這意味著結果集中的行沒有特定的順序。

ORDER BY 子句允許您按多個表示式對結果集中的行進行排序。在這種情況下,您需要在 ORDER BY 子句中使用逗號分隔的排序表示式列表:

SELECT
  select_list
FROM
  table_name
ORDER BY
  sort_expression_1 [ASC | DESC],
  sort_expression_2 [ASC | DESC];Code language: SQL (Structured Query Language) (sql)

在此語法中,ORDER BY 子句首先按 sort_expression_1 對結果集進行排序,然後按 sort_expression_2 對已排序的結果集進行排序。

資料庫系統按以下順序評估帶有 ORDER BY 子句的 SELECT 語句:

  • FROM
  • SELECT
  • ORDER BY

由於資料庫系統在 SELECT 子句之後評估 ORDER BY 子句,因此您可以在 ORDER BY 子句中使用列別名。

SQL ORDER BY 子句示例 #

我們將使用示例資料庫中的 employees 表進行演示。

employees_table

按單列對行進行排序的示例 #

以下示例使用 ORDER BY 子句按名字(first name)的字母順序對員工進行排序:

SELECT
  employee_id,
  first_name,
  last_name
FROM
  employees
ORDER BY
  first_name;Code language: SQL (Structured Query Language) (sql)

 

試一試

輸出

 employee_id | first_name  |  last_name
-------------+-------------+-------------
         121 | Adam        | Fripp
         103 | Alexander   | Hunold
         115 | Alexander   | Khoo
         193 | Britney     | Everett
         104 | Bruce       | Ernst
...

在此示例中,ORDER BY 子句根據 first_name 列中的值對結果集的行進行排序。

按多列對行進行排序 #

以下示例使用 ORDER BY 子句按名字(first name)升序和姓氏(last name)降序對員工進行排序:

SELECT
  employee_id,
  first_name,
  last_name
FROM
  employees
ORDER BY
  first_name,
  last_name DESC;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 employee_id | first_name  |  last_name
-------------+-------------+-------------
         121 | Adam        | Fripp
         115 | Alexander   | Khoo
         103 | Alexander   | Hunold
         193 | Britney     | Everett
         104 | Bruce       | Ernst
         179 | Charles     | Johnson
...

在此示例中,ORDER BY 子句首先按名字升序對行進行排序,然後按姓氏降序對已排序的結果集進行排序。

請注意結果集中兩位員工 Alexander KhooAlexander Hunold 位置的變化。

按數值列對行進行排序的示例 #

以下示例使用 ORDER BY 子句按薪水從高到低對員工進行排序:

SELECT
  employee_id,
  first_name,
  last_name,
  salary
FROM
  employees
ORDER BY
  salary DESC;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 employee_id | first_name  |  last_name  |  salary
-------------+-------------+-------------+----------
         100 | Steven      | King        | 24000.00
         101 | Neena       | Kochhar     | 17000.00
         102 | Lex         | De Haan     | 17000.00
         145 | John        | Russell     | 14000.00
         146 | Karen       | Partners    | 13500.00
         201 | Michael     | Hartstein   | 13000.00

按日期對行進行排序的示例 #

除了字元和數值資料,您還可以使用 ORDER BY 子句按日期對行進行排序。

例如,以下語句使用 ORDER BY 子句按入職日期從早到晚對員工進行排序:

SELECT
  first_name,
  last_name,
  hire_date
FROM
  employees
ORDER BY
  hire_date;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name  |  last_name  | hire_date
-------------+-------------+------------
 Steven      | King        | 1987-06-17
 Jennifer    | Whalen      | 1987-09-17
 Neena       | Kochhar     | 1989-09-21
 Alexander   | Hunold      | 1990-01-03
 Bruce       | Ernst       | 1991-05-21
 Lex         | De Haan     | 1993-01-13

要按入職日期降序對員工進行排序,您可以使用以下查詢:

SELECT
  first_name,
  last_name,
  hire_date
FROM
  employees
ORDER BY
  hire_date DESC;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name  |  last_name  | hire_date
-------------+-------------+------------
 Charles     | Johnson     | 2000-01-04
 Luis        | Popp        | 1999-12-07
 Karen       | Colmenares  | 1999-08-10
 Kimberely   | Grant       | 1999-05-24
 Diana       | Lorentz     | 1999-02-07
...

對 NULL 進行排序 #

在 SQL 中,NULL 是一個標記,表示資料缺失或值未知。NULL 很特殊,因為您不能將其與任何值進行比較。

如果要按包含 NULL 的列對行進行排序,您可以選擇將 NULL 放在其他常規值之前或之後。

要將 NULL 放在其他值之前,請在 ORDER BY 子句中使用 NULLS FIRST 選項:

ORDER BY sort_expression NULLS FIRSTCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

如果要將 NULL 放在其他常規值之後,請使用 NULLS LAST 選項:

ORDER BY sort_expression NULLS LASTCode language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

以下查詢使用帶 NULLS FIRST 選項的 ORDER BY 子句將 NULL 放在其他值之前:

SELECT
  first_name,
  phone_number
FROM
  employees
ORDER BY
  phone_number NULLS FIRST;Code language: PostgreSQL SQL dialect and PL/pgSQL (pgsql)

試一試

輸出

 first_name  | phone_number
-------------+--------------
 John        | NULL
 Charles     | NULL
 Kimberely   | NULL
 Jack        | NULL
 Jonathon    | NULL
 Karen       | NULL
 Jennifer    | 515.123.4444
 Steven      | 515.123.4567
...Code language: plaintext (plaintext)

以下查詢使用帶 NULLS LAST 選項的 ORDER BY 子句將 NULL 放在其他值之後:

SELECT
  first_name,
  phone_number
FROM
  employees
ORDER BY
  phone_number NULLS LAST;Code language: SQL (Structured Query Language) (sql)

試一試

輸出

 first_name  | phone_number
-------------+--------------
 ...
 Irene       | 650.124.1224
 Sarah       | 650.501.1876
 Britney     | 650.501.2876
 Kimberely   | NULL
 Jack        | NULL
 Jonathon    | NULL
 Karen       | NULL
 John        | NULL
 Charles     | NULLCode language: plaintext (plaintext)

摘要 #

  • 使用 ORDER BY 子句對結果集中的行進行排序。
  • 使用 ASC 選項按升序排序行,使用 DESC 選項按降序排序行。
  • 使用 NULLS FIRSTNULL 放在其他非 NULL 值之前,使用 NULLS LASTNULL 放在之後。

資料庫 #

測驗 #

本教程是否有幫助?
© .