Oracle DB使用集合运算符(三)

2014-11-24 16:04:03 · 作者: · 浏览: 2
中具有相同值的那些记录。
如果将DEPARTMENT_ID列添加到EMPLOYEES表的SELECT语句,将DEPARTMENT_ID列添加到JOB_HISTORY表的SELECT语句,然后运行此查询,会
产生什么结果?由于引入的其它列的值可能重复,也可能不重复,因此结果可能不同。
示例:
hr@TEST0924> SELECT employee_id, job_id, department_id FROM employees
2 INTERSECT
3 SELECT employee_id, job_id, department_id FROM job_history;
EMPLOYEE_ID JOB_ID DEPARTMENT_ID
----------- ---------- -------------
176 SA_REP 80
由于EMPLOYEES.DEPARTMENT_ID值与JOB_HISTORY.DEPARTMENT_ID值不相同,所以结果中不再包含雇员200。
MINUS运算符
使用MINUS运算符可以返回由第一个查询选定的但没有出现在第二个查询结果集中的所有不同行(第一个SELECT语句减去第二个SELECT语句)。
注:在查询中使用的所有SELECT语句中,由查询中的SELECT语句选定的列数必须相同,而且列的数据类型必须属于相同的数据类型组。不过,列名不必相同。
使用MINUS运算符
显示从未更换过职务的雇员的雇员ID。
SELECT employee_id FROM employees
MINUS
SELECT employee_id FROM job_history;
在示例中,用EMPLOYEES表中的雇员ID 减去JOB_HISTORY表中的雇员ID。
结果集中显示运行减法运算后剩下的雇员,这些雇员由存在于EMPLOYEES表中但并不存在于JOB_HISTORY表中的那些行代表。这些行记录了从未更换过职务的雇员。
匹配SELECT语句
使用UNION运算符可显示位置ID、部门名称和所在的省/市/自治区。
如果某些列不存在于一个表或另一个表中,则必须使用TO_CHAR函数或任何其它转换函数匹配数据类型。
hr@TEST0924> SELECT location_id, department_name "Department", TO_CHAR(NULL) "Warehouse location" FROM departments
2 UNION
3 SELECT location_id, TO_CHAR(NULL) "Department", state_province FROM locations;
LOCATION_ID Department Warehouse location
----------- ------------------------------ -------------------------
1000
1100
1200 Tokyo Prefecture
1300
1400 IT
1400 Texas
由于查询的SELECT列表中的表达式必须在数量上相匹配,因此可以使用伪列和数据类型转换函数来遵循此规则。在示例中,已将名称Warehouse location指定为伪列
标题。在第一个查询中使用了TO_CHAR函数,以匹配由第二个查询检索的state_province列的VARCHAR2数据类型。同样,第二个查询中的TO_CHAR函数
用于匹配由第一个查询检索的department_name列的VARCHAR2数据类型。
匹配SELECT语句:示例
使用UNION运算符可显示所有雇员的雇员ID、职务ID 和薪金。
hr@TEST0924> SELECT employee_id, job_id,salary FROM employees
2 UNION
3 SELECT employee_id, job_id,0 FROM job_history;
EMPLOYEE_ID JOB_ID SALARY
----------- ---------- ----------
100 AD_PRES 24000
101 AC_ACCOUNT 0
101 AC_MGR 0
101 AD_VP 17000
匹配SELECT语句:示例
EMPLOYEES和JOB_HISTORY表具有多个共同的列(例如,EMPLOYEE_ID、JOB_ID和DEPARTMENT_ID)。但是,如果知道薪金仅存在于EMPLOYEES表中,而且要在查询中使用UNION运算符来显示雇员ID、职务ID 和薪金,这时又该如何操作?
示例中将EMPLOYEES表和JOB_HISTORY表中的EMPLOYEE_ID列和JOB_ID列相匹配。将文字值0添加到JOB_HISTORY SELECT语句中,可匹配EMPLOYEES SELECT语句中SALARY列的数值。
在显示结果中,对应于JOB_HISTORY表中的一条记录的每个输出行在SALARY列中都包含一个0。
在集合运算中使用ORDER BY子句
ORDER BY子句只能在复合查询的末尾出现一次。
这些查询中不能包含多个ORDER BY子句。
ORDER BY子句仅识别第一个SELECT查询中的列。
默认情况下,使用第一个SELECT查询中的第一列按升序对输出进行排序。
ORDER BY子句只能在复合查询中使用一次。如果使用ORDER BY子句,则必须将其放在查询的末尾。ORDER BY子句接受列名或别名。默认情况下,输出按第一个SELECT查询的第一列的升序进行排序。
注:ORDER BY子句不能识别第二个SELECT查询中的列名。为避免列名混淆,通常的做法是对列位置执行ORDER BY。
例如,在下面的语句中,输出将按job_id的升序显示。
SELECT employee_id, job_id,salary FROM employees
UNION
SELECT employee_id, job_id,0 FROM job_history ORDER BY 2;
如果忽略ORDER BY,则默认情况下输出将按employee_id的升序进行排序。不能使用第二个查询中的列对输出进行排序。