UNION()
当需要从多个不同的表中合并相似的数据时UNION操作是非常有用的在某些情况下也许是为了获得更快的访问速度或者为了将表更容易地分布在不同的硬件上数据库的设计者可能会将单个逻辑数据表设计为多个在物理上完全分开的表在这种情况下UNION操作就可以从多个表中获取数据并将其合并到一个数据集中
尽管LIBRARY数据库中没有重复的数据但UNION操作将执行消除列表中重复记录的处理如果有一个以上的作者具有相同的姓氏那么UNION列表中仅会包含一个这样的姓氏如果想在结果集中包含所有的记录则必须使用UNION ALL操作符
首先添加另外一个作者记录John M BrysonStrategic Planning for Public and NonprofitOrganizations: A Guide to Strengthening and Sustaining Organizational Achievement一书的作者(与数据库中已经存在的Bill Bryson并无关系)为了将这条多余的记录添加到BOOKS表中将使用所要求的最少数据来插入该记录AU_ID和AU_LAST_NAME:
INSERT INTO authors (au_id au_last_name)
VALUES ( Bryson)
在这一小节开头曾经介绍过一个UNION查询从该查询的结果中可以看到结果列表中只出现了一个Bryson现在可以运行一个与之非常类似的新查询
SELECT
booksbk_title AS title
FROM books
UNION ALL
SELECT
authorsau_last_name
FROM authors;
当运行UNION ALL查询时查询结果将会产生较大的差别结果列表中不仅仅包含了两个名为Bryson的作者而且还失去了原来的排序UNION合并的每一个子集都按照从每一个查询中返回的原始顺序进行排序(请注意位于数据集末尾的Bryson)第二个查询的结果只是简单地追加到第一个查询的结果之后如表所示
表 UNION ALL查询的结果
(续表)
实际上在某些情况下数据是不同的然而它们在某个方面具有相似性例如一个机构中的成员就具有很多不同的角色对于学校来说其中的人员包括教师学生管理员或校长对于工厂来说有工人经理后勤人员和销售人员可以想象这些角色在数据库中分别属于自己的表但是可以使用UNION操作来合并这些表中的角色只查询人员的姓氏和名字每一个人员都必定具有这两个字段 从而创建一个总的人员列表
JOIN操作通过将多个表连接起来从而向结果集中添加更多有关的详细信息UNION对截然不同的表执行操作删除无关的字段并将列表缩减为最常用的几个列
在一个查询中可以使用多少个UNION操作是有实际限制的实践表明可以运行上千个UNION操作实际可以使用的UNION数量取决于硬件条件(CPURAM)和具体的RDBMS实现
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程