《SQL CookBook 》笔记-第二章-查询结果排序

第二章
shanzm


第二章 查询结果排序

2.1 以指定顺序返回查询结果

问题:
你想显示部门编号为 10 的员工的名字、职位和工资,并根据工资从低到高排序。

解决方案:
使用order by column_Name

代码如下:

select ename,job,sal,hiredate
from emp
where deptno = 10
order by sal asc

当然你可以使用多字段排序
比如先按照sal升序排序,然自后按照入职日期降序排列

select ename,job,sal,hiredate
from EMP
where deptno = 10
order by sal asc,hiredate desc

【注意】

  1. order by 默认是升序,即ASC
  2. 降序则使用DESC
  3. 在同时使用 ORDER BY 和 WHERE 子句时,应该让 ORDER BY 位于
    WHERE 之后,否则将会产生错误


2.2 依据子串排序

问题:
按照一个字符串的特定部分排列查询结果。

例如:
希望从 EMP 表检索10号部门的员工的名字和职位,并且按照职位字段的最后两个字符对检索结果进行排序。

解决方案:
order by 子句里使用 substring() 函数。

代码如下:

select ename,job
from EMP
where deptno=10
order by substring(job,len(job)-2,2)

结果:

enamejob
KINGPRESIDENT
MILLERCLERK
CLARKMANAGER

【分析】
substring() 函数

第一个参数:字符串所在列的列名
第二个参数:取子串的开始位置
第三个参数:所取的子串的长度


2.3 排序时对 Null 值的处理

问题:
排序依据的列中有null,把该列的值为null的行放在最后

例如:你想按照 EMP 表的 COMM 列对查询结果进行排序,但该字段可能为 Null 。非 Null 值以升序排列或降序排列,把全部 Null 值都放到最后面

解决方案:
使用 CASE 表达式来动态调整排序项。

代码下:

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

结果如下:

enamesalcomm
TURNER15000
ALLEN1600300
WARD1250500
MARTIN12501400
BLAKE2850NULL
CLARK2450NULL
SCOTT3000NULL
KING5000NULL
ADAMS1100NULL
JAMES950NULL
FORD3000NULL
MILLER1300NULL
JONES2975NULL
SMITH800NULL

此处你得想明白,这里面的子查询表X,都是临时的,其中is_null就是一个辅助列,我们按照这个列来排序。

其中子查询:

select ename,sal,comm,
    case when comm is null then 0 
    else 1 
    end as is_null
from emp

结果如下:

enamesalcommis_null
SMITH800NULL0
ALLEN16003001
WARD12505001
JONES2975NULL0
MARTIN125014001
BLAKE2850NULL0
CLARK2450NULL0
SCOTT3000NULL0
KING5000NULL0
TURNER150001
ADAMS1100NULL0
JAMES950NULL0
FORD3000NULL0
MILLER1300NULL0

【注意】
此例在 FROM 子句里用到了内嵌视图(即子查询)。

ANSI SQL 标准规定要给它们取别名。
(只有 Oracle 不要求指定这一类别名。)因此,我在解决方案里经常用类似 X 和 Y 这样的别
名来标识内嵌视图。
注意最后紧挨着圆括号的字母 X 。
在这里,字母 X 变成了 FROM 子句里那个子查询返回的表的名字。
列别名是一个有用的工具,能帮我们写出自注释的代码;
相对而言,(本书中出现过的多数)内嵌视图的别名只是一种形式化的东西。
通常我会为它们取一个简单的名字,诸如 X 、 Y 、 Z 、 TMP1 和 TMP2 。


2.4 依据条件逻辑动态调整排序项

问题:
你希望按照某个条件逻辑来排序。

例如:
如果 job 等于 salesman ,就要按照 comm 来排序;否则,按照 SAL 排序

解决方案1:
order by 子句里使用 case 表达式。

代码下:

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

【注意】case子句还可以在select句中使用。

你可记否?在select子句中时,case子句的end子句的最后要使用as定义一个列名
记住了,不论在哪,case子句的基础格式都是:


 case when condition1 then return_value1
 case when condition2 then return_value2
 else return_default_value
 end 

解决方案2:构造辅助列

注意case语句的返回值。


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


转载于:https://www.cnblogs.com/shanzhiming/p/10358502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值