该文转载自:http://www.cnblogs.com/chaobaojun/archive/2009/12/24/1631508.html

在MS-SQL如果将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行,常用的方法如下:

 
一.       使用union 或union All语句
1.   union 与 union all语句的区别
Ø         UNION 组合多个表(或结果集)并将其作为单个结果集返回;
Ø         UNION ALL 在结果中包含所有的行,包括重复行。
Ø         也就是说,使用UNION组合两个表时,将重复的记录删除;而使用UNION ALL组合两多个表时,不考虑结果集中是否存在重复记录,包括重复行。
2.   使用 UNION 运算符时请注意:
(1) 所有查询中的列数和列的顺序必须相同。
     在使用 UNION 运算符组合的语句中,所有显示列表的数目必须相同(列表内容可以包括:列名、算术表达式、聚合函数等);
(2)  数据类型必须兼容。
     在使用 UNION 组合的结果集中的相应列必须具有相同数据类型,或者两种数据类型之间存在隐性数据转换,或提供了类型转换。例如,在datetime 数据类型的列和 binary 数据类型的列之间不可能存在 UNION 运算符,除非提供了显式转换,而在 money 数据类型的列和 int 数据类型的列之间可以存在 UNION 运算符,因为它们可以进行隐性转换。
(3)  用 UNION 运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为 UNION 运算符是按照各个查询给定的顺序逐个比较各列。   
3.   与其它 Transact-SQL语句一起使用 UNION 语句时,应注意:
(1)   如果在有UNION的语句中使用INTO语句,则只能在最终表(或结果集)中使用,如果要在单个表(或结果集)中使用INTO语句,MS-SQL将会提示错误;
错误语句:Select AID,AName,ADemo Into From ATable Union All Select BID,BName,BDemo Into From Btable
(2) 只有在 UNION 语句的结尾,才允许使用 ORDER BY 和 COMPUTE 子句以定义最终结果的顺序或计算汇总值。不能在组建 UNION 语句的单独查询中使用这些子句。
错误语句:
Select AID,AName,ADemo From ATable order by AID
Union All
Select BID,BName,BDemo From BTable Order By BID  
 
正解可以这样写:
Select * From
(Select AID,AName,ADemo From ATable Union All Select BID,BName,BDemo From BTable) a
Order By a.AID
 
正解也可以这样写:
    Select AID,AName,ADemo From ATable
    Union All
    Select BID,BName,BDemo From BTable
      Order By AID
 
   此处之所以按AID来排序,是因为MS-SQL中将最后的结果表中的第一列命名为AID。某些DBMS的系统并不对使用不同列名的查询的表列命名,这样就不能使用Order By 列名的方式来排序,不过可以引用结果表中列的顺序来排序,例如:Order By 1,则相当于Order By AID
(1)   GROUP BY 和 HAVING 子句只能在单独的查询中使用;它们不能用来影响最终的结果集。
(2)   UNION 运算符可用于 INSERT 语句中。
     FOR BROWSE 子句不能在包含 UNION 运算符的语句中使用。(FOR BROWSE使用及说明可以参考SELECT语句的说明)
   注意:某些DBMS系统在由UNION组合查询的Select子句中不允许使用函数和表达式。
 
二.       使用except 或 INTERSECT 运算符

EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据。

INTERSECT是指在两个集合中都存在的数据。

      与UNION相似,except 或 INTERSECT 运算符也可以将多个表(或结果集)组合生成一个新表(或结果集),只是结果不同而已。
1.   Except运算符
    和 UNION 指令类似, Except也是对两个 SQL 语句所产生的结果做处理的。不同的地方是Except在每一个表(或结果集)与第二个表(或结果集)比较前,已从每一个表的结果集中清除了所有重复的信息。也就是从Except运算所得到的结果集绝不会包含重复的记录(行)。
    例如:我们要在Table_A(学生信息表)与Table_B(学生必修课完成信息表)中找出未完成的学生信息
       Select * From Table_A
       Except
       Select * From Table_B
    注意:许多DBMS系统不支持EXCEPT运算符,则此时不得不使用Left Outer Join运算符来实现。而在Oracle中的Minus与EXCEPT相似。
2.      INTERSECT运算符
    和 UNION 指令类似, INTERSECT 也是对两个 SQL 语句所产生的结果做处理的。不同的地方是,UNION 是联集,而INTERSECT 是交集。也就是说,INTERSECT生成的结果集是多个或结果集所共有的记录(行)。
       Select AID,AName,ADemo From ATable
       INTERSECT
      Select BID,BName,BDemo From Btable
 
三.    使用UNION Corresponding组合来自两个或多个与UNION不兼容的表中的行
 例如:有两个表
   Create Table Table_A(ID int,office int,address varchar(20),department char(5),pay money)
   Create Table Table_B(office int,ID int,address varchar(20),department char(5))
   可以使用UNION Corresponding来获取两个表中有共同列名的列中数据:
   Select * From table_A UNION Corresponding Select * From Table_b
  
  

注意:并不是所有的DBMS都支持UNION Corresponding运算,包括MS-SQL Server。

sql中Union和union all的使用的更多相关文章

  1. LINQ to SQL 中 Concat、Union、Intersect、Except 方法的使用

    Ø  前言 LINQ to SQL 中需要对两个或多个数据集进行操作,比如:合并.取交集等,主要使用下面四个方法,这四个方法都是 System.Linq.IQueryable<out T> ...

  2. SQL中intersect、union、minus和except 运算符

    1.intersect运算符intersect运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表.当 ALL 随 INTERSECT 一起使用时 (inte ...

  3. Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解

    UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT  学号, 课程号, 成绩 FROM   学习 WHERE   课程号='180101' ...

  4. Sql Server的艺术(五) SQL UNION与UNION JOIN运算符

    学习本节所用表: CREATE TABLE TEACHER ( ID INT IDENTITY (,) PRIMARY KEY , --主键,自增长 TNO INT NOT NULL, --教工号 T ...

  5. SQL中union运算操作的理解

    在SQL中,对于并运算,可以使用union关键字. 例如: SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FRO ...

  6. Sql中的union和union all的讲解

    SQL UNION 和 UNION ALL操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相 ...

  7. 【转载】SQL语句中Union和Union All的区别

    在使用到SQL语句进行数据库查询的过程中,如果需要求两个数据集合的并集,一般会使用到联合查询关键字Union或者Union All,其实Union和Union All两者的使用有一定差别,查出来的数据 ...

  8. SQL中Union和Union All

    工作中,看到大佬写的一段SQL,查询了五个表中的数据,最后求某个收入的总和,其中使用了Union All,因此在这里记录一下我从中学到的东西 先上语法 Union:   [ Select语句1 ] U ...

  9. SQL中Union和UnionAll的使用

    SQL中Union和UnionAll的使用 1.建立一个Student表 ,如下: 2.建立一个Teacher表,如下: 3.使用Union,将去重并组合表,效果: 4.使用Union All,不去重 ...

随机推荐

  1. day1 UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 2490: illegal multibyte sequence 错误提示

    get方式得到网页的信息 #coding=utf-8 #pip install requests #直接get到网页的信息 import requests from bs4 import Beauti ...

  2. 【RedHat Linux】 链路聚合

    [链路聚合] RHEL 7运行模式:teamd 守护进程, teamdctlroundrobin 轮询activebackup 热备份, 其中一个位为backuploadbalance 负载均衡lac ...

  3. 【mysql】排序方操作50题练习及其答案

    1.创建数据库.相关表,并插入数据create database homework;use homework; create table class_grade(gid int primary key ...

  4. 使用Themeleaf时, HTML内嵌的JS代码需要注意< 和 >的问题

    如果你使用了Themeleaf, 你的HTML文件又使用了内嵌的JS代码,那么一定要注意 你的JS代码必须用这样用: <script> /*<![CDATA[*/ var a = 6 ...

  5. 关于AutoMapper和WCF的一些认识

    现在互联网时代呈尚快速开发,快速迭代.伴随着必然产生一些好用的第三方工具,今天有幸看到了Automapper这种类似ORM的框架,但是跟ORM还不太一样, ORM是实体和数据库表之间的映射,而此框架主 ...

  6. ATmega8仿真——LED 数码管的学习

    1. I/O 口的结构及特点 Atmega8 有23 个I/O 引脚,分成3 个8 位的端口B.C 和D,其中C 口只有7 位 Atmega8 采用3个8位寄存器来控制I/O端口,它们分别是:方向寄存 ...

  7. javaweb学习1——加密

    声明:本文只是自学过程中,记录自己不会的知识点的摘要,如果想详细学习JavaWeb,请到孤傲苍狼博客学习,JavaWeb学习点此跳转 本文链接:https://www.cnblogs.com/xdp- ...

  8. React——条件渲染

    在React中,你可以创建各种不同的组件,然后根据应用的状态渲染出它们其中的一般部分. 一.用变量存储元素 可以将元素保存到一个变量中,通过为变量赋不同的值去渲染不同的元素 function Logi ...

  9. 41F继电器座的解剖与妙用

    摘要:如果继电器不是焊在电路板上使用,就需要有个插座,这样方便接线,否则继电器的管脚是没法固定导线的.实际项目中使用了HF41F的继电器(宏发),在选择继电器座的时候,有一点感想,分享给大家.继电器是 ...

  10. 随机游走模型(RandomWalk Mobility)

    随机游走模型由首先由爱因斯坦在1926年以数学方式描述.由于自然界中的许多实体会以不可预知的方式移动,因此随机游走模型用来描述这种不稳定的移动.在这种移动模型中,移动节点随机选择一个方向和速度来从当前 ...