Using SET Operators
1.集合运算
•集合运算组合两个或多个部分查询的结果到一个结果中
•包含集合运算的查询称为复合查询(compound queries)
•集合运算:
---------------------------------------------------------
UNION 由每个查询选择的所有不同的行
UNION ALL 由每个查询选择的所有的行,包括所有重复的行
INTERSECT 由两个查询选择的所有不同的行
MINUS 由第一个查询选择的所有不同的行
---------------------------------------------------------
•INTERSECT(相交)和MINUS(相减)运算不是ANSI SQL-99兼容的,他们是Oracle私有的
•所有的集合运算与等号的优先级相同
2.联合运算
•联合(UNION) 运算从两个查询返回除去重复值后的结果
•原则
两个查询的SELECT子句中列数和列的数据类型必须一致,列名不必相同。
联合运算在所有被选择的列上进行。
在做重复检查的时候不忽略空(NULL)值。
IN运算有比UNION运算高的优先级。
在默认情况下,输出以SELECT子句的第一列的升序排序
3.全联合运算
•全联合(UNION ALL) 运算从两个查询返回包括所有重复值的结果
•原则
和联合不同,重复的行不被过滤,并且默认情况下输出不排序。
不能使用DISTINCT关键字
除了上面的两点,UNION ALL的原则与UNION相同。
4.相交运算
•相交(INTERSECT) 运算返回多个查询中所有相同的行
•原则
两个查询的SELECT子句中列数和列的数据类型必须一致,列名不必相同
相交的表的倒序排序不改变结果
相交不忽略空值
5.相减运算
•相减(MINUS) 运算返回在第一个查询中而不在第二个查询中的行
•原则
两个查询的SELECT子句中列数和列的数据类型必须一致,列名不必相同
对于MINUS运算,在查询的WHERE子句中出现的列都必须在相应的SELECT子句出现中。
6.集合运算的原则
•在两个SELECT列表中的表达式必须在数目上和数据类型上相匹配
•可以用圆括号改变执行的顺序
•ORDER BY子句:
–只能出现在语句的最后(即只能对集合操作的结果进行排序)
–从第一个SELECT语句接收列名、别名,或者位置记号
7.Oracle 服务器和集合运算
•除了UNION ALL,重复行自动被清除
•在集合操作的结果集中,列名是第一个查询中出现的列名
•除了UNION ALL,默认情况下按升序顺序输出
8.匹配 SELECT 语句
•两个查询的SELECT列表中的表达式必须在数量和类型上匹配,因而可以使用虚拟列和类型转换函数
•示例1:
SELECT department_id,TO_NUMBER(null) location, hire_date FROM employees
UNION
SELECT department_id, location_id, TO_DATE(null) FROM departments;
•示例2:
SELECT employee_id, job_id,salary FROM employees
UNION
SELECT employee_id, job_id,0 FROM job_history;
9.控制输出行的顺序
•在默认情况下,输出以第一列的升序排序,你可以用ORDER BY子句来改变顺序
•ORDER BY 子句在复合查询中只能用一次,而且必须放在最后面
order by 子句放在最后面,表示 order by 子句是对整个复合操作的结果集进行排序