- 以指定次序返回查询结果
- 按多个字段排序
- 按子串排序
- 对字母数字混合的数据排序
- 处理排序空值
- 根据数据项的键排序
1.以指定次序返回查询结果
select ename,job from emp order by ename
字符串值的字典序排列?
网上找到的答案:ASCII码
2.按多个字段排序
select * from emp order by ename asc,job desc;
3.按照子串排序
db2,mysql,oracle,postgreSQL 采用:
select ename,job from emp order by substr(job,start,length);
sqlserver 采用:
select ename,job from emp order by substring(job,len(job)-2,2);
Note: 子串是比较少用的,新内容
4.对字母数字混合的数据排序,这个部分的功能只有部分数据库管理系统支持
oracle postgreSQL :
select data from V order by replace(data,
replace(translate(data,'0123456789','##########'),'#',''),'');
这部分的替换用到了两个函数,第一次是tanslate,将某些匹配格式中的数据转
换为一些字符,统一替换掉,然后就很明显了
db2:
select * from (select ename|| ' ' || cast (deptno as char(2)) as data from emp ) v
order by replace(translate(data,'#########',‘0123456789’),‘#’,‘’);
mysql和sqlserver不支持translate函数,无法提供针对这个问题的解决方案
Note:以前项目中在oracle数据库的SQL中遇到过,现在才明白,不算迟到
5.处理排序空值
db2,mysql,postgreSQL,sqlserver一般采用case表达式来处理
select ename,job,comm from (select ename,job,comm case when comm is null then 0 else 1 end as is_null from emp) x order by is_null desc,comm;
oracle采用自己的处理方式:
select ename,job,comm from emp order by comm nulls first;
select ename,job.comm from emp order by comm nulls last;
Note:null值的排序在数据库中均是进行转换之后做排序处理的
6.根据数据项的键排序
select ename,sal,comm,case when job='saleman'
then comm else sal end as ordered from emp
order by ordered;
Note:根据格式化后的数据字段进行排序的