博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)MySQL中UNION和UNION ALL的使用
阅读量:5154 次
发布时间:2019-06-13

本文共 2235 字,大约阅读时间需要 7 分钟。

(转载)

在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同。

(1)MySQL中的UNION

UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

select * from gc_dfys union select * from ls_jg_dfys

这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 

mysql> select * from student;+------+-------+| id   | name  |+------+-------+|   23 | Mike  ||   25 | Rose  ||   12 | lili  ||   14 | Jason ||   29 | Ann   ||   21 | Jack  |+------+-------+6 rows in set (0.00 sec)mysql> select * from student where id > 20    -> union    -> select * from student where name='Jack';+------+------+| id   | name |+------+------+|   23 | Mike ||   25 | Rose ||   29 | Ann  ||   21 | Jack |+------+------+4 rows in set (0.00 sec)

 

(2)MySQL中的UNION ALL

而UNION ALL只是简单的将两个结果合并后就返回。这样,如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。

从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL,如下:

select * from gc_dfys union all select * from ls_jg_dfys

 

使用Union,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT

使用Union all,则不会排重,返回所有的行

mysql> select * from student;+------+-------+| id   | name  |+------+-------+|   23 | Mike  ||   25 | Rose  ||   12 | lili  ||   14 | Jason ||   29 | Ann   ||   21 | Jack  |+------+-------+6 rows in set (0.00 sec)mysql> select * from student where id > 20    -> union all    -> select * from student where name='Jack';+------+------+| id   | name |+------+------+|   23 | Mike ||   25 | Rose ||   29 | Ann  ||   21 | Jack ||   21 | Jack |+------+------+5 rows in set (0.00 sec)

 

如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面:

(SELECT a FROM tbl_name WHERE a=10 AND B=1)  
UNION
(SELECT a FROM tbl_name WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;
麻烦一点也可以这么干:
select userid from (
select userid from testa union all select userid from testb) t
order by userid limit 0,1;
如果你还想group by,而且还有条件,那么:
select userid from (select userid from testa union all select userid from testb) t group by userid having count(userid) = 2;
注意:在union的括号后面必须有个别名,否则会报错
当然了,如果当union的几个表的数据量很大时,建议还是采用先导出文本,然后用脚本来执行
因为纯粹用sql,效率会比较低,而且它会写临时文件,如果你的磁盘空间不够大,就有可能会出错
Error writing file '/tmp/MYLsivgK' (Errcode: 28)

转载于:https://www.cnblogs.com/Robotke1/archive/2013/05/08/3066966.html

你可能感兴趣的文章
python 数组操作
查看>>
ASP.NET MVC全局異常捕獲過濾器
查看>>
leetcode26 - Remove Duplicates from Sorted Array - easy
查看>>
Codeforces Round#429(Div.2)
查看>>
Abiword中字符操作
查看>>
Abiword页面布局
查看>>
音频压缩SPEEX应用,对讲机
查看>>
KEIL MDK 查看代码量、RAM使用情况--RO-data、RW-data、ZI-data的解释(转)
查看>>
oracle SUM函数
查看>>
一、表单和ajax中的post请求&&后台获取数据方法
查看>>
More Effective C++ (虚拟构造函数)
查看>>
for和getElementByTagName配合
查看>>
洛谷p1091合唱队形题解
查看>>
逆序对
查看>>
textview文字横向滚动
查看>>
Ubuntu16.04搭建web服务器运行WordPress
查看>>
获取最外层View
查看>>
Meltdown Attack
查看>>
IntelliJ IDEA(Android Studio)设置代码的快捷编辑模板Live Templates
查看>>
idea常用的快捷键(黑马培训班)
查看>>