MySQL合并查询结果(二十一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL合并查询结果(二十一)

一. 合并查询结果


多条sql 查询语句的合并处理,有两种不同的形式,


第一种是子查询, 一些sql查询语句的输出是另一条sql查询语句的输入,


第二种是 合并查询结果, 将多条查询结果结构相同的数据进行合并运算。


  • 第一次查询出来的是一个二维表,第二次查询出来的也是一个二维表, 那么就可以将这两次的查询结果进行合并,

     合并包括取并集, 取交集, 取差集。


但是 MySQL数据库只支持 并集(union 和union all),不支持交集(intersect) 和差集(minus)。


要想对前后不同的查询语句的结果进行合并,必须要保证 前后的查询结果的结构是一样的。(查询的列名总数一致,与列名结构的排列顺序无关,与查询出来的结果行数量无关)


查询语句1:


语句1: select * from user ;


语句 2: select id,name from user;


猜想1:

语句1 会将user 表中的所有的列都查询出来,包括id,name,sex,birthday,age,description ,


语句2 只会查询出 id,name 的两行列


列的总数是不一致的,结构不同,所以这两次的查询结果是不能合并的。


查询语句2:


语句 3: select * from user;


语句 4: select * from user where id=1;


猜想2:


语句 3会查询出所有的列, 多条记录


语句4 会查询出所有的列, 一条记录


列的总数一致,排列顺序也一致,所以结构是相同的,可以进行合并。


查询语句3:


语句 5: select id,name,age from user;


语句 6: select id,name,age from user where id=1;


猜想3:


语句 5只会查询出 id 和name,age 三个列, 多条记录


语句 6 会查询出id,name 三个列,但只有一条记录


列的总数一致,都是三列,顺序也一致,结构相同,所以是可以合并的。


查询语句4:


语句 7: select id,name,age from user;


语句 8: select name,id,age from user where id=1;


猜想4:


语句 7 只会查询出 id,name,age 三个列,多条记录,类型依次是 int,varchar,int


语句 8 只会查询出 name,id,age 三个列,单条记录, 类型依次是 varchar,int,int


列的总数一致,都是三列,虽然前后的类型不一致,但依然是可以合并的。


二. 并集 union 和 union all (重要)


union 和 union all 是求并集的, 将前后的查询结果进行合并。

其中,union 是先去重,后合并,不保留重复的数据, union all 是直接合并,会保留重复的数据。 两者是有一些区别的。


如 查询 id>=3 和 id<=4 的数据。


查询 id>=3的结果:


select * from user where id>=3;


20200331181548433.png


查询 id<=4的结果:


select * from user where id<=4;


2020033118155687.png


两次查询结果中, 有相同的数据, 那就是 id=3和 id=4的数据。


二.一 union 先去重,后合并


select * from user where id>=3
  union
  select * from user where id<=4;


20200331181602809.png


查询顺序 是先展示 id>=3 的数据,再展示 id<=4 的顺序, 如果 有重复的,则先去重。


union 最后查询出来的结果,没有重复的数据。


二.二 union all 直接合并


select * from user where id>=3
  union all 
  select * from user where id<=4;


20200331181610344.png


union all 并不会去掉重复的数据, 而是直接拼接后展示。


问题1: 如果前后查询列不一致,会报什么错误呢?


select id,name,age from user where id>=3
  union
  select * from user where id<=4;


20200331181616954.png


ERROR 1222 (21000): The used SELECT statements have a different number of columns


问题2: 前后类型不一致,能合并吗?


select id,name,age from user where id>=3
  union
  select name,id,age from user where id<=4;


2020033118162557.png


可以进行合并,只是 合并后的数据有些问题。


三 交集


查询交集,可以利用子查询和连接查询进行处理。 from 语句的子查询和 内连接


如 还是查询 id>=3 和 id<=4 的数据, 它们的交集是 id=3 和id =4


交集,一定是 a 里面有的。


select t1.* from (
  select * from user where id>=3
  ) t1
  inner join (select * from user where id<=4) t2
  on t1.id=t2.id and t1.name=t2.name ;


20200331181631785.png


其中 on 条件,是唯一标识, 这里用 id 和 name 两个标识, 实际开发中,只用一个 id 即可。


四 差集


查询差集, 也可以利用子查询和连接查询进行处理。 from 语句的子查询 和左外连接


查询 id>=3 和 id<=4 的数据,


如果是 id>=3 减去 id<=4 的, 那么查询出来的数据 就应该是 id>=5 的数据了。


查询出来的数据,一定在 id>=3 里面。


select t1.* from (
  select * from user where id>=3
  ) t1
  left join (select * from user where id<=4) t2
  on t1.id=t2.id and t1.name=t2.name
  where t2.id is null;


20200331181638958.png


如果 是 id<=4 减去 id>=3 , 那么查询出来的数据就应该是 id<=2 的数据了。


查询出来的数据,一定在 id<=4 里面。 这个时候,就应该用右连接了。


select t2.* from (
  select * from user where id>=3
  ) t1
  right join (select * from user where id<=4) t2
  on t1.id=t2.id and t1.name=t2.name
  where t1.id is null;


20200331181646311.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
1月前
|
SQL 缓存 监控
MySQL缓存机制:查询缓存与缓冲池优化
MySQL缓存机制是提升数据库性能的关键。本文深入解析了MySQL的缓存体系,包括已弃用的查询缓存和核心的InnoDB缓冲池,帮助理解缓存优化原理。通过合理配置,可显著提升数据库性能,甚至达到10倍以上的效果。
|
1月前
|
SQL 存储 关系型数据库
MySQL体系结构详解:一条SQL查询的旅程
本文深入解析MySQL内部架构,从SQL查询的执行流程到性能优化技巧,涵盖连接建立、查询处理、执行阶段及存储引擎工作机制,帮助开发者理解MySQL运行原理并提升数据库性能。
|
3月前
|
SQL 人工智能 关系型数据库
如何实现MySQL百万级数据的查询?
本文探讨了在MySQL中对百万级数据进行排序分页查询的优化策略。面对五百万条数据,传统的浅分页和深分页查询效率较低,尤其深分页因偏移量大导致性能显著下降。通过为排序字段添加索引、使用联合索引、手动回表等方法,有效提升了查询速度。最终建议根据业务需求选择合适方案:浅分页可加单列索引,深分页推荐联合索引或子查询优化,同时结合前端传递最后一条数据ID的方式实现高效翻页。
193 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
159 14
|
1月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
77 15
|
1月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL入门指南:从安装到第一个查询
本文为MySQL数据库入门指南,内容涵盖从安装配置到基础操作与SQL语法的详细教程。文章首先介绍在Windows、macOS和Linux系统中安装MySQL的步骤,并指导进行初始配置和安全设置。随后讲解数据库和表的创建与管理,包括表结构设计、字段定义和约束设置。接着系统介绍SQL语句的基本操作,如插入、查询、更新和删除数据。此外,文章还涉及高级查询技巧,包括多表连接、聚合函数和子查询的应用。通过实战案例,帮助读者掌握复杂查询与数据修改。最后附有常见问题解答和实用技巧,如数据导入导出和常用函数使用。适合初学者快速入门MySQL数据库,助力数据库技能提升。
|
2月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
255 9
|
1月前
|
SQL 监控 关系型数据库
MySQL高级查询技巧:子查询、联接与集合操作
本文深入解析了MySQL高级查询的核心技术,包括子查询、联接和集合操作,通过实际业务场景展示了其语法、性能差异和适用场景,并提供大量可复用的代码示例,助你从SQL新手进阶为数据操作高手。
|
11月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
582 66

推荐镜像

更多