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

2014-11-24 16:04:03 · 作者: · 浏览: 3
OYEES表和JOB_HISTORY表的结构和数据。
很多情况下,公司中的某些人员会在公司任期内多次担任相同的职务。例如,假定雇员Taylor 在1998 年3 月24 日加入公司。Taylor 在1998 年3 月24 日至1998 年12 月31 日期间担任职务SA_REP,在1999 年1 月1 日至1999 年12 月31 日期间担任职务SA_MAN。此后Taylor 又再次担任职务SA_REP一直到现在。
UNION运算符
UNION运算符用于返回由任一查询选定的所有行。使用UNION运算符可以返回多个表中的所有行,但不包括重复行。
准则
所选列的数量必须相同。
所选列的数据类型必须属于相同的数据类型组(如数字或字符)。
列名不必相同。
UNION将对所有选定的列执行操作。
在重复项检查过程中不会忽略NULL值。
默认情况下,输出按SELECT子句中列的升序进行排序。
使用UNION运算符
显示所有雇员的当前职务和先前职务的详细信息。每位雇员仅显示一次。
hr@TEST0924> SELECT employee_id, job_id FROM employees
2 UNION
3 SELECT employee_id, job_id FROM job_history;
EMPLOYEE_ID JOB_ID
----------- ----------
100 AD_PRES
200 AC_ACCOUNT
200 AD_ASST
...
115 rows selected.
UNION运算符会删除所有重复记录。如果出现在EMPLOYEES表和JOB_HISTORY表中的记录是相同的,则这些记录只显示一次。在示例显示的输出中,会看到由于每行中的JOB_ID不同,EMPLOYEE_ID为200 的雇员的记录出现了两次。
请看如下示例:
SELECT employee_id, job_id, department_id FROM employees
2 UNION
3 SELECT employee_id, job_id, department_id FROM job_history;
EMPLOYEE_ID JOB_ID DEPARTMENT_ID
----------- ---------- -------------
100 AD_PRES 90
200 AC_ACCOUNT 90
200 AD_ASST 10
200 AD_ASST 90
...
116 rows selected.
在前面的输出中,雇员200 出现了三次。为什么?请注意雇员200 的DEPARTMENT_ID值。一行的DEPARTMENT_ID为90,另一行为10,第三行为90。由于职务ID 和部门ID 的组合是唯一的,所以雇员200 的每行都是唯一的,因此没有被认为是重复行。请注意,输出按SELECT子句的第一列(在此例中,为EMPLOYEE_ID)的升序进行排序。
UNION ALL运算符
使用UNION ALL运算符可以返回多个查询中的所有行。
准则
适用于UNION和UNION ALL的准则是相同的,除了下面适用于UNION ALL的两个例外:与UNION不同,默认情况下UNION ALL不会删除重复行,而且不对输出进行排序。
使用UNION ALL运算符
显示所有雇员的当前部门和先前部门。
hr@TEST0924> SELECT employee_id, job_id, department_id FROM employees
2 UNION ALL
3 SELECT employee_id, job_id, department_id FROM job_history
4 ORDER BY employee_id;
EMPLOYEE_ID JOB_ID DEPARTMENT_ID
----------- ---------- -------------
100 AD_PRES 90
176 SA_REP 80
176 SA_REP 80
176 SA_MAN 80
177 SA_REP 80
...
117 rows selected.
使用UNION ALL运算符
在此示例中,选择了117 行。在两个表中共选择了117 行。UNION ALL运算符不会删除重复行。UNION将返回由任一查询选定的所有不同行。而UNION ALL将返回由任一查询选定的所有行,包括所有重复行。现在使用UNION子句编写该查询:
hr@TEST0924> SELECT employee_id, job_id,department_id FROM employees
2 UNION
3 SELECT employee_id, job_id,department_id FROM job_history
4 ORDER BY employee_id;
EMPLOYEE_ID JOB_ID DEPARTMENT_ID
----------- ---------- -------------
100 AD_PRES 90
176 SA_MAN 80
176 SA_REP 80
177 SA_REP 80
...
116 rows selected.
上面的查询会返回116 行。这是因为此查询删除了后面一行(因为该行是重复行):
INTERSECT运算符
使用INTERSECT运算符可以返回多个查询的所有共同行。
准则
在查询中使用的所有SELECT语句中,由查询中的SELECT语句选定的列数和列的数据类型必须相同。不过,列名不必相同。
使相交的表按反方向排序不会更改结果。
INTERSECT不会忽略NULL值。
使用INTERSECT运算符
显示符合以下条件的雇员的雇员ID 和职务ID:这些雇员的当前职务与以前的职务相同,也就是说这些雇员曾担任过别的职务,但现在又重新担任了以前的同一职务。
hr@TEST0924> SELECT employee_id, job_id FROM employees
2 INTERSECT
3 SELECT employee_id, job_id FROM job_history;
EMPLOYEE_ID JOB_ID
----------- ----------
176 SA_REP
200 AD_ASST
在示例中,查询只返回在两个表的选定列