工具/原料
SQL SERVER 2014 电脑
方法/步骤
1、首先来准备两个select查询,分别查询一个表。
2、用Union将这两个查询连接在一起并且运行SQL语句,出现下图的错误提示,因为Union连接的两个查询,列的数目必须一样。
3、进行修改,让其列的数目一样,还是报错,因为第二个查询中OrderTime是日期类型,而与其对应的第一个查询相应列是字符类型,类型不匹配导致。
4、通过Convert转化一下类型即可。
5、将第一个表和第二个表用Union合并,在将第二个表在和第一个表在Union合并一遍,发现最后一个表没合并进来。若让第三个表也合并进来需要运用Union All。
6、若项调整合并的表的顺序,用空字符串作为第一个列就可以让第二个表的顺序排到最前面。
7、若I想把合并的表放到一个新表里,则需要在第一个表的后面加Into语句。
UNION在mysql中被称为集合 *** 作, *** 作类型分为两种:UNION DISTINCT 和 UNION ALL;注意:UNION和UNION DISTINCT是一样的功能。UNION功能为合并多个查询的结果并去重,UNION ALL的功能为合并多个查询的结果不去重。
集合 *** 作时,两边的输入必须拥有相同的列数,如果数据类型不同的话,mysql会自动进行隐式转化 ;同时,结果列的名称由第一个查询的列的名称决定。下面看一下例子:
sql语句为:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL结果是:
如果是:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha',4 FROM DUAL
如果两次查询的列个数不一致,如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha' FROM DUAL
在多个列查询时,只要有一个列的数据不一致时,都是无法去重的;也就是去重是每个列的数据完全一致,比如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION DISTINCT SELECT 'abc' as a,'haha',5 FROM DUAL
这几个例子可以看出UNION (DISTINCT) 与 UNION ALL的用法了吧,下面讲一下UNION (DISTINCT)的实现方式:
一:创建一张虚拟表;
二:对这张虚拟表的列添加唯一索引,即UNIQUE INDEX
三:将结果插入虚拟表
四:返回虚拟表
如何判断是否创建一个虚拟表,我们可以通过一下语句判断:
SHOW STATUS LIKE 'Created_tmp_tables'
SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL
SHOW STATUS LIKE 'Created_tmp_tables' 结果是:
可见结果3比结果1多1,在 *** 作第二个 UNION语句时创建了一个虚拟表;如果UNION创建了索引,插入会相对变慢
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)