SQL的组合查询
在SQL中除了联结查询外,还有一种组合查询;组合查询是指将多条SELECT语句的结果作为一个查询结果集返回,这种查询方式通常称作为并(union)或复合查询(compound query)。
1、组合查询的使用
利用UNION操作符将数条SQL查询组合成一个结果集。
2、组合查询的场景
- 在一个查询中从不同表返回结构数据
- 对一个表执行多个查询,按一个查询返回数据
3、UNION的限制
使用UNION组合SELECT语句的数目,SQL没有标准限制。但是,有些DBMS可能会对UNION能组合的最大语句数据有限制。
4、UNION的规则
- UNION必须由至少两条SELECT语句组成,语句之间用关键字UNION分隔。
- UNION中的每个查询必须包含相同的列、表达式或聚集函数,不过各个列的次序可以不相同。
- 列数据类型必须兼容,类型不必完全相同,但必须是DBMS可以隐含转换的类型。
- 使用UNION组合查询时,只能使用一条ORDER BY子句,并且它必须位于最后一条SELECT语句之后,不过ORDER BY子句是对所有SELECT语句返回的所有结果进行排序。
- UNION在需要组合多个表的数据时也很有用,即使是有不匹配列名的表,此时可以将UNION与别名组合,这样可以让每个SELECT语句返回相同的列名,检索一个结果集。
5、UNION包含或取消重复的行
- UNION从查询结果集中自动去除了重复的行,它的行为与一条SELECT语句中使用多个WHERE子句条件一样;使用UNION时,默认会将重复的行自动取消。
- 若想改变UNION的默认行为,那么可以使用UNION ALL来返回所有的匹配行;也就是说,使用UNION ALL时,DBMS不取消重复的行。
6、UNION与WHERE的差异
- 理论上讲,从性能上看使用多条WHERE子句条件还是UNION应该没有实际的差别。不过,实践中可能会有些差异,最好是测试一下这两种方法,然后取其最优者。
- 任何具有多个WHERE子句的SELECT语句都可以作为一个组合查询,即UNION几乎总是完成与多个WHERE条件相同的工作。
- UNION ALL完成了WHERE子句完成不了的工作,也就是说若想要将每个条件的匹配行全部输出(包括重复的行),那么就必须使用UNION ALL,而不是WHERE。
- 使用UNION可极大简化复杂的WHERE子句,简化从多个表中检索数据的工作。
7、其他类型的UNION
- EXCEPT:也称为MINUS,用来检索只在第一个表中存在而在第二个表中不存在的行。
- INTERSECT:用来检索两个表中都存在的行。
小结:实际上,这些UNION很少使用,因为相同的结果集可以利用联结得到。
阅读是一种修养,分享是一种美德。