1. 程式人生 > >07.SQL 基礎--> 集合運算(UNION 與UNION ALL)

07.SQL 基礎--> 集合運算(UNION 與UNION ALL)

1-1 sel resid ner mil where ger 多個 tno

SQL 基礎--> 集合運算(UNION 與UNION ALL)

集合運算操作符可以將兩個或多個查詢返回的行組合起來,即集合屬於縱向連接運算

一、常用的集合運算符

UNION ALL 返回各個查詢檢索出的所有的行,不過濾掉重復記錄
UNION 返回各個查詢檢索出的過濾掉重復記錄的所有行,即並集
INTERSECT 返回兩個查詢檢索出的共有行,即交集
MINUS 返回將第二個查詢檢索出的行從第一個查詢檢索出的行中減去之後剩余的行,即差集

二、集合運算的原則

1.所有選擇列表的表達式數目必須相同
2.對於結果集中各列,或個別子查詢中的任意列的子集必須具有相同的數據類型,或是可以隱式轉化為相同的數據類型,否則需顯示轉換
3.各個查詢中對應的結果集列出現的順序必須相同
4.生成的結果集中的列名來自UNION語句中第一個單獨的查詢

三、演示各個集合運算符

--為集合運算生成環境,生成有相同結構的emp表,且命名為emp2

idle> select * from emp;

     EMPNO ENAME      JOB	       MGR HIREDATE	     SAL       COMM	DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK	      7902 1980-12-17	     800		    20
      7499 ALLEN      SALESMAN	      7698 1981-02-20	    1600	300	    30
      7521 WARD       SALESMAN	      7698 1981-02-22	    1250	500	    30
      7566 JONES      MANAGER	      7839 1981-04-02	    2975		    20
      7654 MARTIN     SALESMAN	      7698 1981-09-28	    1250       1400	    30
      7698 BLAKE      MANAGER	      7839 1981-05-01	    2850		    30
      7782 CLARK      MANAGER	      7839 1981-06-09	    2450		    10
      7788 SCOTT      ANALYST	      7566 1987-04-19	    3000		    20
      7839 KING       PRESIDENT 	   1981-11-17	    5000		    10
      7844 TURNER     SALESMAN	      7698 1981-09-08	    1500	  0	    30
      7876 ADAMS      CLERK	      7788 1987-05-23	    1100		    20
      7900 JAMES      CLERK	      7698 1981-12-03	     950		    30
      7902 FORD       ANALYST	      7566 1981-12-03	    3000		    20
      7934 MILLER     CLERK	      7782 1982-01-23	    1300		    10

14 rows selected.

 

idle>  create table emp2 tablespace tbs1 as select * from emp where empno in (7369,7654,7839,7876);

Table created.

 

idle> insert into emp2 (empno,ename,sal) select 8001,‘ROBINSON‘,3500 from dual;

1 row created.

idle> insert into emp2 (empno,ename,sal) select 8002,‘HENRY‘,3700 from dual;

1 row created.

idle> insert into emp2 (empno,ename,sal) select 8004,‘JOHNSON‘,4000 from dual;

1 row created.

 

idle>  select * from emp2;

     EMPNO ENAME      JOB	       MGR HIREDATE	     SAL       COMM	DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
      7369 SMITH      CLERK	      7902 1980-12-17	     800		    20
      7654 MARTIN     SALESMAN	      7698 1981-09-28	    1250       1400	    30
      7839 KING       PRESIDENT 	   1981-11-17	    5000		    10
      7876 ADAMS      CLERK	      7788 1987-05-23	    1100		    20
      8001 ROBINSON					    3500
      8002 HENRY					    3700
      8004 JOHNSON					    4000

7 rows selected.

  

--1.UNION 過濾了重復記錄

idle> select empno,ename,job,hiredate,sal from emp
union
select empno,ename,job,hiredate,sal from emp2;
  2    3  
     EMPNO ENAME      JOB	HIREDATE	  SAL
---------- ---------- --------- ---------- ----------
      7369 SMITH      CLERK	1980-12-17	  800
      7499 ALLEN      SALESMAN	1981-02-20	 1600
      7521 WARD       SALESMAN	1981-02-22	 1250
      7566 JONES      MANAGER	1981-04-02	 2975
      7654 MARTIN     SALESMAN	1981-09-28	 1250
      7698 BLAKE      MANAGER	1981-05-01	 2850
      7782 CLARK      MANAGER	1981-06-09	 2450
      7788 SCOTT      ANALYST	1987-04-19	 3000
      7839 KING       PRESIDENT 1981-11-17	 5000
      7844 TURNER     SALESMAN	1981-09-08	 1500
      7876 ADAMS      CLERK	1987-05-23	 1100
      7900 JAMES      CLERK	1981-12-03	  950
      7902 FORD       ANALYST	1981-12-03	 3000
      7934 MILLER     CLERK	1982-01-23	 1300
      8001 ROBINSON				 3500
      8002 HENRY				 3700
      8004 JOHNSON				 4000

17 rows selected.

  

--2.UNION ALL 並集,不去重復記錄

idle> select empno,ename,job,hiredate,sal from emp
union all
select empno,ename,job,hiredate,sal from emp2;
  2    3  
     EMPNO ENAME      JOB	HIREDATE	  SAL
---------- ---------- --------- ---------- ----------
      7369 SMITH      CLERK	1980-12-17	  800
      7499 ALLEN      SALESMAN	1981-02-20	 1600
      7521 WARD       SALESMAN	1981-02-22	 1250
      7566 JONES      MANAGER	1981-04-02	 2975
      7654 MARTIN     SALESMAN	1981-09-28	 1250
      7698 BLAKE      MANAGER	1981-05-01	 2850
      7782 CLARK      MANAGER	1981-06-09	 2450
      7788 SCOTT      ANALYST	1987-04-19	 3000
      7839 KING       PRESIDENT 1981-11-17	 5000
      7844 TURNER     SALESMAN	1981-09-08	 1500
      7876 ADAMS      CLERK	1987-05-23	 1100
      7900 JAMES      CLERK	1981-12-03	  950
      7902 FORD       ANALYST	1981-12-03	 3000
      7934 MILLER     CLERK	1982-01-23	 1300
      7369 SMITH      CLERK	1980-12-17	  800
      7654 MARTIN     SALESMAN	1981-09-28	 1250
      7839 KING       PRESIDENT 1981-11-17	 5000
      7876 ADAMS      CLERK	1987-05-23	 1100
      8001 ROBINSON				 3500
      8002 HENRY				 3700
      8004 JOHNSON				 4000

21 rows selected.

  

--3.INTERSECT 交集,返回兩個結果集中共有了部分

idle> select empno,ename,job,hiredate,sal from emp
intersect
select empno,ename,job,hiredate,sal from emp2;
  2    3  
     EMPNO ENAME      JOB	HIREDATE	  SAL
---------- ---------- --------- ---------- ----------
      7369 SMITH      CLERK	1980-12-17	  800
      7654 MARTIN     SALESMAN	1981-09-28	 1250
      7839 KING       PRESIDENT 1981-11-17	 5000
      7876 ADAMS      CLERK	1987-05-23	 1100

  

--4.MINUS 補集,前一個結果集減後一個結果集後的結果

idle> select empno as "EmployeeNo" ,ename  "EmployeeName",job  "Job" ,hiredate as "HireDate",sal "Sal" from emp
minus
select empno,ename,job,hiredate,sal from emp2
order by "Sal";
  2    3    4  
EmployeeNo EmployeeNa Job	HireDate	  Sal
---------- ---------- --------- ---------- ----------
      7900 JAMES      CLERK	1981-12-03	  950
      7521 WARD       SALESMAN	1981-02-22	 1250
      7934 MILLER     CLERK	1982-01-23	 1300
      7844 TURNER     SALESMAN	1981-09-08	 1500
      7499 ALLEN      SALESMAN	1981-02-20	 1600
      7782 CLARK      MANAGER	1981-06-09	 2450
      7698 BLAKE      MANAGER	1981-05-01	 2850
      7566 JONES      MANAGER	1981-04-02	 2975
      7788 SCOTT      ANALYST	1987-04-19	 3000
      7902 FORD       ANALYST	1981-12-03	 3000

10 rows selected.

  

07.SQL 基礎--> 集合運算(UNION 與UNION ALL)