SQL Server可以组合多个查询到一个语句中,以产生单个结果集。为了将查询连接在一起,我们可以使用UNION、INTERSECT或EXCEPT操作符。在组合每个结果集时,每一个操作符都会产生不同的结果。例如,UNION操作符是简单地组合每个查询返回的数据到一个结果集中。
INTERSECT操作符则只返回包含在所有结果集中的值,而EXCEPT操作符只返回每一个结果集中出现的值。 这些操作符的区别将会在下面的章节中详细介绍。然而,首先需要注意这些操作符在用来组合查询时有一些共同的特点。 在组合查询时,我们需要直接指定查询之间的操作符来连接它们。
此外,我们必须遵守下面这些准则: 每一个……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属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经常需要考虑的,这里就介绍几种优化的方法。