博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL DML操作--------合并查询结果实战
阅读量:5904 次
发布时间:2019-06-19

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

1. 背景

   * 全并查询结果是将多个 select 语句的查询结果合并到一起。

   * 参与合并的结果集需要字段统一。

   * 字段可以用空字符串''代替。

2. 合并查询结果实战 [ users1 and users2 ]

   * 查看 users1 表和 users2 表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> 
desc 
users1;
+
-------+---------------+------+-----+---------+----------------+
| Field | Type          | 
Null 
Key 
Default 
| Extra          |
+
-------+---------------+------+-----+---------+----------------+
| id    | 
bigint
(20)    | 
NO   
| PRI | 
NULL    
| auto_increment |
name  
varchar
(64)   | 
NO   
|     | 
NULL    
|                |
| sex   | enum(
'M'
,
'F'
) | 
NO   
|     | 
NULL    
|                |
| age   | 
int
(11)       | 
NO   
|     | 
NULL    
|                |
+
-------+---------------+------+-----+---------+----------------+
rows 
in 
set 
(0.00 sec)
 
mysql> 
desc 
users2;
+
-------+---------------+------+-----+---------+----------------+
| Field | Type          | 
Null 
Key 
Default 
| Extra          |
+
-------+---------------+------+-----+---------+----------------+
| id    | 
bigint
(20)    | 
NO   
| PRI | 
NULL    
| auto_increment |
name  
varchar
(64)   | 
NO   
|     | 
NULL    
|                |
| sex   | enum(
'M'
,
'F'
) | 
NO   
|     | 
NULL    
|                |
| age   | 
int
(11)       | 
NO   
|     | 
NULL    
|                |
+
-------+---------------+------+-----+---------+----------------+
rows 
in 
set 
(0.01 sec)

   * 查看 users1 表和 users2 表数据

    users1和users2表中有相同字段 tom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> 
select 
from 
users1;
+
----+------+-----+-----+
| id | 
name 
| sex | age |
+
----+------+-----+-----+
|  1 | tom  | M   |  25 |
|  2 | jak  | F   |  42 |
+
----+------+-----+-----+
rows 
in 
set 
(0.00 sec)
 
mysql> 
select 
from 
users2;
+
----+-------+-----+-----+
| id | 
name  
| sex | age |
+
----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | lisea | M   |  42 |
+
----+-------+-----+-----+
rows 
in 
set 
(0.00 sec)

   * union 合并并去重

1
2
3
4
5
6
7
8
9
mysql> (
select 
from 
users1) 
union 
(
select 
from 
users2);
+
----+-------+-----+-----+
| id | 
name  
| sex | age |
+
----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | jak   | F   |  42 |
|  2 | lisea | M   |  42 |
+
----+-------+-----+-----+
rows 
in 
set 
(0.00 sec)

   * union all 只全并不去重

1
2
3
4
5
6
7
8
9
10
mysql> (
select 
from 
users1) 
union 
all 
(
select 
from 
users2);
+
----+-------+-----+-----+
| id | 
name  
| sex | age |
+
----+-------+-----+-----+
|  1 | tom   | M   |  25 |
|  2 | jak   | F   |  42 |
|  1 | tom   | M   |  25 |
|  2 | lisea | M   |  42 |
+
----+-------+-----+-----+
rows 
in 
set 
(0.01 sec)

   * 查看union  性能分析

      [ 使用了临时表 ]

mysql> explain (select * from users1) union (select * from users2);+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+| id | select_type  | table      | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra           |+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+|  1 | PRIMARY      | users1     | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL            ||  2 | UNION        | users2     | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL            || NULL | UNION RESULT | 
 | NULL       | ALL  | NULL        | NULL | NULL    | NULL | NULL |     NULL | Using temporary |+----+--------------+------------+------------+------+---------------+------+---------+------+------+----------+-----------------+3 rows in set, 1 warning (0.01 sec)

   * 查看union all 性能分析

     [ 未使用临时表 ]

mysql> explain (select * from users1) union all (select * from users2);+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+|  1 | PRIMARY     | users1 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL  ||  2 | UNION       | users2 | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    2 |   100.00 | NULL  |+----+-------------+--------+------------+------+---------------+------+---------+------+------+----------+-------+2 rows in set, 1 warning (0.01 sec)

3. union 与 union all 总结

   * union 相对于 union all多了一步去重操作,此操作会创建临时表,降低性能。

   * 当两边结果集数据相对都确定了唯一性,推荐使用union all。

4. 总结

以需求驱动技术,技术本身没有优略之分,只有业务之分。

      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1943768,如需转载请自行联系原作者

你可能感兴趣的文章
Qtum量子链x2018区块链新经济论坛:区块链基础设施建设发展方向
查看>>
Java反射与hook混用反射某支付的方法
查看>>
Android 安卓手机及平板虚拟键盘遮住底部导航栏问题
查看>>
前端性能优化 - Resource Hints 资源预加载
查看>>
QPM 准备优化前的思考
查看>>
JavaScript-console的使用_016
查看>>
两种方式设置iframe的高度区别
查看>>
应用后台省电秘籍——低功耗状态下应用如何正常运行?
查看>>
Iterator 和 for...of 循环
查看>>
PAT A1086
查看>>
浅析微信支付:开发前的准备
查看>>
我理解的数据结构(七)—— 堆和优先队列(Heap And PriorityQueue)
查看>>
Category 特性在 iOS 组件化中的应用与管控
查看>>
python模块之shutil
查看>>
浮动的label
查看>>
前端工程化
查看>>
微信公众号开发中的支付流程
查看>>
PowerShell 学习笔记 - 1 PS Core 基础
查看>>
NodeJS+Express搭建个人博客-环境搭建(一)
查看>>
关于iOS 11.x微信连wifi流程中,在Portal页无法拉起微信问题的简单记录
查看>>