面向集合去思考

要想成为写SQL语句的高级专家, 最困难的是一个转变就是从面相过程的思维方式转变到面相集合的思维方式.

首先要停止那些一次处理一行数据的过程化步骤思维, 试着把思路转移到使用类似于 “for all”的短语上来.  例如: 如果我让你生成一个所有在公司里每个工作岗位上干了同样年数的员工的列表, 你会怎么做?

关键是要开始以后完成后的结果的形式(而不是以处理步骤的形式)来思考. 要找集合的特征而不是单独的步骤或行为.

另一种常见的但是却是错误的思考方式是将表看做是排过序的行的集合. 其实, 一张表代表一个集合, 集合是无序的.

举例:

任务是要计算出一个顾客在哥哥订单之间的平均天数.  集合的思维是: select (max(truc(order_date) – min(trunc(order_date))) / count(*) ) as avg_days_between from orders where customer_id = 102;

集合运算

UNION, UNION ALL, MINUS, INTERSECT.

UNION ALL 返回的值包含重复的.

UNION 返回来自所有输入查询的不包含重复值的结果集.

MINUS 返回在第一个输入查询中存在但是接下来的查询中不存在的非重复数据行

INTERSECT 返回在所有输入查询中都存在的非重复行.

条件:

  • 所有输入查询必须返回相同数目的列.
  • 每一列的数据类型必须与对应的其他输入查询一致.(存在隐式转换也可以)
  • order by 子句不能在某个单独的查询中应用, 只能在整个查询的最后.
  • 列名源自第一个输入查询.

每个输入查询都先被单独处理然后进行集合运算.

集合与空值

空值并不是一个值, 最多就是一个标记, 空值可以理解为”我不知道”. 举例:

select * from scott.emp where deptno not in (10, 20, 30); 这时, 如果deptno 是 null, 这行本来满足条件, 因为这行的 deptno 不是10,20,30 但是, 查询时不会包括这行, 说明, 空值除非显示声明, 它们不会被包含在结果集中. 空值不能进行比较, 不能与任何东西进行加, 减, 乘, 除运算. 另外, 只能使用 select * from emp where deptno is null, 而不能使用 select * from emp where deptno = null;

另外, group by 与 order by 会将所有的空值放在一起, 换句话说, 它们可以识别空值.

聚合函数会忽略空值, 例如 sum, count, avg, min 等 比如, count(*) 与 count(com) 的区别, 前一个会统计出所有行数, 而后一个会统计出所有com不为空的行数.

04 SQL是关于集合的的更多相关文章

  1. 【SQL查询】集合查询之INTERSECT

    [SQL查询]集合查询之INTERSECT 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~ ...

  2. SQL语句实例集合

    SQL语句实例 表操作     例 1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  3. SQL记录-PLSQL集合

    PL/SQL集合 集合是一个有序组具有相同的数据类型的元素.每个元素进行标识的唯一标表示其在集合中的位置. PL/SQL提供了三种集合类型: 索引表或关联数组 嵌套表 可变大小的数组或变长数组 Ora ...

  4. SQL入门之集合操作

    尽管可以在与数据库交互时一次只处理一行数据,但实际上关系数据库通常处理的都是数据的集合.在数学上常用的集合操作为:并(union),交(intersect),差(except).对于集合运算必须满足下 ...

  5. SQL使用总结——集合操作函数

    Oracle中集合操作符专门用于合并多条select 语句的结果,包括:UNION, UNION ALL, INTERSECT, MINUS.当使用集合操作符时,必须确保不同查询的列个数和数据类型匹配 ...

  6. SQL Server温故系列(4):SQL 查询之集合运算 & 聚合函数

    1.集合运算 1.1.并集运算 UNION 1.2.差集运算 EXCEPT 1.3.交集运算 INTERSECT 1.4.集合运算小结 2.聚合函数 2.1.求行数函数 COUNT 2.2.求和函数 ...

  7. 恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合

    在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee { private Inte ...

  8. SQL是关于集合的

    一 以面向集合的思维方式来思考 公司里每个工作岗位上干了同样年数的员工列表 select  emplyee_id  from  job_history  group by  employee_id h ...

  9. 过滤sql特殊字符方法集合

    /// <summary>     /// 过滤不安全的字符串    /// </summary>     /// <param name="Str" ...

随机推荐

  1. 25、oracle(一)

    1)了解oracle背景,概念和特点 2)掌握oracleSQL对单表各种查询操作 3)掌握oracleSQL中函数的使用 4)掌握数值型number,字符串型varchar2,日期型date,条件判 ...

  2. Python代码项目目录规范v1.0

    程序目录规范:bin # 存放可执行程序 xxxx.py # 程序主程序(入口文件)config # 存放配置信息 settings.py # 全局配置文件(可能暂时未应用)db # 存放数据文件 c ...

  3. java 基本类型之间的转换

    基本数据类型从低级到高级是:byte  short int long float double ,char 类型比int 类型之后的都要低 下面通过一个例子说明: import javax.swing ...

  4. cocos2dx资源和脚本加密quick-lua3.3final

    一.资源加密 版本号:Quick-Cocos2d-x 3.3 Final 调试工具:xCode 工程创建的时候选择的拷贝源码. 项目结构如图: 这个功能七月大神在很早之前就已经实现了,但是在3.3版本 ...

  5. 【转】使用JDK自带jvisualvm监控tomcat

    转载地址: http://my.oschina.net/kone/blog/157239 jdk自带有个jvisualvm工具.该工具是用来监控java运行程序的cpu.内存.线程等的使用情况.并且使 ...

  6. c#窗体传志

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. poj2482 Stars in Your Window

    此题可用线段树或静态二叉树来做. 考虑用线段树: 很容易想到先限定矩形横轴范围再考虑在此纵轴上矩形内物品总价值的最大值. 那么枚举矩形横轴的复杂度是O(n)的,考虑如何快速获取纵轴上的最大值. 我们不 ...

  8. 基于clahe的图像去雾

    基于clahe的图像去雾     通过阅读一些资料,我了解到clahe算法对图像去雾有所价值,正好opencv中有了实现,拿过来看一看.   但是现在实现的效果还是有所差异 #);    clahe] ...

  9. linux下查看电脑配置

    1. 查看cpu ~$ cat /proc/cpuinfo 2. 查看内存占用 ~$ cat /proc/meminfo 3. 硬盘分区 $ cat /proc/partitions 4. ubunt ...

  10. 2016 Al-Baath University Training Camp Contest-1 F

    Description Zaid has two words, a of length between 4 and 1000 and b of length 4 exactly. The word a ...