在本教程中将学习如何使用oracle order by
子句来按升序或降序对一列或多列的结果集进行排序。
在oracle中,表中是以非指定顺序存储行数据记录的,它不管行插入数据库的顺序如何。要按列以升序或降序查询行记录,必须明确指示oracle数据库要如何去排序。
例如,您可能希望按名称的字母顺序列出所有客户,或者按照从最低到最高信用限额的顺序显示所有客户。
要对数据进行排序,请按如下方式将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],
要按列排序结果集,可以在order by子句之后列出该列。
按照列名是一个排序顺序,可以是:
asc
表示按升序排序desc
表示按降序排序默认情况下,无论是否指定asc
,order by
子句都按升序对行进行排序。如果要按降序对行进行排序,请明确使用desc
。
nulls first
在非null
值之前放置null
值,nulls last
在非null
值之后放置null
值。
order by
子句可以按多列对数据进行排序,每列可能有不同的排序顺序。
请注意,order by
子句总是select
语句中的最后一个子句。
下面将使用示例数据库中的customers
表进行演示。
以下语句从客户(customers
)表中检索客户的:name
, address
和 credit limit
:
select name, address, credit_limit from customers;
执行上面查询语句,得到以下结果 -
正如截图中所看到的,行记录的顺序是未指定的。
要按照字母顺序按升序排列客户名称,请使用以下语句:
select name,address,credit_limit
from customers
order by name asc;
执行上面示例代码,得到以下结果 -
asc
指示oracle按升序对行进行排序。但是asc
是可选的,如果省略,则在默认情况下,order by
子句按指定的列按升序对行进行排序。
因此,下面的表达式:
order by name asc
等效于 -
order by name
要按字母顺序降序排列客户名称,请在order by
子句中的列名之后显式使用desc
,如下所示:
select name, address, credit_limit
from customers
order by name desc;
执行上面查询语句,得到以下结果 -
要对多列进行排序,可以用逗号分隔order by
子句中的每列。
请参阅示例数据库中的以下联系人(contacts
)表。
例如,要按first_name
进行按升序排序,并按降序对last_name
列进行排序,请使用以下语句:
select first_name, last_name
from contacts
order by first_name, last_name desc;
执行上面示例代码,可以看到如下结果 -
从上面截图中可以看到,contact_id
为91
和311
这两条记录的first_name
的值相同,last_name
的值是以降序来排列的。
在这个例子中,oracle首先按first_name
升序对行进行排序,以创建初始结果集。 然后oracle按降序对last_name
排序初始结果集。
看到类似下面的结果如下:
在上面的这个结果中:
first_name
升序排序。last_name
降序排列,如daniel glass
和daniel costner
,dianne sen
和dianne derek
,doretha tyler
和dorotha wong
。不需要指定用于排序数据的列名称。如果您愿意,可以使用order by
子句中列的位置。
请参考下语句 -
select name, credit_limit,address
from customers
order by 2 desc, 1;
在这个例子中,name
列的位置是1
,credit_limit
列的位置是2
。相当于以下查询语句 -
select name, credit_limit,address
from customers
order by credit_limit desc, name;
在order by
子句中,使用这些列位置来指示oracle对行进行排序。
请参阅示例数据库中的以下地区(locations
)表:
以下语句按城市(city
)和州(state
)检索位置并对其进行排序:
select country_id, city, state
from locations
order by state desc;
执行上面查询语句,得到以下结果 -
state
列有null
值,这意味着state
数据与某些城市(例如:beijing
, hiroshima
和 london
)无关。
当使用非null
值对混合null
进行排序时,oracle允许指定哪个应该首先出现。
例如,以下语句按升序对state
列进行排序,并首先将null
值放置在前面。
select country_id, city, state
from
locations
order by
state asc nulls first;
要放置null
值在后面,可以使用nulls last
,如下面的语句所示:
select country_id, city, state
from
locations
order by
state asc nulls last;
执行上面示例查询语句,得到以下结果:
order by
子句可在一列上应用一个函数,例如字符串函数,数学函数等,并按函数的结果对数据进行排序。
例如,以下语句使用order by
子句中的upper()函数来区分客户名称的大小写:
select customer_id, name
from customers
order by upper( name );
执行上面查询语句,得到以下结果 -
在本教程中,您已学习如何使用oracle order by
子句按升序或降序对一列或多列进行排序。