07.SQL 基礎--> 集合運算(UNION 與UNION ALL)
阿新 • • 發佈:2017-12-22
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)