UNION 运算符

将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部行。这与使用联接组合两个表中的列不同。

使用 UNION 组合两个查询的结果集的两个基本规则是:

  • 所有查询中的列数和列的顺序必须相同。
  • 数据类型必须兼容。
语法

    { < query specification > | ( < query expression > ) }
        UNION [ ALL ]

        < query specification | ( < query expression > )
            [ UNION [ ALL ] < query specification | ( < query expression > )
                [ ...n ] ]

参数

< query_specification > | ( < query_expression > )

是查询规范或查询表达式,用以返回与另一个查询规范或查询表达式所返回的数据组合的数据。作为 UNION 运算一部分的列定义可以不相同,但它们必须通过隐性转换实现兼容。

下表说明数据类型与相应 (ith) 列的选项的比较规则。

ith 列的数据类型结果表中 ith 列的数据类型
非数据兼容类型(数据转换不由 Microsoft® SQL Server™ 隐性处理)。SQL Server 返回的错误。
长度为 L1 和 L2 的固定长度 char长度与 L1 和 L2 中较长的那个相等的固定长度 char
长度为 L1 和 L2 的固定长度 binary长度与 L1 和 L2 中较长的那个相等的固定长度 binary
任一列或两列都是可变长度 char长度与为 ith 列指定的最大长度相等的可变长度 char
任一列或两列都是可变长度 binary长度与为 ith 列指定的最大长度相等的可变长度 binary
两列都是数字数据类型(如 smallintintfloatmoney)。与两列的最大精度相等的数据类型。例如,如果表 A 的 ith 列是 int 类型,表 B 的 ith 列是 float 类型,则 ith 列在结果表中的数据类型是 float,因为 floatint 更精确。
两列的描述都指定 NOT NULL。指定 NOT NULL。

UNION

指定组合多个结果集并将其作为单个结果集返回。

ALL

在结果中包含所有的行,包括重复行。如果没有指定,则删除重复行。

UNION 的指定方式如下:

select_statement UNION [ALL] select_statement

例如,Table1Table2 具有相同的两列结构。

Table1  Table2 
ColumnAColumnB ColumnCColumnD
char(4)int char(4)int
---------- ----------
abc1 ghi3
def2 jkl4
ghi3 mno5

下面的查询在这两个表之间创建 UNION 运算:

SELECT * FROM Table1
UNION
SELECT * FROM Table2

下面是结果集:

ColumnA  ColumnB
-------  --------
abc      1
def      2
ghi      3
jkl      4
mno      5

UNION 的结果集列名与 UNION 运算符中第一个 SELECT 语句的结果集中的列名相同。另一个 SELECT 语句的结果集列名将被忽略。

默认情况下,UNION 运算符从结果集中删除重复的行。如果使用 ALL 关键字,那么结果中将包含所有行并且将不删除重复的行。

UNION 运算的准确结果取决于安装过程中选择的排序规则和 ORDER BY 子句。

Transact-SQL 语句中可以出现任意数目的 UNION 运算符,例如:

SELECT * FROM TableA
UNION
SELECT * FROM TableB
UNION
SELECT * FROM TableC
UNION
SELECT * FROM TableD

默认情况下,Microsoft® SQL Server™ 2000 从左到右对包含 UNION 运算符的语句进行取值。使用圆括号指定求值的顺序。例如,以下语句并不等价:

/* First statement. */
SELECT * FROM TableA
UNION ALL
(   SELECT * FROM TableB
   UNION
   SELECT * FROM TableC
)
GO

/* Second statement. */
(SELECT * FROM TableA
 UNION ALL
 SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO

在第一个语句中,将消除 TableBTableC 之间的联合中的重复行。而在该集与 TableA 之间的并集中,不消除重复行。在第二个语句中,TableATableB 之间的联合中包含重复行,但在随后与 TableC 的联合中将消除。ALL 关键字对此表达式的最终结果没有影响。

如果使用 UNION 运算符,那么单独的 SELECT 语句不能包含其自己的 ORDER BY 或 COMPUTE 子句。只能在最后一个 SELECT 语句的后面使用一个 ORDER BY 或 COMPUTE 子句;该子句适用于最终的组合结果集。GROUP BY 和 HAVING 子句只能在单独的 SELECT 语句中指定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值