查找结果排序
按指定顺序返回查询结果
先过滤,然后按照指定字段升序排列。
select ename,job,sal from emp where depto = 10 order by sal asc;
按多字段排序
先按deptno升序,再按sal降序
select empno,deptno,sal,ename,job
from emp
order by deptno,sal desc;
按子串排序
根据字符串的特定部分对查询结果进行排序。例如,查询EMP表中员工姓名和职位,并按JOB列的最后两个字符排序。
-- DB2, MySQL, Oracle, Postgres. 指定截取起始位置为字符串的倒数第2个字符
select ename,job
from emp
order by substr(job,length(job)-1);
-- SQL Server. 第3个参数指定要提取多少个字符
select ename,job from emp
order by substring(job,len(job)-1,2)
对同时包含字母和数字的数据进行排序
假设某列数据格式是这样的,单个值既有字母,也有数字。现在想要根据字母或数字部分排序
Data
------
ASH 10
BANSHEE 12
CHROMA 8
-- 按数字部分排序
-- translate 将数字改成 #
-- replace 替换 # 为 空字符串
-- 最外层的replace将原始值中的字母替换为空字符串
select data from emp2
order by replace(data, replace(translate(data, '0123456789','##########'),'#',''),'');
-- 按字母部分排序
select data from emp2
order by replace(translate(data, '0123456789','##########'),'#','');
排序时处理NULL值
-- 升序排列所有值不为NULL的行,并将所有列值为NULL的行都放在最后面。
select ename,sal,comm
from (
select ename,sal,comm, case when comm is null then 0 else 1 end as is_null
from emp
) x
order by is_null desc,comm;
-- 降序排列所有值不为NULL的行,并将所有列值为NULL的行都放在最后面。
select ename,sal,comm
from (
select ename,sal,comm, case when comm is null then 0 else 1 end as is_null
from emp
) x
order by is_null desc,comm desc;
根据依赖于数据的键进行排序
根据某种条件逻辑选择排序依据。如果JOB列为SALESMAN,就根据COMM列排序,否则根据SAL排序。
select ename,sal,job,comm from emp
order by case when job = 'SALESMAN' then comm else sal end;