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表中有相同字段 tom

mysql> 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 合并并去重

mysql> (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 只全并不去重

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 |+----+-------+-----+-----+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 | <union1,2> | 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. 总结

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

?

时间: 2024-10-21 04:49:33

MySQL DML操作--------合并查询结果实战的相关文章

mysql——多表——合并查询结果

合并查询结果 合并查询结果 是将多个select语句的查询结果合并到一起 union关键字,数据库会将所有的查询结果合并到一起,然后除掉相同的记录: union all关键字,只是简单的合并到一起 前期表准备: create table employee ( num int(50), d_id int(50), name varchar(50), age int(50), sex varchar(50), homeadd varchar(50) ); insert into employee v

MySQL DML操作--------多表联合查询实战

1. 背景 * 多表联合查询是把不同表的记录到一起的一种方式 * 在SQL标准中规划的联合(join)大致分内连接,外连接,全连接.其中外连接又分左外连接,右外连接. 2. 内连接例子 (inner join) [ 员工 --> 部门 ] * 查看员工表[ employees ]和部门表[ departments ]结构 mysql> desc employees; +-----------+---------------+------+-----+---------+------------

MySQL DML操作--------CURD最佳实战

1. 背景 * CURD 操作通常是使用关系型数据库系统中的结构化查询语言(Structured Query Language,SQL)完成的 * CURD 定义了用于处理数据的基本原子操作 * CURD 代表创建(Create).更新(Update).读取(Retrieve)和删除(Delete)操作. 2. 创建表操作 * 创建数据库(DB)  mytest CHARACTER SET: 设置字符集 mysql> CREATE DATABASE mytest CHARACTER SET ut

MySQL DML操作--------实现pivot行转列功能最佳实战

1. 背景 * 由于MySQL 不支持类型Oracle与SQL Server的pivot功能进行行列转换. 2. 表与数据 mysql> select * from t_temp; +---------+-----------+------------+ | year    | season    | orderCount | +---------+-----------+------------+ | 2010年  | 一季度    |        100 | | 2010年  | 二季度 

mysql 数据操作 子查询 带比较运算符的子查询

带比较运算符的子查询 #比较运算符:=.!=.>.>=.<.<=.<> #查询大于所有人平均年龄的员工名与年龄 思路 先拿到所有人的平均年龄然后 再用另外一条sql语句 进行比较 拿所有员工的年龄 > 所有人的平均年龄 做比较 mysql> select name,age from employee where age >(select avg(age) from employee) ; +------+------+ | name | age | +

MySQL DDL操作--------外键最佳实战

1. 背景 * MySQL有两种常用的引擎类型MyISAM和InnoDB.目前只有InnoDB引擎类型支持外键约束. * 本表的列必须与外键类型相同, 外键必须是外表的主键 * 设置外建的列不能设置 NO NULL 字段属性. 2. 外建作用 * 使两张表形成关联,外键只能引用外表中的列的值 * 保持数据一致性,完整性,控制存储在外键表中的数据 3. 外键实验 [ 员工 --> 部门 ] * 创建外键依赖的外表 departments mysql> CREATE TABLE departmen

python编写mysql类实现mysql的操作

前言 我们都知道利用python实现mysql的操作是件很简单的事情,只需要熟练使用MySQLdb模块就能实现mysql的增删改查操作. 为了更好地整合mysql的操作,使用python的类讲mysql的操作整合到一起,是个不错的思路.这里我编写了一个简单的class,来实现对mysql的操作与查询. 操作       本例中,我们准备在mysql的iceny中创建了一张测试表t1,字段为id和timestamp,主要存储系统的时间戳,并在该表中进行增.删.改.查的操作: 当前mysql的状态:

MySQL/MariaDB DML操作之Select

前言 上文我们已经讲解了MySQL/MariaDB的基础知识和DDL相关操作,接下来我们来说一下MySQL/MariaDB的DML操作,因select查询较复杂也较重要,所以本文主要是对select查询的详解. DML操作 DML之select 投影查询 select col_name,[col_name1,...] from table_name; select * from table_name ;#显示全表 遍历整张数据表,但对系统资源消耗较大,再进行大数据量的查询时,禁止使用这类操作 条

[Sqoop]利用sqoop对mysql执行DML操作

业务背景 利用sqoop对mysql进行查询.添加.删除等操作. 业务实现 select操作: sqoop eval --connect jdbc:mysql://127.0.0.1:3306/market --username admin --password 123456 --query "select end_user_id, category_id, score, last_bought_date, days_left, update_time from market.PERIOD_RE