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可以的。
UNION *** 作符用于合并两个或多个 SELECT 语句的结果集。需要注意的是:
1、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
2、这个命令连接的结果集中有重复的值不会被显示。想忽略重复值,可以使用 union all。结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;sql 语句就是对数据库进行 *** 作的一种语言。
你描述的意思是一次插入多行数据,根本与union没关系
这样做就可以了:
insert into 表名(列名,列名,列名) values (值1, 值1, 值1), (值2, 值2, 值2)(值n, 值n, 值n)union 是两个select语句 的连接符,用于拼接两个查询结果。必须保证:1查询语句的结果列数一致,别名或者列名一致。
2结果列数的结果类型类型一致或者能隐式转换。
0 排序可以在结果集之中多加一列,如某个select使用 "1",另一个使用"2",并且取好别名,在最后用order by 排序。可以的。
UNION *** 作符用于合并两个或多个 SELECT 语句的结果集。需要注意的是
1、UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
2、这个命令连接的结果集中有重复的值不会被显示。想忽略重复值,可以使用 union all。
如果是想取出江厦呼叫中心的父和所有层的子,那就如下
with t1 as (select from authority_relationship where id='江厦呼叫中心'
union all
select s from authority_relationship s join t1 on slower=t1id
),
t2 as (
select from authority_relationship where id='江厦呼叫中心'
union all
select s from authority_relationship s join t2 on shigher=t2id
)
select from t1
union
select from t2分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
就是第二张表中的数据显示在第一张表的中,可是列名是第一张表的列名,但是第二张表的数据在其中,就不符合了,请问该如何解决
解析:
UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNION 跟 JOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
UNION 的语法如下:
[SQL 语句 1]
UNION
[SQL 语句 2]
假设我们有以下的两个表格,
Store_Information 表格
store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Inter Sales 表格
Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Inter_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)