oracle中order by学习

一、
order by子句是对select语句查询后的结果集进行排序。按照desc降序,asc升序,默认为升序。

二、
order by子句后面可以跟列名、数字、随机函数。

1、列名
表示按照某个列来排序。

select ename, job from emp order by ename;

2、数字
数字作用和列名一样,指明了按照select列表中相应位置的列来排序。

select ename, job from emp order by 2;

如果数字超出了select后面列的数量,会报错:

ORA-01785: ORDER BY item must be the number of a SELECT-list expression


3、dbms_random.value()函数
dbms_random.value()返回一个0~1之间的随机数。

select ename, job from emp order by dbms_random.value();

Order By dbms_random.value,为结果集的每一行计算一个随机数,dbms_random.value 是结果集的一个列(虽然这个列并不在select list 中),然后
根据该列排序,得到的顺序自然就是随机的啦。

所以上面这句sql相当于:

select ename, job, dbms_random.value() from emp order by 3;

使用order by dbms_random.value()可以使sql语句返回结果集的随机排序。

三、
order by可以按照select列表中没有的列来排序,但是必须显式地给出排序的列名。

select ename, job from emp order by sal desc;

如果在查询中使用group by或distinct,则不能按照select列表中没有的列来排序。

所以sql语句的执行是先排序,然后再返回select选择的列,不是先返回select选择的列再排序???

四、
oracle在order by子句中,有nulls first和nulls last,可以让空值排在最前或最后。

select ename, sal, comm
from emp
order by comm nulls last

五、
可以用case表达式来动态改变如何对结果排序,然后传递给order by。

select ename, sal, job, comm,
case when job = 'SALESMAN' then comm else sal end as ordered
from emp
order by 5;

六、order by两个字段都降序
比如说有两个字段SA_TXN_DATE、SA_TXN_TIME排序
1、如果用order by SA_TXN_DATE, SA_TXN_TIME DESC
作用是按照SA_TXN_DATE升序(默认),SA_TXN_TIME降序排列

2、如果要两个字段都降序需要用两次DESC
order by SA_TXN_DATE DESC, SA_TXN_TIME DESC