子查询和集合运算
1 子查询
- 子查询所要解决的问题:不能一步求解
1.1 子查询的类型
单行子查询:查询只返回一条记录。
多行子查询:查询返回多条记录。
1.1.1 写子查询的时候需要注意的问题
- 括号不能省略
- 要有合理的书写风格
- 可以在主查询的where、select、having、from 后面使用子查询。(select后只能使用单行子查询)
- 不可以在group by后使用子查询。
- 强调from后面的子查询
- 主查询和子查询可以不是同一张表;只要子查询返回的结果 主查询可以使用即可。
- 一般不在子查询中排序;但在top-n分析问题中 必须对子查询排序
- 一般先执行子查询,再执行主查询;但相关子查询例外。
- 单行子查询只能使用单行操作符,多行子查询只能使用多行操作符。
- 子查询中的null
SQL优化:在多表查询和子查询都能实现某个结果时,尽量使用多表查询,因为多表查询只select了一次,而子查询往往要select两次
1.2 单行操作符
1.3 多行操作符
1.3.1 in
下面是in的实例:
- 如果是使用not in的话,子查询集合中不能有null值。
1.3.2 any
下面是any的使用实例
1.3.3 all
下面是all的使用实例。
2 集合运算
先看一个需求:
2.1 什么是集合运算?
- 注意:这里的UNION和UNION ALL并不完全相等,UNION ALL是当A集和B集有相同的交集时,AB会都采用相同的那部分,交集部分就包含了两份。而UNION的话就只会维护一份共同集即可。
所以上面“查询10号和20号部门的员工”的SQL我们可以像以下这么写。
2.2 集合运算需要注意的问题
- 参与运算的各个集合必须列数相同且类型一致。
- 采用第一个集合作为最后的表头。
- order by永远放最后集合中写
- 集合运算的顺序可以使用括号来定。
SQL优化:尽量不要使用集合运算
2.3 SQL执行时间
SQL执行时间怎样来查看呢?
通过执行set timing on来将开关打开。再执行SQL就会显示执行时间了。
如果想关掉则执行set timing off。