面向集合去思考

要想成为写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. OA系统如何使用考勤机数据

    通达OA系统使用考勤机数据目前有两种方法可以实现:一种是通过进行二次开发,将通达OA系统与考勤机结合起来使用:另一种是通过将考勤机的数据导出再导入OA系统中.进行二次开发的话,需要和定制开发工程师联系 ...

  2. CalParcess.php.

    <?php require_once "OperSerVice.class.php"; //接受三个数 //isset if(!isset($_REQUEST['NUM1'] ...

  3. java IO和NIO 的区别

    Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别. IO                NIO 面向流            面向缓冲 阻塞IO           非 ...

  4. C++的try_catch异常

    http://blog.sina.com.cn/s/blog_a9303fd901018ost.html 大部分内容转自:http://blog.csdn.net/codestinity/articl ...

  5. Python学习笔记-Day2-Python基础之元组操作

    元组的常用操作包括但不限于以下操作: 元组的索引,计数等 这里将对列表的内置操作方法进行总结归纳,重点是以示例的方式进行展示. 使用type获取创建对象的类 type(tuple) 使用dir获取类的 ...

  6. ural 1113,jeep problem

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1113 网上的解答铺天盖地.我硬是花了两天才懂了点. wiki上的解释:https://e ...

  7. UVa 133,发放救济金

    沿用前一个题的思路: 用left记录剩下的点,直到全部选完. 这里我的问题是,我一直pos = (pos + f + n)%n,这里的问题是对于B点来说,开始的位置是1,就成了(1+(-1) +n) ...

  8. 利用Velocity结合Spring发email

    在spring中发mail是一件容易的事,如果利用Velocity做mail的模板来发送就更得心应手了. 首先,还是简单描述sping中的配置,发mail需要一个mail的engin: <bea ...

  9. Android WebView中的JavaScript代码使用

    在WebView中使用JavaScript 如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能JavaScript. 一旦使能之后,你也可以自己创建接口在你的应用和Java ...

  10. Android开发之获取相册照片和获取拍照照片

    在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取照片: ...