第二章
shanzm



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

问题:

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

解决方案:

使用order by column_Name

代码如下:

  1. select ename,job,sal,hiredate
  2. from emp
  3. where deptno = 10
  4. order by sal asc

当然你可以使用多字段排序

比如先按照sal升序排序,然自后按照入职日期降序排列

  1. select ename,job,sal,hiredate
  2. from EMP
  3. where deptno = 10
  4. 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() 函数。

代码如下:

  1. select ename,job
  2. from EMP
  3. where deptno=10
  4. 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 表达式来动态调整排序项。

代码下:

  1. select ename,sal,comm
  2. from
  3. (
  4. select ename,sal,comm,
  5. case when comm is null then 0
  6. else 1
  7. end as is_null
  8. from emp
  9. )X
  10. 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就是一个辅助列,我们按照这个列来排序。

其中子查询:

  1. select ename,sal,comm,
  2. case when comm is null then 0
  3. else 1
  4. end as is_null
  5. 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 表达式。

代码下:

  1. select ename,sal,job,comm
  2. from emp
  3. order by
  4. case when job = 'SALESMAN' then comm
  5. else sal
  6. end

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

你可记否?在select子句中时,case子句的end子句的最后要使用as定义一个列名

记住了,不论在哪,case子句的基础格式都是:


  1. case when condition1 then return_value1
  2. case when condition2 then return_value2
  3. else return_default_value
  4. end

解决方案2:构造辅助列

注意case语句的返回值。


  1. select ename,sal,job,comm,
  2. case when job = 'SALESMAN' then comm
  3. else sal
  4. end as ordered
  5. from emp
  6. order by ordered



《SQL CookBook 》笔记-第二章-查询结果排序的更多相关文章

  1. 第二章 约束和排序数据(SQL基础)

    第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息:                注意:使用 between 下边界 and 上边界时,条件包括边界值: ...

  2. sql系列(基础)-第二章 限制和排序数据

    更好的看↑代码点击VIEW PLAN 第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时.条件包括 ...

  3. Android群英传笔记——第二章:Android开发工具新接触

    Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...

  4. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  5. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  6. 深入理解 C 指针阅读笔记 -- 第二章

    Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_ /*<深入理解C指针>学习笔记 -- 第二章*/ /* 内存泄露的两种形式 1.忘 ...

  7. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  8. Getting Started With Hazelcast 读书笔记(第二章、第三章)

    第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...

  9. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

随机推荐

  1. SSM-SpringMVC-21:SpringMVC中处理器方法之返回值Object篇

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 今天要记录的是处理方法,返回值为Object的那种,我给它分了一下类: 1.返回值为Object数值(例如1) ...

  2. DOM元素的Attribute(特性)和Property(属性) 【转载】

    1.介绍: 上篇js便签笔记http://www.cnblogs.com/wangfupeng1988/p/3626300.html最后提到了dom元素的Attribute和Property,本文简单 ...

  3. Python定时任务

    在项目中,我们可能遇到有定时任务的需求.其一:定时执行任务.例如每天早上 8 点定时推送早报.其二:每隔一个时间段就执行任务.比如:每隔一个小时提醒自己起来走动走动,避免长时间坐着.今天,我跟大家分享 ...

  4. Python爬取谷歌街景图片

    最近有个需求是要爬取街景图片,国内厂商百度高德和腾讯地图都没有开放接口,查询资料得知谷歌地图开放街景api 谷歌捷径申请key地址:https://developers.google.com/maps ...

  5. MAC下的mysql忘记密码该怎么办??

    不要着急,不要慌,好多人会忙手忙脚,以为自己安装了一个假软件,其实是你打开的方式不对而已! step1: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击 ...

  6. java equals和tostring

    Object类概述 是所有类中的父类,最大的超类,所有的类都继承他. equals方法 比较2个对象是否相同,其实他是在比较两个对象的地址是否相同,在equals方法中我们用==来判断 但是比较2个地 ...

  7. js生成带logo的二维码

    作为一名java程序员,一直以来都是使用服务端生成二维码,最近接触前端的设计,感觉二维码这块如果放到前端去生成,一方面可以减轻服务端的压力,访问带宽,另一方面,前端页面控制比较顺畅 闲话少叙,说下我的 ...

  8. 获取具有指定扩展数据的所有实体的Id,并存入Id数组中

    AcDbObjectIdArray ObtainEntId(){ //获取块表 AcDbBlockTable *pBlkTbl; acdbHostApplicationServices()->w ...

  9. [UOJ#207. 共价大爷游长沙]——LCT&随机化

    题目大意: 传送门 给一颗动态树,给出一些路径并动态修改,每次询问一条边是否被所有路径覆盖. 题解: 先%一发myy. 开始感觉不是很可做的样子,发现子树信息无论维护什么都不太对…… 然后打开题目标签 ...

  10. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...