SQL 基础7—— 集合运算(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.

时间: 2024-10-27 10:11:52

SQL 基础7—— 集合运算(UNION 与UNION ALL)的相关文章

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

--============================================= -- SQL 基础--> 集合运算(UNION 与UNION ALL) --=============================================       集合运算操作符可以将两个或多个查询返回的行组合起来,即集合属于纵向连接运算   一.常用的集合运算符     UNION ALL 返回各个查询检索出的所有的行,不过滤掉重复记录     UNION     返回各个查询检索出

Oracle集合运算

SQL> --什么是集合运算? SQL> --查询10号部门和20号部门的员工 SQL> --第一种 SQL> select *   2  from emp   3  where deptno=10 or deptno=20;      EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO                                   ---------

图解SQL的inner join、left join、right join、full outer join、union、union all的区别

SQL的Join语法有很多,inner join(等值连接) 只返回两个表中联结字段相等的行,left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,看到一篇图解文章,非常清楚简洁的说明了使用JOIN操作后的结果集是什么格式. 假设我们有两张表.Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同的,如下所示: A表 id name 1 P

SQL中MINUS、INTERSECT、UNION、UNION All

一.基本概念 差集:MINUS 交集:INTERSECT 并集:UNION.UNION All.UNION将重复的元组去掉,UNION ALL则不会.   表Store_Information 店面营业表 store_name Sales Date 分店1 1500 2013-01-05 分店2 250 2013-01-07 分店1 300 2013-01-08 分店3 700 2013-01-08 表Internet Sales 网络营业表 Date Sales 2013-01-07 850

LINQ体验(8)—LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Pag

LINQ体验(8)-LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不

SQL中UNION 与 UNION ALL 的区别

区别 SQLServer2000中UNION与UNION ALL的区别 UNION 运算符: 将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行.这与使用联接组合两个表中的列不同. 使用 UNION 组合两个查询的结果集的两个基本规则是: 所有查询中的列数和列的顺序必须相同. 数据类型必须兼容.        这种多结果的查询组合为单一结果集在实际中应用的非常方便.但在应用中也有有着问题,如下实例可以进一步说明问题. 问题描述:        为了进一步分析与统计企

SQL UNION 和 UNION ALL 操作符

SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同. SQL UNION 语法 SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2 注释:默认地,UNION 操作符选取不同的值.如果允许重复的

Sql学习第一天——SQL UNION 和 UNION ALL 操作符认识_MsSql

关于SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 注意: 1.UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列的顺序必须相同. 2.UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名. SQL UNION 语法(结果集没有重复值): 复制代码 代码如下: SELECT s FROM table1 UNION SELECT s FROM t

sql中UNION和UNION ALL比较与用法

union只是将两个结果联结起来一起显示,并不是联结两个表---- UNION 的语法如下: [SQL 语句 1] UNION [SQL 语句 2] 假设我们有以下的两个表格,   Store_Information 表格   store_name Sales Date  代码如下 复制代码 Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-0