《SQL CookBook 》笔记-第二章-查询结果排序
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
【注意】
order by默认是升序,即ASC- 降序则使用
DESC - 在同时使用 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)
结果:
| ename | job |
|---|---|
| KING | PRESIDENT |
| MILLER | CLERK |
| CLARK | MANAGER |
【分析】
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
结果如下:
| ename | sal | comm |
|---|---|---|
| TURNER | 1500 | 0 |
| ALLEN | 1600 | 300 |
| WARD | 1250 | 500 |
| MARTIN | 1250 | 1400 |
| BLAKE | 2850 | NULL |
| CLARK | 2450 | NULL |
| SCOTT | 3000 | NULL |
| KING | 5000 | NULL |
| ADAMS | 1100 | NULL |
| JAMES | 950 | NULL |
| FORD | 3000 | NULL |
| MILLER | 1300 | NULL |
| JONES | 2975 | NULL |
| SMITH | 800 | NULL |
此处你得想明白,这里面的子查询表X,都是临时的,其中is_null就是一个辅助列,我们按照这个列来排序。
其中子查询:
select ename,sal,comm,
case when comm is null then 0
else 1
end as is_null
from emp
结果如下:
| ename | sal | comm | is_null |
|---|---|---|---|
| SMITH | 800 | NULL | 0 |
| ALLEN | 1600 | 300 | 1 |
| WARD | 1250 | 500 | 1 |
| JONES | 2975 | NULL | 0 |
| MARTIN | 1250 | 1400 | 1 |
| BLAKE | 2850 | NULL | 0 |
| CLARK | 2450 | NULL | 0 |
| SCOTT | 3000 | NULL | 0 |
| KING | 5000 | NULL | 0 |
| TURNER | 1500 | 0 | 1 |
| ADAMS | 1100 | NULL | 0 |
| JAMES | 950 | NULL | 0 |
| FORD | 3000 | NULL | 0 |
| MILLER | 1300 | NULL | 0 |
【注意】
此例在 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
《SQL CookBook 》笔记-第二章-查询结果排序的更多相关文章
- 第二章 约束和排序数据(SQL基础)
第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时,条件包括边界值: ...
- sql系列(基础)-第二章 限制和排序数据
更好的看↑代码点击VIEW PLAN 第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时.条件包括 ...
- Android群英传笔记——第二章:Android开发工具新接触
Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...
- 深入理解 C 指针阅读笔记 -- 第二章
Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_ /*<深入理解C指针>学习笔记 -- 第二章*/ /* 内存泄露的两种形式 1.忘 ...
- [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”
[HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...
- Getting Started With Hazelcast 读书笔记(第二章、第三章)
第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
随机推荐
- Python中的 socket示例
linux send与recv函数详解 1 #include <sys/socket.h> 2 ssize_t recv(int sockfd, void *buff, size_t ...
- mysql workbench EER图,里面的实线以及虚线的关系
ERWin里面线代表实体间的三种关系:决定关系(Identifying Relationship),非决定关系(None-Identifying Relationship),多对多(Many-To-M ...
- 如何识别企业内的“千里马”?
很多企业主都在感叹无法找到合适的优秀管理人才,却忽视了一条获得管理人才的捷径:内部培养.在员工中挑选具有领导潜质的人才,加以培养,必成企业栋梁,而且这样选拔的人才与企业的契合度.忠诚度方面都相对较高. ...
- web优化(二)
上次说到js的阻塞dom渲染可能出现的白屏现象,所以对于js我们需要一些优化.首先我们可以模仿通信中的时分的概念,使用 setTime()来执行一段js代码然后渲染页面然后再执行一段js代码,这样可以 ...
- 20.如何从app业务逻辑提炼api接口
在app后端的工作中,设计api是一个很考验设计能力的工作.在项目的初始阶段,只知道具体的业务逻辑,那怎么把业务逻辑抽象和提炼,设计出api呢?通过阅读本文,可解答以上疑惑. 在本文中,是用以前做过的 ...
- Python集合set
集合 set 集合是无序的 集合的值是唯一的 求两个集合的关系: list1 = [1,4,5,7,3,6,7,9] list2 = set([2,6,0,66,22,8,4]) list3 = se ...
- python高级编程1
1.如何在列表,字典,集合中根据条件筛选数据? 如: 过滤列表[3, 9, -1, 10, 20, -2...]中的负数 筛出字典{‘小明’:70, 'Jim':88,'Tom':98...}中值高于 ...
- JUC中Lock和ReentrantLock介绍及源码解析
Lock框架是jdk1.5新增的,作用和synchronized的作用一样,所以学习的时候可以和synchronized做对比.在这里先和synchronized做一下简单对比,然后分析下Lock接口 ...
- 【Floyd】BZOJ1491: [NOI2007]社交网络
Description Solution n<=100自然联想Floyd 设两个数组d[n][n]存最短距离,t[n][n]存最短路径条数 更新d的时候顺便更新t,乘法原理 if(d[i][ ...
- bzoj 2759一个动态树好题
真的是动态树好题,如果把每个点的父亲设成p[x],那么建出来图应该是一个环套树森林,拆掉一条边,就变成了动态树,考虑维护什么,对于LCT上每个节点,维护两组k和b,一组是他到他父亲的,一组是他LCT子 ...