这几个关键字是用来操作集合的。UNION用来求两个集合的并集,INTERSECT用来求两个集合的交集,EXCEPT用来求在第一个集合中存在,而在第二个集合中不存在的记录。每个关键字后面都可以接ALL(UNION ALL, INTERSECT ALL, EXCEPT ALL),如果不接ALL,操作集合将会去掉重复值,下面我们通过一个例子来对比一下它们直接的不同。
- ---UNION
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- UNION
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- A
- B
- C
- D
- E
- ---UNION ALL
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- UNION ALL
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- A
- B
- B
- D
- E
- A
- A
- B
- B
- C
- ---INTERSECT
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- INTERSECT
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- A
- B
- ---INTERSECT ALL
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- INTERSECT ALL
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- A
- B
- B
- ---EXCEPT
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- EXCEPT
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- C
- ---EXCEPT ALL
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- EXCEPT ALL
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- A
- C
大家对比一下它们之间的结果就可以看出它们之间的区别,不过有两个问题需要注意:
1、UNION 和 INTERSECT 两别集合可以互换的,但是EXCEPT 互换将有不同的结果,如下:
- ---语句1
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- EXCEPT
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- ---结果:
- C
- ---语句2
- VALUES ('A'), ('B'), ('B'), ('D'), ('E')
- EXCEPT
- VALUES ('A'), ('A'), ('B'), ('B'), ('C')
- ---结果:
- D
- E
2、注意它们之间的优先级,EXCEPT 的优先级要高于 UNION 和 INTERSECT,一般情况下如果多个关键字混合使用最好使用括号。
---更多参见:DB2 SQL 精萃