mysql dml影响查询_MySQL DML操作--------合并查询结果实战

1. 背景

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

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

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

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

* 查看 users1 表和 users2 表结构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    |                |

+-------+---------------+------+-----+---------+----------------+

4 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    |                |

+-------+---------------+------+-----+---------+----------------+

4 rows in set (0.01 sec)

* 查看 users1 表和 users2 表数据

users1和users2表中有相同字段 tommysql> select * from users1;

+----+------+-----+-----+

| id | name | sex | age |

+----+------+-----+-----+

|  1 | tom  | M   |  25 |

|  2 | jak  | F   |  42 |

+----+------+-----+-----+

2 rows in set (0.00 sec)

mysql> select * from users2;

+----+-------+-----+-----+

| id | name  | sex | age |

+----+-------+-----+-----+

|  1 | tom   | M   |  25 |

|  2 | lisea | M   |  42 |

+----+-------+-----+-----+

2 rows in set (0.00 sec)

* union 合并并去重

830f7eb32f0966cfd3796de8aa80a041.pngmysql> (select * from users1) union (select * from users2);

+----+-------+-----+-----+

| id | name  | sex | age |

+----+-------+-----+-----+

|  1 | tom   | M   |  25 |

|  2 | jak   | F   |  42 |

|  2 | lisea | M   |  42 |

+----+-------+-----+-----+

3 rows in set (0.00 sec)

* union all 只全并不去重

2267a773d4b30944555b77eb8bacc147.pngmysql> (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 |

+----+-------+-----+-----+

4 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. 总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值