SQL ORDER BY 子句

在本教程中,您將學(xué)習(xí)如何對SELECTSQL查詢返回的數(shù)據(jù)進行排序。

對結(jié)果集排序

通常,當(dāng)您使用SELECT語句從表中獲取數(shù)據(jù)時,結(jié)果集中的行沒有任何特定的順序。如果要按特定順序排列結(jié)果集,則可以在語句末尾指定ORDER BY子句,該子句告訴程序如何對查詢返回的數(shù)據(jù)進行排序。默認排序順序為升序。

語法

ORDER BY子句用于按升序或降序?qū)Σ樵兎祷氐臄?shù)據(jù)進行排序。該子句的基本語法可以通過以下方式給出:

SELECT column_list FROM table_name ORDER BY column_name ASC|DESC;

在這里,column_list是要獲取其值的數(shù)據(jù)庫表的名稱年齡,國家等列/字段的名稱,而column_name是要排序的列的名稱。讓我們看一些示例,演示其實際工作方式。

考慮我們在數(shù)據(jù)庫中有一個employees表,該表具有以下記錄:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
+--------+--------------+------------+--------+---------+

單列排序

下面的SQL語句將從employees表中返回所有employee,并按emp_name列的升序?qū)Y(jié)果集進行排序。

SELECT * FROM employees 
ORDER BY emp_name ASC;

您可以跳過該ASC選項,而僅使用以下語法。它返回與上一條語句相同的結(jié)果集,因為SQL默認排序順序是升序的:

SELECT * FROM employees 
ORDER BY emp_name;

執(zhí)行上述命令后,您將獲得如下輸出:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
+--------+--------------+------------+--------+---------+

同樣,您可以使用DESC選項以降序執(zhí)行排序。以下語句將按數(shù)字薪水(salary)列的降序排列結(jié)果集。

SELECT * FROM employees 
ORDER BY salary DESC;

這次,您將獲得如下結(jié)果集:

+--------+--------------+------------+--------+---------+
| emp_id | emp_name     | hire_date  | salary | dept_id |
+--------+--------------+------------+--------+---------+
|      3 | Sarah Connor | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard | 2007-01-03 |   7200 |       3 |
|      2 | Tony Montana | 2002-07-15 |   6500 |       1 |
|      5 | Martin Blank | 2008-06-24 |   5600 |    NULL |
|      1 | Ethan Hunt   | 2001-05-01 |   5000 |       4 |
+--------+--------------+------------+--------+---------+

多列排序

您還可以在排序時指定多個列。但是,除非表中有一些重復(fù)的值,否則結(jié)果集的更改將不可見。好吧,讓我們找出:

為了更好地理解多列排序,我們假設(shè)我們在數(shù)據(jù)庫中有一個名為Trainees的表,其中包含以下記錄:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
+----+------------+------------+-------------+--------+

如果您仔細查看表格,將會發(fā)現(xiàn)我們有一些重復(fù)的值。但是,受訓(xùn)者 Peter Parker 和 Peter Pan  的全名不同,但名字相同。

現(xiàn)在執(zhí)行以下命令,該命令按first_name列對結(jié)果集進行排序。

SELECT * FROM trainees 
ORDER BY first_name;

執(zhí)行后,您將獲得如下輸出:

+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
+----+------------+------------+-------------+--------+

現(xiàn)在執(zhí)行此語句,該語句按first_namelast_name列對結(jié)果集進行排序。

SELECT * FROM trainees 
ORDER BY first_name, last_name;
+----+------------+------------+-------------+--------+
| id | first_name | last_name  | birth_date  | gender |
+----+------------+------------+-------------+--------+
|  4 | Alice      | Kingsleigh | 1999-07-02  |  F     |
|  2 | Harry      | Potter     | 2001-08-30  |  M     |
|  5 | John       | Connor     | 2002-01-15  |  M     |
|  3 | Peter      | Pan        | 2004-09-19  |  M     |
|  1 | Peter      | Parker     | 1998-03-04  |  M     |
+----+------------+------------+-------------+--------+

您是否注意到以前的結(jié)果集和當(dāng)前的結(jié)果集之間的區(qū)別-這次,學(xué)員“ Peter Parker”的記錄緊隨“ Peter Pan”之后。

由于兩個受訓(xùn)者的名字都是“ Peter”,因此在這兩個受訓(xùn)者的last_name列執(zhí)行第二級排序,這就是為什么受訓(xùn)者“ Peter Parker”的記錄在“ Peter Pan”之后。

注意:當(dāng)指定多個排序列時,結(jié)果集首先按第一列排序,然后按第二列對該有序列表排序,依此類推。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清