Oracle DB使用集合运算符
• 描述集合运算符
• 使用集合运算符将多个查询组成一个查询
• 控制返回行的顺序
• 集合运算符:类型和准则
• 本课中使用的表
• UNION和UNION ALL运算符
• INTERSECT运算符
• MINUS运算符
• 匹配SELECT语句
• 在集合运算中使用ORDER BY子句
集合运算符
集合运算符用于将两个或更多查询的结果合并成一个结果。包含集合运算符的查询被称为复合查询。
所有集合运算符都具有相同的优先级。如果SQL 语句包含多个集合运算符,在没有使用括号明确地指定其它顺序时,Oracle Server 会从左(上)到右(下)对这些运算符进行计算。在将INTERSECT运算符与其它集合运算符配合使用的查询中,应使用括号明确地指定计算的顺序。
集合运算符准则
• SELECT列表中的表达式在数量上必须匹配。
• 第二个查询中每一列的数据类型必须与第一个查询中对应列的数据类型相匹配。
• 可以使用括号更改执行顺序。
• ORDER BY子句只能出现在语句的末尾。
• 查询的SELECT列表中的表达式在数量和数据类型上必须匹配。在WHERE子句中使用UNION、UNION ALL、INTERSECT和MINUS运算符的查询,其SELECT列表中
的列必须具有相同的数量和数据类型。对于复合查询中包含的各个查询,其SELECT列表中各个列的数据类型可能不完全相同。第二个查询中的列必须与第一个查询中的
对应列属于相同的数据类型组(如数字或字符)。
• 可在子查询中使用集合运算符。
• 在将INTERSECT运算符与其它集合运算符配合使用的查询中,应使用括号指定计算的顺序。这可确保符合新出台的SQL 标准,从而为INTERSECT运算符赋予比
其它集合运算符更高的优先级。
Oracle Server 和集合运算符
• 除非使用UNION ALL运算符,否则会自动删除重复行。
• 第一个查询中的列名将显示在结果中。
• 除非使用UNION ALL运算符,否则默认情况下输出按升序进行排序。
如果查询使用了集合运算符,则Oracle Server 会自动删除重复行,除非使用的是UNION ALL运算符。输出中的列名由第一个SELECT语句中列的列表确定。默认情况下,输出按SELECT子句第一列的升序进行排序。
对于复合查询包含的各个查询,其SELECT列表中的相应表达式在数量和数据类型上必须是相匹配的。如果这些查询选择了字符数据,则会按如下方式确定返回值的数据类型:
• 如果两个查询选择了数据类型为CHAR且长度相等的值,则返回值的数据类型也为CHAR且长度保持不变。如果两个查询选择了数据类型为CHAR但长度不同的值,
则返回值的数据类型为VARCHAR2,长度为较大的CHAR值。
• 如果其中一个或两个查询选择了数据类型为VARCHAR2的值,则返回值的数据类型也为VARCHAR2。
如果这些查询选择了数字数据,则按数字优先级确定返回值的数据类型。如果所有查询选择了数据类型为NUMBER的值,则返回值的数据类型也为NUMBER。
在使用集合运算符的查询中,Oracle Server 不会执行跨数据类型组的隐式转换。因此,如果这些查询的相应表达式解析为字符数据和数字数据,Oracle Server 则会返回错误。
本例中使用的表
本例中使用的表包括:
• EMPLOYEES:提供有关所有当前雇员的详细信息
• JOB_HISTORY:记录雇员更换职务时先前职务的开始日期和结束日期、职务标识号及部门的详细信息
hr@TEST0924> desc EMPLOYEES
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
hr@TEST0924> desc JOB_HISTORY
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
EMPLOYEE_ID NOT NULL NUMBER(6)
START_DATE NOT NULL DATE
END_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
DEPARTMENT_ID NUMBER(4)
EMPLOYEES表,该表中存储了雇员的详细信息,如唯一标识号、电子邮件地址、职务标识号(如ST_CLERK、SA_REP等等)、薪金和经理等等。
一些雇员已经在公司工作了很长时间,已更换为其它职务。因此可以使用JOB_HISTORY表对该信息进行监视。在雇员更换职务时,先前职务的开始日期和结