在本教程中,您將學(xué)習(xí)如何對SELECTSQL查詢返回的數(shù)據(jù)進行排序。
通常,當(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_name和last_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é)果集首先按第一列排序,然后按第二列對該有序列表排序,依此類推。