SQL实战新手入门:UNION(2)
UNION( )
当需要从多个不同的表中合并相似的数据时 UNION操作是非常有用的 在某些情况下 也许是为了获得更快的访问速度 或者为了将表更容易地分布在不同的硬件上 数据库的设计者可能会将单个逻辑数据表设计为多个在物理上完全分开的表 在这种情况下 UNION操作就可以从多个表中获取数据 并将其合并到一个数据集中
尽管LIBRARY数据库中没有重复的数据 但UNION操作将执行消除列表中重复记录的处理 如果有一个以上的作者具有相同的姓氏 那么UNION列表中仅会包含一个这样的姓氏 如果想在结果集中包含所有的记录 则必须使用UNION ALL操作符
首先添加另外一个作者记录 John M Bryson Strategic 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
books bk_title AS title
FROM books
UNION ALL
SELECT
authors au_last_name
FROM authors;
当运行UNION ALL查询时 查询结果将会产生较大的差别 结果列表中不仅仅包含了两个名为Bryson的作者 而且还失去了原来的排序 UNION合并的每一个子集都按照从每一个查询中返回的原始顺序进行排序(请注意位于数据集末尾的Bryson) 第二个查询的结果只是简单地追加到第一个查询的结果之后 如表 所示
表 UNION ALL查询的结果
(续表)
实际上 在某些情况下数据是不同的 然而它们在某个方面具有相似性 例如一个机构中的成员就具有很多不同的角色 对于学校来说 其中的人员包括教师 学生 管理员或校长 对于工厂来说 有工人 经理 后勤人员和销售人员 可以想象 这些角色在数据库中分别属于自己的表 但是可以使用UNION操作来合并这些表中的角色 只查询人员的姓氏和名字 每一个人员都必定具有这两个字段 从而创建一个总的 人员 列表
JOIN操作通过将多个表连接起来 从而向结果集中添加更多有关的详细信息 UNION对截然不同的表执行操作 删除无关的字段 并将列表缩减为最常用的几个列
在一个查询中可以使用多少个UNION操作是有实际限制的 实践表明可以运行上千个UNION操作 实际可以使用的UNION数量取决于硬件条件(CPU RAM)和具体的RDBMS实现
返回目录 SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
lishixinzhi/Article/program/SQL/201311/16465