SQL语句 UNION 和 UNION ALL 使用

http://blog.csdn.net/zhangyj_315/article/details/2250012

UNION

UNION命令用于从两个表中选取相关的信息,很类似JOIN命令。不过,当使用UNION命令时,所有被选取的列的数据类型应该是相同的。

注释:如使用UNION,那么只有不同的值会被选取。

Employees_Norway:

E_IDE_Name
01Hansen, Ola
02Svendson, Tove
03Svendson, Stephen
04Pettersen, Kari

Employees_USA:

E_IDE_Name
01Turner, Sally
02Kent, Clark
03Svendson, Stephen
04Scott, Stephen

使用UNION命令

实例

列出所有在挪威和美国的不同的雇员名:

  
  
SELECT E_Name FROM Employees_Norway
UNION
SELECT E_Name FROM Employees_USA
结果
E_Name
Hansen, Ola
Svendson, Tove
Svendson, Stephen
Pettersen, Kari
Turner, Sally
Kent, Clark
Scott, Stephen

注释:这个命令无法列出在挪威和美国的所有雇员。在上面的例子中,我们有两个名字相同的雇员,他们当中只有一个人被列出来了。UNION命令只会选取不同的值

使用UNION ALL命令

UNION ALL命令和UNION命令几乎是等效的,不过UNION ALL命令会列出所有的值

实例:

列出在挪威和美国的所有的雇员:

  
  
SELECT E_Name FROM Employees_Norway
UNION ALL
SELECT E_Name FROM Employees_USA
结果
E_Name
Hansen, Ola
Svendson, Tove
Svendson, Stephen
Pettersen, Kari
Turner, Sally
Kent, Clark
Svendson, Stephen
Scott, Stephen

http://blog.csdn.net/zhangyj_315/article/details/2250066

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 运算符
      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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值