join 子查询 效率_MySQL查询在A表不在B表的记录
假设有A、B两张表。如果查询在A表中存在,但是在B表中不存在的记录,应该如何操作?
1 示例数据
假设A表数据:
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
B表数据:
+----+------+
| id | a_id |
+----+------+
| 1 | 3 |
+----+------+
其中,B表中的a_id是需要排除的A表的id。
这里我们要排除A表中id为3的记录,实际中可能有上万条记录。
2、子查询方法
一般我们首先想到的可能就是not in语句:
select A.* from A where A.id not in(select B.a_id from B);
这样可以查询出正确的结果。
但是如果B表很长,那么执行上述的查询语句,需要用A表中的字段去匹配B表中的每一个字段。
相当于是A表的每一个字段都要遍历一次B表,效率非常低下。
只要A中的字段不在B表中那么肯定要遍历完B表,如果A表中的字段在B表中,那么只要遍历到就退出,进行A表中下一个字段的匹配。
3 、使用join方法
连接查询使我们平时进行sql查询用到最多的操作之一了。
相对于not in,使用连接查询的效率更高。
以下我们分步骤解析用join方法的过程。
因为我们需要搜索的是A表中的内容,所以第一步,我们使用A表左连接B表,如下:
select * from A left join B on A.id = B.a_id;
这样B表中会补null,查询结果:
+----+------+------+
| id | id1 | a_id |
+----+------+------+
| 1 | NULL | NULL |
| 2 | NULL | NULL |
| 3 | 1 | 3 |
| 4 | NULL | NULL |
| 5 | NULL | NULL |
+----+------+------+
因为A、B两表中字段id相同,所以B表中的id字段变成了id1。
仔细观察可以发现,我们需要的结果集[1, 2, 4, 5]所对应的id1字段都是null。
这样,在查询语句中加入条件B.id is null,不就可以完成对只在A表中,但不在B表中的结果集的查询。
另外,我们只需要A表中的数据,B表的数据忽略。
于是最终变成:
select A.* from A left join B on A.id=B.a_id where B.id is null;
结果就是:
+----+
| id |
+----+
| 1 |
| 2 |
| 4 |
| 5 |
+----+
就是我们需要的结果,在A表中,但是不在B表中的记录。
这样做还有一个好处,如果A、B表的id、和B表的a_id都加了索引,那么join方式就能够命中索引。
而如果是子查询,在MySQL5.6之前的版本,就不会用到A表的索引,查询效率大大减慢。
参考资料:https://panxu.net/article/8330.html
本文仅代表作者个人观点,不代表潘旭博客发声,对观点有疑义请先联系作者本人进行修改,若内容非法请联系网站管理员。
join 子查询 效率_MySQL查询在A表不在B表的记录相关推荐
- mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询
1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...
- mysql多表查询语句_mysql查询语句 和 多表关联查询 以及 子查询
1.查询一张表:select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select字段1,字段2,字段3 frome ...
- 怎么提高mysql多表查询效率_MySQL创建index提高多表查询效率
本文的目的在于探讨use index for join语句的基本原理.我们知道,在MySQL使用JION语句关联多表查询时,为表创建Index能够大幅度提高查询效率.下面以一个简单的例子来了解其中的原 ...
- mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询
最近有个需求,要修改现有存储结构,涉及查询条件和查询效率的考量,看了几篇索引和HBase相关的文章,回忆了相关知识,结合项目需求,说说自己的理解和总结. 总体目录如下,上篇介绍了前3小节,分析了索引为 ...
- 查询排序_MySQL查询性能优化
MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下我们从数据库的索引和查询 ...
- mysql 主键查询性能_MySQL查询性能优化(精)
MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...
- mysql复杂连接查询语句_MySQL查询语句之复杂查询
软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...
- mysql 查询语句_MySQL查询语句之复杂查询
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.在MySQL中经常会有很多复杂的查询,为了节约大家的时间,小编总 ...
- mysql的七种查询命令_mysql查询命令详细
1 --数据库准备 2 --创建一个数据库 3 create database python_test charset=utf84 --使用数据库 5 usepython_test6 --显示当前使用 ...
最新文章
- 一个可以实现图片格式相互转化的工具convert_picture.exe
- Struts 验证码登陆
- [原创]Android Monkey测试工具使用介绍
- 用python倒序输出一个字符串_Python字符串逆序输出的实例讲解
- SAP Spartacus logout的拦截
- linux进程管理子系统分析,linux进程管理子系统简要分析
- php实现mysql 数据迁移_php实现redis数据库指定库号迁移的方法
- linux fflush函数,fflush - wwliu的个人页面 - OSCHINA - 中文开源技术交流社区
- linux服务器 top 查看 内存占用详情
- sencha inspector(调试工具)
- 各种机器学习和深度学习的中文微博情感分析
- python实现实例_Python 练习实例65
- js原生创建元素createElement,动态插入js
- Spring Cloud Eureka源码分析之心跳续约及自我保护机制
- P124黎曼可积性刻画 的两个备注
- viscircles
- 基于ZigBee和STM32的智能家居控制系统的设计与实现(二)
- Xcode12编译报错 “building for iOS,but linking in object file built for iOS Simulator”
- oracle数据库事务日志已满,SQL Server中已满事务日志原因的检测(上)
- Kafka(9)副本(leader、flower、isr说明)