假设有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表的记录相关推荐

  1. mysql 子表 关联查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 from ...

  2. mysql多表查询语句_mysql查询语句 和 多表关联查询 以及 子查询

    1.查询一张表:select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select字段1,字段2,字段3 frome ...

  3. 怎么提高mysql多表查询效率_MySQL创建index提高多表查询效率

    本文的目的在于探讨use index for join语句的基本原理.我们知道,在MySQL使用JION语句关联多表查询时,为表创建Index能够大幅度提高查询效率.下面以一个简单的例子来了解其中的原 ...

  4. mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询

    最近有个需求,要修改现有存储结构,涉及查询条件和查询效率的考量,看了几篇索引和HBase相关的文章,回忆了相关知识,结合项目需求,说说自己的理解和总结. 总体目录如下,上篇介绍了前3小节,分析了索引为 ...

  5. 查询排序_MySQL查询性能优化

    MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下我们从数据库的索引和查询 ...

  6. mysql 主键查询性能_MySQL查询性能优化(精)

    MySQL查询性能优化 MySQL查询性能的优化涉及多个方面,其中包括库表结构.建立合理的索引.设计合理的查询.库表结构包括如何设计表之间的关联.表字段的数据类型等.这需要依据具体的场景进行设计.如下 ...

  7. mysql复杂连接查询语句_MySQL查询语句之复杂查询

    软件安装:装机软件必备包 SQL是Structured Query Language(结构化查询语言)的缩写.SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言.在使用它时,只需要发出& ...

  8. mysql 查询语句_MySQL查询语句之复杂查询

    MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.在MySQL中经常会有很多复杂的查询,为了节约大家的时间,小编总 ...

  9. mysql的七种查询命令_mysql查询命令详细

    1 --数据库准备 2 --创建一个数据库 3 create database python_test charset=utf84 --使用数据库 5 usepython_test6 --显示当前使用 ...

最新文章

  1. 一个可以实现图片格式相互转化的工具convert_picture.exe
  2. Struts 验证码登陆
  3. [原创]Android Monkey测试工具使用介绍
  4. 用python倒序输出一个字符串_Python字符串逆序输出的实例讲解
  5. SAP Spartacus logout的拦截
  6. linux进程管理子系统分析,linux进程管理子系统简要分析
  7. php实现mysql 数据迁移_php实现redis数据库指定库号迁移的方法
  8. linux fflush函数,fflush - wwliu的个人页面 - OSCHINA - 中文开源技术交流社区
  9. linux服务器 top 查看 内存占用详情
  10. sencha inspector(调试工具)
  11. 各种机器学习和深度学习的中文微博情感分析
  12. python实现实例_Python 练习实例65
  13. js原生创建元素createElement,动态插入js
  14. Spring Cloud Eureka源码分析之心跳续约及自我保护机制
  15. P124黎曼可积性刻画 的两个备注
  16. viscircles
  17. 基于ZigBee和STM32的智能家居控制系统的设计与实现(二)
  18. Xcode12编译报错 “building for iOS,but linking in object file built for iOS Simulator”
  19. oracle数据库事务日志已满,SQL Server中已满事务日志原因的检测(上)
  20. Kafka(9)副本(leader、flower、isr说明)

热门文章

  1. Spring Aop开发过程中可能出现的异常(通过这些异常可以知道需要什么Jar包)
  2. fms安装教程 linux_FMS安装
  3. 鼠标动效html,5种纯CSS3鼠标hover按钮动画效果
  4. xilinx SoC学习笔记之PetaLinux
  5. Qt学习笔记之数据库
  6. 如何将视频下载并且转码拼接
  7. libxxx.so- text relocations问题的终极解决方案
  8. asp.net DataGrid GridView 表格之选中行与获取选中行数据
  9. Zabbix邮件报警配置
  10. 用VisualVM分析MyEclipse