Oracle 中的集合运算是指将两个或多个查询的结果集组合成一个结果集的操作。这些集合运算包括 UNION、UNION ALL、INTERSECT 和 MINUS。
UNION:
- 定义:返回两个或多个查询的所有记录,但自动去除重复的记录。
- 示例:查询部门10和部门20的所有员工(不重复):
SELECT * FROM emp WHERE deptno = 10 UNION SELECT * FROM emp WHERE deptno = 20;
UNION ALL:
- 定义:返回两个或多个查询的所有记录,包括重复的记录。
- 示例:查询工资在500~1500或在1000~2000范围的员工信息(可能包括重复的员工):
SELECT * FROM emp WHERE sal BETWEEN 500 AND 1500 UNION ALL SELECT * FROM emp WHERE sal BETWEEN 1000 AND 2000;
注意:使用 UNION ALL 通常比 UNION 更快,因为它不需要去除重复的记录。
INTERSECT:
- 定义:返回两个或多个查询共有的记录。
- 示例:查询同时属于部门10和部门20的员工:
SELECT * FROM emp WHERE deptno = 10 INTERSECT SELECT * FROM emp WHERE deptno = 20;
MINUS:
- 定义:返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。
- 示例:查询属于部门10但不属于部门20的员工:
SELECT * FROM emp WHERE deptno = 10 MINUS SELECT * FROM emp WHERE deptno = 20;
当使用 Oracle 集合运算时,需要注意以下几点:
- 每个独立查询的字段名的列名尽量一致(列名不同时,取第一个查询的列名)。
- 列的数据类型、列的个数要一致,否则会报错。
- UNION 和 UNION ALL 默认会按照第一个查询的第一列进行升序排序,但可以通过 ORDER BY 子句来改变排序方式。而 INTERSECT 和 MINUS 不保证结果的排序。
希望这些信息对你有所帮助!