组合多个SQL Server查询的结果集

日期: 2010-01-04 作者:Robert Sheldon翻译:曾少宁 来源:TechTarget中国 英文

SQL Server可以组合多个查询到一个语句中,以产生单个结果集。为了将查询连接在一起,我们可以使用UNION、INTERSECT或EXCEPT操作符。在组合每个结果集时,每一个操作符都会产生不同的结果。例如,UNION操作符是简单地组合每个查询返回的数据到一个结果集中。

INTERSECT操作符则只返回包含在所有结果集中的值,而EXCEPT操作符只返回每一个结果集中出现的值。   这些操作符的区别将会在下面的章节中详细介绍。然而,首先需要注意这些操作符在用来组合查询时有一些共同的特点。   在组合查询时,我们需要直接指定查询之间的操作符来连接它们。

此外,我们必须遵守下面这些准则:   每一个……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

SQL Server可以组合多个查询到一个语句中,以产生单个结果集。为了将查询连接在一起,我们可以使用UNION、INTERSECT或EXCEPT操作符。在组合每个结果集时,每一个操作符都会产生不同的结果。例如,UNION操作符是简单地组合每个查询返回的数据到一个结果集中。INTERSECT操作符则只返回包含在所有结果集中的值,而EXCEPT操作符只返回每一个结果集中出现的值。

  这些操作符的区别将会在下面的章节中详细介绍。然而,首先需要注意这些操作符在用来组合查询时有一些共同的特点。

  在组合查询时,我们需要直接指定查询之间的操作符来连接它们。此外,我们必须遵守下面这些准则:

  •   每一个查询的SELECT列表必须包含相同个数的字段或表达式。
  •   每一个查询的SELECT列表中的字段和表达式的顺序必须相同。例如,如果第一个查询的SELECT列表包含了字段EmployeeID、FirstName和LastName(注意顺序),那么包含在其它查询的SELECT列表中的字段顺序必须与之相同。
  •   一个查询的SELECT列表的每一项的数据类型必须与其它查询的SELECT列表的相应项的数据类型相同。换句话说,如果第一个查询的SELECT列表的第一个字段的数据类型是int ,那么其它查询的SELECT列表中的第一个字段也必须是int数据类型或者是能够显式或隐式转换成int的数据类型。
  •   我们只有在最后一个查询中才能使用ORDER BY字句。然后这个子句会被应用到所有查询返回的结果集中。我们不能够在其它任何一个查询中使用ORDER BY。
  •   我们只可以在单个子查询中使用GROUP BY和HAVING子句,而不能将这些子句用在总查询的结果集中。
  •   第一个查询可以包含一个INTO子句来创建一个表。然后该表将保存所有查询的结果集。
  •   我们不能在一个INSERT语句中使用UNION、INTERSECT和EXCEPT操作符。
  •   我们不能在包含UNION、INTERSECT和EXCEPT操作符的语句中使用FOR BROWSE子句。

  在学习使用UNION、INTERSECT和EXCEPT操作符过程中,我们需要记住很多的规则,现在让我们来回顾一下这些规则。同时,让我们看几个演示是如何使用这些操作符的例子。在这3个例子中,我执行了下面的Transact-SQL脚本来在AdventureWorks2008数据库中创建3个表。

  USE AdventureWorks2008;
  IF OBJECT_ID
  ('Employees1', 'U') IS NOT NULL
  DROP TABLE dbo.Employees1;
  SELECT BusinessEntityID,
  FirstName,
  LastName
  INTO dbo.Employees1
  FROM HumanResources.vEmployee
  WHERE BusinessEntityID BETWEEN 1 AND 4;
  IF OBJECT_ID ('Employees2', 'U') IS NOT NULL
  DROP TABLE dbo.Employees2;
  SELECT BusinessEntityID,
  FirstName,
  LastName
  INTO dbo.Employees2
  FROM HumanResources.vEmployee
  WHERE BusinessEntityID BETWEEN 3 AND 6;
  IF OBJECT_ID ('Employees3', 'U') IS NOT NULL
  DROP TABLE dbo.Employees3;
  SELECT BusinessEntityID,
  FirstName,
  LastName
  INTO dbo.Employees3
  FROM HumanResources.vEmployee
  WHERE BusinessEntityID BETWEEN 5 AND 8;

  我在一个SQL Server 2008实例中创建了这些表。这里讨论的原则也适用于SQL Server 2005,但是如果想要在SQL Server 2005中创建这些表,要使用AdventureWorks数据库,而不是AdventureWorks2008,并且要将BusinessEntityID字段名改成EmployeeID。

翻译

曾少宁
曾少宁

TechTarget中国特约技术编辑,某高校计算机科学专业教师和网络实验室负责人,曾任职某网络国际厂商,关注数据中心、开发运维、数据库及软件开发技术。有多本关于思科数据中心和虚拟化技术的译著,如《思科绿色数据中心建设与管理》和《基于IP的能源管理》等。

相关推荐

  • 解析T-SQL的SELECT查询语法

    Select是T-SQL语言中最复杂的语句之一。通常认为select语句是用来检索数据库中的信息,而SELECT语句针对不同要求可以进行无数的组合。

  • SQL Server中动态SQL执行解析

    动态SQL一般是根据用户输入或外部条件动态组合的SQL语句块。动态SQL能灵活的发挥SQL强大的功能、方便的解决一些其它方法难以解决的问题。

  • 在SQL Server中如何使用子查询(上)

    SQL Server支持的T-SQL语言特性之一是子查询(subquery),它可以内嵌在一个SELECT、INSERT、UPDATE或DELETE语句中。

  • SQL Server查询速度慢原因及优化方法

    导致SQL Server查询速度变慢的原因有很多,比如索引、SQL语句、死锁等等,如何对数据库进行优化是DBA经常需要考虑的,这里就介绍几种优化的方法。