UNION指令的目的是将两个SQL语句的结果合并起来。从这个角度来看, 我们会产生这样的感觉,UNION跟JOIN似乎有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。 union只是将两个结果联结起来一起显示,并不是联结两个表
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
Internet 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 Internet_Sales 结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 "SELECT DISTINCT Date" 的话,那我们会得到完全一样的结果。
SQL Union All
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALL 和 UNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。 UNION ALL 的语法如下: [SQL 语句 1]
UNION ALL
[SQL 语句 2] 我们用和上一页同样的例子来显示出 UNION ALL 和 UNION 的不同。同样假设我们有以下两个表格:
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
Internet Sales 表格 Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的SQL语句:
SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales 结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
============
表1
A B
a 1
b 0
c 3
d 0
e 2
表2
A B
c 0
e 4
合并两个表除去重复的数据(以表2的数据为主),我们将会得到以下的表:
A B
a 1
b 0
c 0
d 0
e 4
select A,B from 表1 where A not in(select A from 表2)
union
select A,B from 表2
sql union用法和sql union all用法,sql union效率
1、sql union用法
sql union在查询中可以将两个SQL 语句的结果合并起来。如果这样看的话, UNION 跟 JOIN 是相似的,两个指令都可以由多个表格中撷取资料。
sql union的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。
sql union只是将两个结果联结起来一起显示,并不是联结两个表,sql用法如下:
两个表格, StoreData_200903 表格 StoreData_200904,这两张表格的数据结构是完全一样的,只是存放了不同月份的数据库(注意:这样做是为了能够分表,而且可以按月存档数据),现在需要联合查询,就是从两个表中查询出数据,SQL 语句:
SELECT top 50 FROM StoreData_200903
UNION
SELECT top 50 FROM StoreData_200904
2、sql union all用法
sql union all这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 sql union all和 sql union不同之处在于 sql union all会将每一次符合条件的数据列出来,无论数据库有无重复。
用法也很简单:
SELECT top 50 FROM StoreData_200903
UNION ALL
SELECT top 50 FROM StoreData_200904
值得注意的是,sql union all的执行效率要比sql union效率要高很多,这是因为,使用sql union需要进行排重,而sql union All 是不需要排重的,这一点非常重要,因为对于一些单纯地使用分表来提高效率的查询,完全可以使用sql union All。
还有,如果使用了union,无论是sql union还是sql union all一定要记住对数据库表加上索引!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在数据库中,union和union all 关键字都是将两个结果集合合并为一个,但这两者从使用和效率上来说都有所不同。
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:
select * from gc_dfys
union
select * from ls_jg_dfys
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:
select * from gc_dfys
union all
select * from ls_jg_dfys