面向集合去思考

要想成为写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不为空的行数.

最新文章

  1. 如何把select默认的小三角替换成自己的图片
  2. ZeroMQ接口函数之 :zmq_inproc – ØMQ 本地进程内(线程间)传输方式
  3. Django1.3 创建项目
  4. Java中使用JDBC
  5. server返回arraylist时,juqery在客户端的处理
  6. OC 设计模式——单例模式
  7. Android中显示网页的多种方式
  8. static 方法.
  9. 关于SQL中数据类型(float和real)和 .NET Framework 中数据类型(float和double)的问题
  10. 求1+2+3+...+n的值,要求不能使用乘除法,for、while、if、else、switch、case、等关键字及条件判断语句(JAVA)
  11. python成长之路17
  12. vmwvare 网卡设置讲解
  13. 利用WebLog Experet分析日志获取性能需求
  14. .md即markdown文件的基本常用编写语法
  15. 大白话Vue源码系列(01):万事开头难
  16. 转 - .net/c# 使用RabbitMQ
  17. Watch time
  18. 笔记:Hibernate 数据库方言表
  19. JSF生命周期&Facelets的生命周期
  20. React-Router4.x中文文档

热门文章

  1. HTTP Live Streaming直播(iOS直播)技术分析与实现
  2. Codeforces 741B:Arpa's weak amphitheater and Mehrdad's valuable Hoses(01背包+并查集)
  3. C#:隔离点击任务栏上的图标时的“最小化或者恢复”的效果
  4. JavaScript和angularJs语法支持严格模式:”use strict”
  5. 【转】如何安装mysql服务
  6. 收藏的Android非常好用的组件或者框架。
  7. js继承---类继承法
  8. 周赛-Clique in the Divisibility Graph 分类: 比赛 2015-08-02 09:02 23人阅读 评论(3) 收藏
  9. Can't create handler inside thread that has not called Looper.prepare()
  10. shell控制流结构笔记