使用UNION操作符组合结果集

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

UNION操作符可以组合2个或更多的查询到一个语句,以产生包含所有值的结果集。例如,下面的语句从Employees1和Employees2表查询数据:    SELECT BusinessEntityID,     FirstName,     LastName     FROM Employees1     UNION     SELECT BusinessEntityID,     FirstName,     ……

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

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

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

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

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

UNION操作符可以组合2个或更多的查询到一个语句,以产生包含所有值的结果集。例如,下面的语句从Employees1和Employees2表查询数据: 

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees1  

  UNION  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees2;  

  注意UNION操作符连结单个查询。每一个查询包含相同数量的字段,并且这些字段的顺序是相同的。此外,对应字段的数据类型是兼容的。(注意如果第二个查询的字段名与第一个查询的字段名不同,那么第一个查询的字段名会被使用。)上面例子的执行结果如下: 

BusinessEntityID  FirstName  LastName  
------------------------------------------
1KenSánchez
2TerriDuffy
3RobertoTamburello
4RobWalters
5GailErickson
6JossefGoldberg


  我们可以看到,来自两个表的值都包含在结果中。然而,你可能会发现只有一行记录是对应BusinessEntityID 3和一行记录对应BusinessEntityID 4,尽管每一个表都包含这些记录。默认情况下,UNION操作符只返回不同的值。换句话说,虽然每一个结果集返回4条记录,最终的结果集只包含6条记录,因为重复的记录被去掉。 

  我们可以通过在UNION后指定ALL选项来重载默认行为,如下面例子所示:  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees1  

  UNION ALL  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees2; 


  最终的结果集现在包含来自两个表的所有记录,即使它们是重复的,如下所示: 

BusinessEntityID  FirstName  LastName  
------------------------------------------
1KenSánchez
2TerriDuffy
3RobertoTamburello
4RobWalters
3RobertoTamburello
4RobWalters
5GailErickson
6JossefGoldberg


  我们可以看到,现在对应于BusinessEntityID值为3和4分别有2条记录,尽管ID并不是按顺序列出的。相反,结果集先列出第一个查询返回的数据,然后列表第二个查询返回的数据。然而,我们也可以在最终查询后增加一个ORDER BY子句来对最终结果进行排序,如下所示: 

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees1  

  UNION ALL  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees2;  

  ORDER BY BusinessEntityID;  


  我们可以看到下面的数据,最终结果集现在是根据BusinessEntityID值排序的: 

BusinessEntityID  FirstName  LastName  
------------------------------------------
1KenSánchez
2TerriDuffy
3RobertoTamburello
3RobertoTamburello
4RobWalters
4RobWalters
5GailErickson
6JossefGoldberg

  ORDER BY子句指出另一个更微妙的问题。当多个查询通过一个UNION操作符连结时,数据库引擎默认会根据查询指定的顺序来处理查询。例如,在下面的语句中,数据库引擎先从Employees1表中查询数据,并将它与从Employees2表中查询得到的数据组合,然后再与从Employees3表查询得到的数据组合。 

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees1  

  UNION ALL  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees2;  

  UNION  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees3  

  ORDER BY BusinessEntityID;  


  然而,要注意前面2个查询是通过UNION ALL操作符连结的,但是第2个和第3个查询是用UNION操作符连结的。这意味着当第1个结果集与第2个结果集组合时,所有结果都包含在内了,但是当新的结果集随后与第3个结果集组合时,所有重复的记录会被清除,因为UNION后面没有使用ALL,如下所示: 

BusinessEntityID  FirstName  LastName  
------------------------------------------
1KenSánchez
2TerriDuffy
3RobertoTamburello
4RobWalters
5GailErickson
6JossefGoldberg
7DylanMiller
8DianeMargheim
 

  我们可以使用括号来重载默认行为。括号内的查询会首先处理,使我们能更好地控制结果集。在下面的例子中,我将第2个和第3个查询包含在一对括号中:  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees1  

  UNION ALL  

  (SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees2;  

  UNION  

  SELECT BusinessEntityID,  

  FirstName,  

  LastName  

  FROM Employees3)  

  ORDER BY BusinessEntityID;
 

  现在第2个和第3个查询会先处理,然后这个结果会与第1个查询的相组合。结果,UNION ALL会保留,如下所示: 

BusinessEntityID  FirstName  LastName  
------------------------------------------
1KenSánchez
2TerriDuffy
3RobertoTamburello
3RobertoTamburello
4RobWalters
4RobWalters
5GailErickson
6JossefGoldberg
7DylanMiller
8DianeMargheim

  我们可以看到,现在对应于BusinessEntityID值3和4分别有2条记录,但是重复的记录仍然从组合表Employees2和表Employees3的查询中删除。 

翻译

曾少宁
曾少宁

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

相关推荐

  • 是否应该升级到SQL Server 2012?

    今年又有新版本的SQL Server发布。微软已经作了大量的宣传,然而他们所说的升级原因大都是基于功能的。事实上升级很少是因为功能,更多的是业务的需要。

  • DBA应用技巧:如何升级InnoDB Plugin

    得益于MySQL的插件式存储引擎体系结构,InnoDB Plugin的升级变得非常简单,只需关闭MySQL,替换与平台有关的可执行文件,然后重启服务器即可。

  • Greenplum数据库引擎探究

    Greenplum做为新一代的数据库引擎,有着良好的发展与应用前景。强大的工作效率,低成本的硬件平台对数据仓库与商业智能建设有很大的吸引力。

  • MySQL自动测试框架介绍

    MySQL自动测试框架是一个以MySQL框架和内部引擎为测试对象的工具。主要执行脚本在发布路径的mysql-test目录下。