在Oracle中,ORDER BY子句可以用來對(duì)一列或多列的結(jié)果集按升序或降序進(jìn)行排序。本文,將為大家?guī)鞳RDER BY子句的具體用法。
在Oracle中,表中是以非指定順序存儲(chǔ)行數(shù)據(jù)記錄的,它不管行插入數(shù)據(jù)庫的順序如何。要按列以升序或降序查詢行記錄,必須明確指示Oracle數(shù)據(jù)庫要如何去排序。
例如,您可能希望按名稱的字母順序列出所有客戶,或者按照從最低到最高信用限額的順序顯示所有客戶。
要對(duì)數(shù)據(jù)進(jìn)行排序,我們可以將ORDER BY子句添加到SELECT語句中,參考以下語法:
SELECT
column_1,
column_2,
column_3,
...
FROM
table_name
ORDER BY
column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
column_1 [ASC | DESC] [NULLS FIRST | NULLS LAST],
要按列排序結(jié)果集,可以在ORDER BY子句之后列出該列。
按照列名是一個(gè)排序順序,可以是:
默認(rèn)情況下,無論是否指定ASC,ORDER BY子句都按升序?qū)π羞M(jìn)行排序。如果要按降序?qū)π羞M(jìn)行排序,請(qǐng)明確使用DESC。
NULLS FIRST在非NULL值之前放置NULL值,NULLS LAST在非NULL值之后放置NULL值。
ORDER BY子句可以按多列對(duì)數(shù)據(jù)進(jìn)行排序,每列可能有不同的排序順序。
請(qǐng)注意,ORDER BY子句總是SELECT語句中的最后一個(gè)子句。
下面將使用示例數(shù)據(jù)庫中的customers表進(jìn)行演示。
以下語句從客戶(customers)表中檢索客戶的:name, address 和 credit limit :
SELECT name, address, credit_limit FROM customers;
執(zhí)行上面查詢語句,得到以下結(jié)果:
要按照字母順序按升序排列客戶名稱,請(qǐng)使用以下語句:
SELECT name,address,credit_limit
FROM customers
ORDER BY name ASC;
執(zhí)行上面示例代碼,得到以下結(jié)果:
ASC指示Oracle按升序?qū)π羞M(jìn)行排序。但是ASC是可選的,如果省略,則在默認(rèn)情況下,ORDER BY子句按指定的列按升序?qū)π羞M(jìn)行排序。
因此,下面的表達(dá)式:
ORDER BY name ASC
等效于
ORDER BY name
要按字母順序降序排列客戶名稱,請(qǐng)?jiān)贠RDER BY子句中的列名之后顯式使用DESC,如下所示:
SELECT name, address, credit_limit
FROM customers
ORDER BY name DESC;
執(zhí)行上面查詢語句,得到以下結(jié)果:
要對(duì)多列進(jìn)行排序,可以用逗號(hào)分隔ORDER BY子句中的每列。
請(qǐng)參閱示例數(shù)據(jù)庫中的以下聯(lián)系人(contacts)表。
例如,要按first_name進(jìn)行按升序排序,并按降序?qū)ast_name列進(jìn)行排序,請(qǐng)使用以下語句:
SELECT first_name, last_name
FROM contacts
ORDER BY first_name, last_name DESC;
執(zhí)行上面示例代碼,可以看到如下結(jié)果:
從上面截圖中可以看到,contact_id為91和311這兩條記錄的first_name的值相同,last_name的值是以降序來排列的。
在這個(gè)例子中,Oracle首先按first_name升序?qū)π羞M(jìn)行排序,以創(chuàng)建初始結(jié)果集。 然后Oracle按降序?qū)ast_name排序初始結(jié)果集。
看到類似下面的結(jié)果如下:
在上面的這個(gè)結(jié)果中:
不需要指定用于排序數(shù)據(jù)的列名稱。如果您愿意,可以使用ORDER BY子句中列的位置。
請(qǐng)參考下語句:
SELECT name, credit_limit,address
FROM customers
ORDER BY 2 DESC, 1;
在這個(gè)例子中,name列的位置是1,credit_limit列的位置是2。相當(dāng)于以下查詢語句:
SELECT name, credit_limit,address
FROM customers
ORDER BY credit_limit DESC, name;
SQL
在ORDER BY子句中,使用這些列位置來指示Oracle對(duì)行進(jìn)行排序。
請(qǐng)參閱示例數(shù)據(jù)庫中的以下地區(qū)(locations)表:
以下語句按城市(city)和州(state)檢索位置并對(duì)其進(jìn)行排序:
SELECT country_id, city, state
FROM locations
ORDER BY state DESC;
SQL
執(zhí)行上面查詢語句,得到以下結(jié)果:
state列有NULL值,這意味著state數(shù)據(jù)與某些城市(例如:Beijing, Hiroshima 和 London)無關(guān)。
當(dāng)使用非NULL值對(duì)混合NULL進(jìn)行排序時(shí),Oracle允許指定哪個(gè)應(yīng)該首先出現(xiàn)。
例如,以下語句按升序?qū)tate列進(jìn)行排序,并首先將NULL值放置在前面。
SELECT country_id, city, state
FROM
locations
ORDER BY
state ASC NULLS FIRST;
SQL
要放置NULL值在后面,可以使用NULLS LAST,如下面的語句所示:
SELECT country_id, city, state
FROM
locations
ORDER BY
state ASC NULLS LAST;
SQL
執(zhí)行上面示例查詢語句,得到以下結(jié)果:
ORDER BY子句可在一列上應(yīng)用一個(gè)函數(shù),例如字符串函數(shù),數(shù)學(xué)函數(shù)等,并按函數(shù)的結(jié)果對(duì)數(shù)據(jù)進(jìn)行排序。
例如,以下語句使用ORDER BY子句中的UPPER()函數(shù)來區(qū)分客戶名稱的大小寫:
SELECT customer_id, name
FROM customers
ORDER BY UPPER( name );
SQL
執(zhí)行上面查詢語句,得到以下結(jié)果:
更多建議: