UNION操作符可以组合2个或更多的查询到一个语句,以产生包含所有值的结果集。例如,下面的语句从Employees1和Employees2表查询数据: SELECT BusinessEntityID, FirstName, LastName FROM Employees1 UNION SELECT BusinessEntityID, FirstName, ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
SELECT BusinessEntityID, FirstName, LastName FROM Employees1 UNION SELECT BusinessEntityID, FirstName, LastName FROM Employees2; |
注意UNION操作符连结单个查询。每一个查询包含相同数量的字段,并且这些字段的顺序是相同的。此外,对应字段的数据类型是兼容的。(注意如果第二个查询的字段名与第一个查询的字段名不同,那么第一个查询的字段名会被使用。)上面例子的执行结果如下:
BusinessEntityID | FirstName | LastName |
---------------- | --------- | ----------------- |
1 | Ken | Sánchez |
2 | Terri | Duffy |
3 | Roberto | Tamburello |
4 | Rob | Walters |
5 | Gail | Erickson |
6 | Jossef | Goldberg |
我们可以看到,来自两个表的值都包含在结果中。然而,你可能会发现只有一行记录是对应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 |
---------------- | --------- | ----------------- |
1 | Ken | Sánchez |
2 | Terri | Duffy |
3 | Roberto | Tamburello |
4 | Rob | Walters |
3 | Roberto | Tamburello |
4 | Rob | Walters |
5 | Gail | Erickson |
6 | Jossef | Goldberg |
我们可以看到,现在对应于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 |
---------------- | --------- | ----------------- |
1 | Ken | Sánchez |
2 | Terri | Duffy |
3 | Roberto | Tamburello |
3 | Roberto | Tamburello |
4 | Rob | Walters |
4 | Rob | Walters |
5 | Gail | Erickson |
6 | Jossef | Goldberg |
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 |
---------------- | --------- | ----------------- |
1 | Ken | Sánchez |
2 | Terri | Duffy |
3 | Roberto | Tamburello |
4 | Rob | Walters |
5 | Gail | Erickson |
6 | Jossef | Goldberg |
7 | Dylan | Miller |
8 | Diane | Margheim |
我们可以使用括号来重载默认行为。括号内的查询会首先处理,使我们能更好地控制结果集。在下面的例子中,我将第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 |
---------------- | --------- | ----------------- |
1 | Ken | Sánchez |
2 | Terri | Duffy |
3 | Roberto | Tamburello |
3 | Roberto | Tamburello |
4 | Rob | Walters |
4 | Rob | Walters |
5 | Gail | Erickson |
6 | Jossef | Goldberg |
7 | Dylan | Miller |
8 | Diane | Margheim |
我们可以看到,现在对应于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目录下。