1. 程式人生 > 實用技巧 >10-SET運算子

10-SET運算子

將多個查詢用 SET 操作符連線組成一個新的查詢
  -UNION/UNION ALL
  -INTERSECT
  -MINUS
排序:ORDER BY

 1 --UNION: 操作符返回兩個查詢的結果集的並集
 2 SELECT employee_id, job_id
 3 FROM   employees
 4 UNION
 5 SELECT employee_id, job_id
 6 FROM   job_history;
 7 
 8 --UNION ALL 操作符返回兩個查詢的結果集的並集。對於兩個結果集的重複部分,不去重。
 9 SELECT employee_id, job_id, department_id
10 FROM employees 11 UNION ALL 12 SELECT employee_id, job_id, department_id 13 FROM job_history 14 ORDER BY employee_id; 15 16 --INTERSECT 操作符返回兩個結果集的交集 17 SELECT employee_id, job_id 18 FROM employees 19 INTERSECT 20 SELECT employee_id, job_id 21 FROM job_history; 22 23 --MINUS操作符:返回兩個結果集的差集
24 SELECT employee_id,job_id 25 FROM employees 26 MINUS 27 SELECT employee_id,job_id 28 FROM job_history;

使用 SET 操作符注意事項
*在SELECT 列表中的列名和表示式在數量和資料型別上要相對應
*括號可以改變執行的順序
*ORDER BY 子句:
  只能在語句的最後出現
  可以使用第一個查詢中的列名, 別名或相對位置

*除 UNION ALL之外,系統會自動將重複的記錄刪除
*系統將第一個查詢的列名顯示在輸出中
*除 UNION ALL之外,系統自動按照第一個查詢中的第一個列的升序排列

 1 --匹配各SELECT 語句舉例1
 2 SELECT department_id, TO_NUMBER(null) 
 3        location, hire_date
 4 FROM   employees
 5 UNION
 6 SELECT department_id, location_id,  TO_DATE(null)
 7 FROM   departments;
 8 
 9 --匹配各SELECT 語句舉例2
10 SELECT employee_id, job_id,salary
11 FROM   employees
12 UNION
13 SELECT employee_id, job_id,0
14 FROM   job_history;
15 
16 --使用相對位置排序舉例
17 COLUMN a_dummy NOPRINT --查詢結果不顯示a_dummy列
18 SELECT 'sing' AS "My dream", 1 a_dummy
19 FROM dual
20 UNION
21 SELECT 'I`d like to teach', 2
22 FROM dual
23 UNION 
24 SELECT 'the world to',3
25 FROM dual
26 ORDER BY 2 asc;

eg:

 1 --查詢部門的部門號,其中不包括job_id是”ST_CLERK”的部門號
 2 --select department_id
 3 --from departments
 4 --where department_id not in (
 5 --                           select distinct department_id
 6 --                           from employees
 7 --                           where job_id = 'ST_CLERK'
 8 --                           )
 9 select department_id
10 from departments
11 minus
12 select department_id
13 from employees
14 where job_id = 'ST_CLERK';
15 
16 --查詢10,50,20號部門的job_id,department_id並且department_id按10,50,20的順序排列
17 column a_dummy noprint;
18 SELECT job_id,department_id,1 a_dummy
19 from employees
20 where department_id = 10
21 union
22 SELECT job_id,department_id,2
23 from employees
24 where department_id = 50
25 union
26 SELECT job_id,department_id,3
27 from employees
28 where department_id = 20
29 order by 3 asc;
30 
31 --查詢所有員工的last_name ,department_id 和department_name
32 select last_name,department_id,to_char(null)
33 from employees
34 union
35 select to_char(null),department_id,department_name
36 from departments;