本文主要介绍了MySQL中UNION和UNION ALL的基本使用方法。通过示例代码非常详细,对大家学习或使用MySQL有一定的参考价值。有需要的话一起学吧。
在数据库中,UNION和UNION ALL关键字都是将两个结果合二为一,但在使用和效率上是不同的。
MySQL中的UNION
UNION会在表链接后过滤掉重复的记录,所以它会在表链接后对结果集进行排序,删除重复的记录,然后返回结果。在大多数实际应用中,没有重复记录,最常见的是进程表和历史表的并集。比如:
select * from GC _ dfys union select * from ls _ jg _ dfys
运行时,这个SQL取出两个表的结果,然后用排序空间进行排序,删除重复记录,最后返回结果集。如果表的数据量很大,可能会导致按磁盘排序。
MySQL中的UNION ALL
UNION ALL只是将两个结果组合起来并返回它们。这样,如果两个返回的结果集包含重复数据,则返回的结果集将包含重复数据。
就效率而言,UNION ALL比UNION快得多,因此如果您可以确认两个合并的结果集不包含重复的数据,则使用UNION ALL,如下所示:
select * from GC _ dfys union all select * from ls _ jg _ dfys
使用Union,所有返回的行都是唯一的,就像对整个结果集使用DISTINCT一样。如果多个表的查询结果中有完全一致的数据,mysql会自动复制。
使用Union all,所有行都不会重复,所有行都将被返回。
如果要使用ORDER BY或LIMIT子句对所有联合结果进行分类或限制;您应该将单个SELECT语句括起来,并将ORDER BY或limit放在最后一个语句之后:
(从tbl_name中选择a,其中a=10,B=1)
联盟
(从tbl_name中选择a,其中a=11,B=2)
按极限10排序;
麻烦也可以这样做:
从以下位置选择用户id(
从testa union all中选择userid
order by userid限制0,1。
在条款中。Order by只有在与limit一起使用时才有意义。如果不一起用,解析器优化的时候会去掉。
如果仍然要分组,并且有条件,那么:
select userid from(select userid from testa union all select userid from testb)t group by userid count(userid)=2;
注意:union的括号后面必须有一个单独的名称,否则将会报告错误。
当然,如果有几个union表的数据量很大,建议先导出文本,然后用脚本执行。
因为纯粹用sql会效率很低,而且会写临时文件。如果您的磁盘空间不够大,您可能会出错。
写入文件“/tmp/MYLsivgK”时出错(错误代码:28)
示例:
如果存在,则删除表` ta `;
创建表` ta `(
` id varchar(255)默认为NULL,
` num int(11)默认为空
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -
-助教的记录
- -
插入 ta 值( a , 5 );
插入 ta 值( b , 10 );
插入 ta 值( c , 15 );
插入 ta 值( d , 10 );
- -
-" TB "的表格结构
- -
如果存在“tb ”,则删除表;
创建表“tb ”(
` id varchar(255)默认为NULL,
` num int(11)默认为空
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
- -
结核病的记录
- -
插入“tb”值(“b”、“5”);
插入“tb”值(“c”,“15”);
插入到“tb”值中(“d”,“20”);
插入到“tb”值中(“e”、“99”);
此时,对应于ta tb的c字段的num是相同的。
sql:
SELECT id,SUM(num) FROM(
SELECT * FROM ta
联合所有
SELECT * FROM tb)作为tmp
按id分组
运行结果:
如果:
SELECT id,SUM(num) FROM(
SELECT * FROM ta
联盟
SELECT * FROM tb)作为tmp
按id分组
运行结果:
使用Union,所有返回的行都是唯一的,就像对整个结果集使用DISTINCT一样。如果多个表的查询结果中有完全一致的数据,mysql会自动复制。
使用Union all,所有行都不会重复,所有行都将被返回。
总结
这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。谢谢你的支持。