2016.12.4
十五.集合逻辑
之前的各种连接和子查询以不同的方式处理多个表的数据组合。但是结果仍然是一条单独的SELECT语句。合并查询的概念,也就是用一条SQL语句来组合多条SQL语句。
我们把每个SELECT语句作为一个集合来引用。
15.1 使用UNION操作符
UNION操作符用来处理这样的逻辑:选择在setA或者在setB中的数据
Selectstatement1
UNION
Selectstatement2
ORDER BY columnlist
使用UNION,需要遵循3个原则:
(1)在Selectstatement1和Selectstatement2中的SELECT columnlist中必须有相同数目的列。
(2)每个SELECT columnlist中的所有列必须以相同顺序排列。
(3)每个SELECT columnlist中所有相对应的列都必须有相同或者相兼容的数据类型。
当使用UNION时,我们应当使用列的别名为所有相对应的列赋予相同的列名。
ORDER BY子句应用于组合到一起的两条查询语句的最终结果,因为对单个的查询应用排序没有意义。
UNION允许我们在一条SELECT语句中检索不相关或者部分相关的数据。
15.2 UNION和UNION ALL
Selectstatement1
UNION ALL
Selectstatement2
ORDER BY columnlist
UNION操作符排除了所有重复的行,UNION ALL操作符要求包含所有的行,即使是重复的。
UNION排除重复数据的方式与DISTINCT类似,DISTINCT应用于一条单独的SELECT语句,UNION则是排除了通过UNION组合到一起的所有SELECT语句中的重复数据。
15.3 交叉查询
INTERSECT(MYSQL没有):
Selectstatement1
INTERSECT
Selectstatement2
ORDER BY columnlist
UNION和UNION ALL所返回的数据,处于组合在一起的两条SELECT语句中的任意一条所指定的集合中。这就像使用OR操作符把两个逻辑集合中的数据组合到一起一样。
SQL提供了INTERSECT操作符,它只把在两个集合中都能找到的数据提取出来。INTERSECT类似于AND操作符。
EXCEPT(MYSQL没有,ORACLE中等价于MINUS):
Selectstatement1
EXCEPT
Selectstatement2
ORDER BY columnlist
EXCEPT是INTERSECT的变体,它返回了在一个集合中存在而在另一个集合中不存在的数据。
它将显示在 Selectstatement1中但是不在Selectstatement2中的数据。