--=============================================
-- SQL 基礎 --> 集合運算 (UNION 與 UNION ALL)
--=============================================
?
??? 集合運算操作符可以將兩個或多個查詢返回的行組合起來,即集合屬于縱向連接運算
?
一、常用的集合運算符
??? UNION ALL 返回各個查詢檢索出的所有的行,不過濾掉重復記錄
??? UNION ???? 返回各個查詢檢索出的過濾掉重復記錄的所有行,即并集
??? INTERSECT 返回兩個查詢檢索出的共有行,即交集
??? MINUS ???? 返回將第二個查詢檢索出的行從第一個查詢檢索出的行中減去之后剩余的行,即差集
???
二、集合運算的原則
??? 1. 所有選擇列表的表達式數目必須相同
??? 2. 對于結果集中各列,或個別子查詢中的任意列的子集必須具有相同的數據類型,或是可以隱式轉化為相同的數據類型,否則需顯示轉換
??? 3. 各個查詢中對應的結果集列出現的順序必須相同
??? 4. 生成的結果集中的列名來自 UNION 語句中第一個單獨的查詢
?
三、演示各個集合運算符 ??
???
??? -- 為集合運算生成環境,生成有相同結構的 emp 表,且命名為 emp2
??? SQL > conn scott / tiger ;
??? Connected .
??? SQL > select * from emp ;
?
?????? ? EMPNO ENAME ????? JOB ????????????? MGR HIREDATE ???????? SAL ?????? COMM ???? DEPTNO
??? ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
?????? ? 7369 SMITH ????? CLERK ?????????? 7902 17 - DEC - 80 ??????? 800 ??????????????????? 20
?????? ? 7499 ALLEN ????? SALESMAN ??????? 7698 20 - FEB - 81 ?????? 1600 ??????? 300 ???????? 30
?????? ? 7521 WARD ?????? SALESMAN ??????? 7698 22 - FEB - 81 ?????? 1250 ??????? 500 ???????? 30
?????? ? 7566 JONES ????? MANAGER ???????? 7839 02 - APR - 81 ?????? 2975 ??????????????????? 20
?????? ? 7654 MARTIN ???? SALESMAN ??????? 7698 28 - SEP - 81 ?????? 1250 ?????? 1400 ???????? 30
?????? ? 7698 BLAKE ????? MANAGER ???????? 7839 01 - MAY - 81 ?????? 2850 ??????????????????? 30
?????? ? 7782 CLARK ????? MANAGER ???????? 7839 09 - JUN - 81 ? ????? 2450 ??????????????????? 10
?????? ? 7788 SCOTT ????? ANALYST ???????? 7566 19 - APR - 87 ?????? 3000 ??????????????????? 20
?????? ? 7839 KING ?????? PRESIDENT ??????????? 17 - NOV - 81 ?????? 5000 ??????????????????? 10
?????? ? 7844 TURNER ???? SALESMAN ??????? 7698 08 - SEP - 81 ????? ? 1500 ????????? 0 ???????? 30
?????? ? 7876 ADAMS ????? CLERK ?????????? 7788 23 - MAY - 87 ?????? 1100 ??????????????????? 20
?
?????? ? EMPNO ENAME ????? JOB ????????????? MGR HIREDATE ???????? SAL ?????? COMM ???? DEPTNO
??? ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
?????? ? 7900 JAMES ????? CLERK ?????????? 7698 03 - DEC - 81 ??????? 950 ??????????????????? 30
?????? ? 7902 FORD ?????? ANALYST ???????? 7566 03 - DEC - 81 ?????? 3000 ??????????????????? 20
?????? ? 7934 MILLER ???? CLERK ?????????? 7782 23 - JAN - 82 ?????? 1300 ??????????????????? 10
?
??? 14 rows selected .
?
??? SQL > create table emp2 tablespace tbs1 as select * from emp where empno in ( 7369 , 7654 , 7839 , 7876 );
?
??? Table created .
???
??? SQL > insert into emp2 ( empno , ename , sal ) select 8001 , 'ROBINSON' , 3500 from dual ;
?
??? 1 row created .
?
??? SQL > insert into emp2 ( empno , ename , sal ) select 8002 , 'HENRY' , 3700 from dual ;
?
??? 1 row created .
?
??? SQL > insert into emp2 ( empno , ename , sal ) select 8004 , 'JOHNSON' , 4000 from dual ;
?
??? 1 row created .
???
??? SQL > select * from emp2 ;
?
?????? ? EMPNO ENAME ????? JOB ????????????? MGR HIREDATE ???????? SAL ?????? COMM ???? DEPTNO
??? ---------- ---------- --------- ---------- --------- ---------- ---------- ----------
?????? ? 7369 SMITH ????? CLERK ?????????? 7902 17 - DEC - 80 ??????? 800 ??????????????????? 20
?????? ? ? 7654 MARTIN ???? SALESMAN ??????? 7698 28 - SEP - 81 ?????? 1250 ?????? 1400 ???????? 30
?????? ? 7839 KING ?????? PRESIDENT ??????????? 17 - NOV - 81 ?????? 5000 ??????????????????? 10
?????? ? 7876 ADAMS ????? CLERK ?????????? 7788 23 - MAY - 87 ?????? 1100 ??????????????????? 20
?????? ? 8001 ROBINSON ??????????????????????????????????????? 3500
?????? ? 8002 HENRY ?????????????????????????????????????????? 3700
?????? ? 8004 JOHNSON ???????????????????????????????????????? 4000
?
??? --1.UNION ? 過濾了重復記錄
?????? SQL > select empno , ename , job , hiredate , sal from emp
?????? ? 2 ? union ???
?????? ? 3 ? select empno , ename , job , hiredate , sal from emp2 ;
?
?????????? ? EMPNO ENAME ????? JOB ?????? HIREDATE ???????? SAL
?????? ---------- ---------- --------- --------- ----------
?????????? ? 7369 SMITH ????? CLERK ???? 17 - DEC - 80 ??????? 800
?????????? ? 7499 ALLEN ????? SALESMAN ? 20 - FEB - 81 ?????? 1600
?????????? ? 7521 WARD ?????? SALESMAN ? 22 - FEB - 81 ?????? 1250
?????????? ? 7566 JONES ????? MANAGER ?? 02 - APR - 81 ?????? 2975
?????????? ? 7654 MARTIN ???? SALESMAN ? 28 - SEP - 81 ?????? 1250
?????????? ? 7698 BLAKE ????? MANAGER ?? 01 - MAY - 81 ?????? 2850
?????????? ? 7782 CLARK ????? MANAGER ?? 09 - JUN - 81 ?????? 2450
?????????? ? 7788 SCOTT ????? ANALYST ?? 19 - APR - 87 ?????? 3000
?????????? ? 7839 KING ?????? PRESIDENT 17 - NOV - 81 ?????? 5000
?????????? ? 7844 TURNER ???? SALESMAN ? 08 - SEP - 81 ?????? 1500
?????????? ? 7876 ADAMS ????? CLERK ???? 23 - MAY - 87 ?????? 1100
?
?????????? ? EMPNO ENAME ????? JOB ?????? HIREDATE ???????? SAL
?????? ---------- ---------- --------- --------- ----------
?????????? ? 7900 JAMES ????? CLERK ???? 03 - DEC - 81 ??????? 950
?????????? ? 7902 FORD ?????? ANALYST ?? 03 - DEC - 81 ?????? 3000
?????????? ? 7934 MILLER ???? CLERK ???? 23 - JAN - 82 ?? ???? 1300
?????????? ? 8001 ROBINSON ???????????????????????????? 3500
?????????? ? 8002 HENRY ??????????????????????????????? 3700
?????????? ? 8004 JOHNSON ????????????????????????????? 4000
?????? 17 rows selected .
???
??? --2.UNION ALL 并集,不去重復記錄
?????? SQL > select empno , ename , job , hiredate , sal from emp
?????? ? 2 ? union all
?????? ? 3 ? select empno , ename , job , hiredate , sal from emp2 ;
?
?????????? ? EMPNO ENAME ????? JOB ?????? HIREDATE ???????? SAL
?????? ---------- ---------- --------- --------- ----------
?????????? ? 7369 SMITH ????? CLERK ???? 17 - DEC - 80 ??????? 800
?????????? ? 7499 ALLEN ????? SALESMAN ? 20 - FEB - 81 ?????? 1600
?????????? ? 7521 WARD ?????? SALESMAN ? 22 - FEB - 81 ?????? 1250
?????????? ? 7566 JONES ????? MANAGER ?? 02 - APR - 81 ?????? 2975
?????????? ? 7654 MARTIN ???? SALESMAN ? 28 - SEP - 81 ?????? 1250
?????????? ? 7698 BLAKE ????? MANAGER ?? 01 - MAY - 81 ?????? 2850
?????????? ? 7782 CLARK ????? MANAGER ?? 09 - JUN - 81 ?????? 2450
?????????? ? 7788 SCOTT ????? ANALYST ?? 19 - APR - 87 ?????? 3000
?????????? ? 7839 KING ?????? PRESIDENT 17 - NOV - 81 ?????? 5000
?????????? ? 7844 TURNER ???? SALESMAN ? 08 - SEP - 81 ?????? 1500
?????????? ? 7876 ADAMS ????? CLERK ???? 23 - MAY - 87 ?????? 1100
?
?????????? ? EMPNO ENAME ????? JOB ?????? HIREDATE ???????? SAL
?????? ---------- ---------- --------- --------- ----------
?????????? ? 7900 JAMES ????? CLERK ???? 03 - DEC - 81 ??????? 950
?????????? ? 7902 FORD ?????? ANALYST ?? 03 - DEC - 81 ?????? 3000
?????????? ? 7934 MILLER ???? CLERK ??? ? 23 - JAN - 82 ?????? 1300
?????????? ? 7369 SMITH ????? CLERK ???? 17 - DEC - 80 ??????? 800
?????????? ? 7654 MARTIN ???? SALESMAN ? 28 - SEP - 81 ?????? 1250
?????????? ? 7839 KING ?????? PRESIDENT 17 - NOV - 81 ?????? 5000
?????????? ? 7876 ADAMS ????? CLERK ???? 23 - MAY - 87 ?????? 1100
?????????? ? 8001 ROBINSON ???????????????????????????? 3500
?????????? ? 8002 HENRY ??????????????????????????????? 3700
?????????? ? 8004 JOHNSON ????????????????????????????? 4000
?
?????? 21 rows selected .
?
??? --3.INTERSECT 交集 , 返回兩個結果集中共有了部分
?????? SQL > select empno , ename , job , hiredate , sal from emp
?????? ? 2 ? intersect
?????? ? 3 ? select empno , ename , job , hiredate , sal from emp2 ;
?
?????????? ? EMPNO ENAME ????? JOB ?????? HIREDATE ???????? SAL
?????? ---------- ---------- --------- --------- ----------
?????????? ? 7369 SMITH ????? CLERK ???? 17 - DEC - 80 ??????? 800
?????????? ? 7654 MARTIN ???? SALESMAN ? 28 - SEP - 81 ?????? 1250
?????????? ? 7839 KING ?????? PRESIDENT 17 - NOV - 81 ?????? 5000
?????????? ? 7876 ADAMS ????? CLERK ???? 23 - MAY - 87 ?????? 1100
?????????????
??? --4.MINUS ? 補集 , 前一個結果集減后一個結果集后的結果
?????? SQL > select empno as "EmployeeNo" , ename ? "EmployeeName" , job ? "Job" , hiredate as "HireDate" , sal "Sal" from emp
?????? ? 2 ? minus
?????? ? 3 ? select empno , ename , job , hiredate , sal from emp2
?????? ? 4 ? order by "Sal" ;
?
?????? EmployeeNo EmployeeNa Job ?????? HireDate ???????? Sal
?????? ---------- ---------- --------- --------- ----------
?????????? ? 7900 JAMES ????? CLERK ???? 03 - DEC - 81 ??????? 950
?????????? ? 7521 WARD ?????? SALESMAN ? 22 - FEB - 81 ?????? 1250
?????????? ? 7934 MILLER ???? CLERK ???? 23 - JAN - 82 ?????? 1300
?????????? ? 7844 TURNER ???? SALESMAN ? 08 - SEP - 81 ?????? 1500
?????????? ? 7499 ALLEN ????? SALESMAN ? 20 - FEB - 81 ?????? 1600
?????????? ? 7782 CLARK ????? MANAGER ?? 09 - JUN - 81 ?????? 2450
?????????? ? 7698 BLAKE ????? MANAGER ?? 01 - MAY - 81 ?????? 2850
?????????? ? 7566 JONES ????? MANAGER ?? 02 - APR - 81 ?????? 2975
?????????? ? 7788 SCOTT ????? ANALYST ?? 19 - APR - 87 ?????? 3000
?????????? ? 7902 FORD ?????? ANALYST ?? 03 - DEC - 81 ?????? 3000
?
?????? 10 rows selected .
?
四、更多
?
?
?
使用 OEM,SQL*Plus,iSQL*Plus 管理 Oracle 實例
?
Oracle 實例和 Oracle 數據庫 (Oracle 體系結構 )
?
?
???
???
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
