码迷,mamicode.com
首页 > 数据库 > 详细

07.SQL 基础--> 集合运算(UNION 与UNION ALL)

时间:2017-12-22 15:04:26      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:manager   name   表达式   部分   交集   analyst   size   顺序   tables   

 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)

标签:manager   name   表达式   部分   交集   analyst   size   顺序   tables   

原文地址:http://www.cnblogs.com/llill/p/8085633.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!