SQL语句 UNION 和 UNION ALL 使用(二)

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

 

.       使用union union All语句

1.       union union all语句的区别

Ø        UNION 组合多个表(或结果集)并将其作为单个结果集返回;

Ø        UNION ALL 在结果中包含所有的行,包括重复行。

Ø        也就是说,使用UNION组合两个表时,将重复的记录删除;而使用UNION ALL组合两多个表时,不考虑结果集中是否存在重复记录,包括重复行。

2.   使用UNION 运算符时请注意:

()所有查询中的列数和列的顺序必须相同。

     在使用UNION 运算符组合的语句中,所有显示列表的数目必须相同(列表内容可以包括:列名、算术表达式、聚合函数等);

() 数据类型必须兼容。

     在使用UNION 组合的结果集中的相应列必须具有相同数据类型,或者两种数据类型之间存在隐性数据转换,或提供了类型转换。例如,在datetime 数据类型的列和binary 数据类型的列之间不可能存在UNION 运算符,除非提供了显式转换,而在money 数据类型的列和int 数据类型的列之间可以存在UNION 运算符,因为它们可以进行隐性转换。

() UNION 运算符组合的各语句中对应的结果集列出现的顺序必须相同,因为UNION 运算符是按照各个查询给定的顺序逐个比较各列。  

3.   与其它Transact-SQL语句一起使用UNION 语句时,应注意:

()  如果在有UNION的语句中使用INTO语句,则只能在最终表(或结果集)中使用,如果要在单个表(或结果集)中使用INTO语句,MS-SQL将会提示错误;

错误语句:Select AID,AName,ADemo Into From ATable Union All Select BID,BName,BDemo Into From Btable

()只有在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

()  GROUP BY HAVING 子句只能在单独的查询中使用;它们不能用来影响最终的结果集。

()  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中的MinusEXCEPT相似。

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

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangyj_315/archive/2008/04/04/2250066.aspx

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值