对应的第二章”给查询结果排序“
1.按指定列排序
select ename,comm from emp order by comm ASC;
select ename,comm from emp order by 2 ASC;
--按照第二列排序
2.TRANSLATE函数
语法:
TRANSLATE(string,from_str,to_str)
功能:
1. from_str和to_str以字符为单位,对应字符一一替换。
2. TRANSLATE是REPLACE所提供的功能的一个超集
3. 如果from_str比to_str长,那么在from_str中而不在to_str中而外的字符将从string中被删除,因为它们没有相应的替换字符.
4. to_str不能为空.Oracle把空字符串认为是NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL
3.数字和字母混合字符串的字母排序
此时可以使用到上述的 TRANSLATE函数。
select '7876 Andy' as aname,translate('7876 Andy','- 0123456789','-') as ename from dual
4.空值排序的问题
Oracle默认排序空值在后面,如果要把空值显示在前面,如何实现?
首先想到的是 nal,实现如下:
select ename,comm,nvl(comm,-1) order_col from emp order by 3;
上述的SQL的确可以实现这个功能。但是,必须关注排序列的数据类型。
其实,可以使用关键字
NULLS FIRST 和 NULLS LAST
来控制排序时,空值在前还是在后。
select ename,comm from emp order by 2 NULLS FIRST;
5.排序的列有条件限制
条件:领导对工资在1000—2000之间的员工更感兴趣,再按工资升序排列。
select empno AS 编码,ename AS 姓名,
case when sal >=1000 and sal < 2000 then 1 else 2 end AS 级别,
sal AS 工资
from emp where deptno = 30 order by 3,4;
结果如下:
编码 | 姓名 | 级别 | 工资 |
---|---|---|---|
7654 | MARTIN | 1 | 1250 |
7521 | WARD | 1 | 1250 |
7499 | ALLEN | 1 | 1600 |
7900 | JAMES | 2 | 950 |
7698 | BLAKE | 2 | 2850 |
也可以不显示级别,把 case when 放到 order by 中
select empno AS 编码,ename AS 姓名,
sal AS 工资
from emp where deptno = 30
order by case when sal >=1000 and sal < 2000 then 1 else 2 end, 3;
结果如下:
编码 | 姓名 | 工资 |
---|---|---|
7654 | MARTIN | 1250 |
7521 | WARD | 1250 |
7499 | ALLEN | 1600 |
7900 | JAMES | 950 |
7698 | BLAKE | 2850 |