Mysql求两个表(查询结果)的差集

两个查询结果的差集,mysql直接提供了关键字not in,而且我们也一般先会想到这个查询方式。但是在数据量多的情况之下,效率会很低,这是必须使用左链接的方式求查询。

场景是这样的小号信息可以在多个分组里面,现在需要查询出小号信息在未分组的信息并且进行分页查询!

CREATE TABLE `tm_friend_info` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`mobile` varchar(248) DEFAULT '' COMMENT '手机号码',`nickname` varchar(248) CHARACTER SET utf8mb4 DEFAULT '' COMMENT '昵称',`state` int(1) NOT NULL DEFAULT '1' COMMENT '状态(1正常/2已删除)',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2044 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='小号好友表';
CREATE TABLE `tm_friend_group` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`name` varchar(248) DEFAULT '' COMMENT '名称',`state` int(1) NOT NULL DEFAULT '1' COMMENT '状态(1正常/2已删除)',`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',`sort` int(3) DEFAULT '1' COMMENT '排序',`create_id` int(11) DEFAULT '1' COMMENT '创建用户ID',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='小号分组表';
CREATE TABLE `tm_friend_group_relation` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',`group_id` int(11) DEFAULT NULL COMMENT '组号ID',`friend_id` int(11) DEFAULT NULL COMMENT '好友ID',`state` int(1) NOT NULL DEFAULT '1' COMMENT '状态(1正常/2已删除)',`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',`update_time` timestamp NULL DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=121 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='小号分组关联表';

采用not in查询

SELECTinfo.mobile,info.nickname,info.state
FROMtm_friend_info info
WHEREinfo.state = 1
AND info.id NOT IN (SELECTfriend_idFROMtm_friend_group_relation relation,tm_friend_group tgroupWHERErelation.group_id = tgroup.idAND tgroup.state = 1AND relation.state = 1
)

采用left join查询

SELECTinfo.mobile,info.nickname,info.state
FROMtm_friend_info info
LEFT JOIN (SELECTfriend_idFROMtm_friend_group_relation relation,tm_friend_group tgroupWHERErelation.group_id = tgroup.idAND relation.state = 1AND tgroup.state = 1
) AS b ON info.id = b.friend_id
WHEREinfo.state = 1
AND b.friend_id IS NULL

结果都是一样的!但是可以看到执行策略!却是有很大的不同,采用not in中select_type中SUBQUERY是子查询非常的消耗性能!

select_type介绍

LEFT JOIN 关键字会从左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中没有匹配的行。

Mysql求两个表(查询结果)的差集相关推荐

  1. MySQL 笔记5 -- 多表查询

    MySQL 笔记5 – 多表查询 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 一.表之间关系 1.一对一 ...

  2. 在MySQL中实现交叉表查询1(静态交叉表)

    在MySQL中实现交叉表查询1(静态交叉表) 一.什么是交叉表 交叉表查询是将来源于某个表中的字段进行分组,一组列在交叉表左侧,一组列在交叉表上部,并在交叉表行与列交叉处显示表中某个字段的各种计算值. ...

  3. MYSQL数据库实验三多表查询_MYSQL数据库语句之多表操作(三)

    多表操作 join查询(join按照功能分可以分为3类): cross join(交叉连接):获取多个表中的交叉关系. inner join(内连接):获取2个表中字段匹配关系的记录. 外连接 lef ...

  4. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  5. 基于SpringDataJpa的mysql动态分页多表查询

    基于SpringDataJpa的mysql动态分页多表查询 由于这篇文章预计篇幅会很长,关于Spring Data JPA的知识就简短的分享,更多的请自行度娘,JPA 封装了很多查询的接口,但今天要讲 ...

  6. MySQL比较两个表数据差异,在t2表而不在t1表的数据

    MySQL比较两个表数据差异,在t2表而不在t1表的数据 SELECT * FROM t2 WHERE id NOT IN (SELECT id FROM t1);

  7. 在MySQL中实现交叉表查询2(动态交叉表)

    在MySQL中实现交叉表查询2(动态交叉表) 交叉表分为静态交叉表和动态交叉表.其中静态交叉表中的列是固定的,因此相对容易实现:而动态交叉表中的列需要动态生成. 一.静态交叉表的实现 参见上一篇文章: ...

  8. MySQL比较两张表数据相同、不同结果记录

    两张表:水果设备表sb_fruit.系统设备表xt_fruit,比较两张表中相同.不同的数据结果. 自己开始尝试写的方法: (1)设备与系统共有数据: select sb.id,sb.name_idn ...

  9. 记录:数据库(MySQL)之多表查询

    数据库(MySQL)之多表查询 1.创建表 -- 多表联合查询 -- 创建三个表,并进行插入数据 -- 创建emp表,并插入数据 CREATE TABLE emp ( eno int(5),-- 员工 ...

最新文章

  1. 模拟一下goldengate中断后,重新同步操作
  2. es每次结果不一样_电子血压计不准!每次测血压都不一样……
  3. LINUX ORACLE 启动与关闭
  4. hbuilderx内置服务器启动失败_我们来看看Swoole是如何实现WebSocket服务器及客户端的...
  5. WebService高级,可靠消息
  6. 电脑上没有iis组件,怎么才能安装iis?
  7. (一)UDPSocket 服务端编写(超详细)
  8. 闩锁效应的产生原因及解决办法
  9. 【Mathematica】 曲面的绘制
  10. 联邦学习(Federated Learning)
  11. 如何修改PDF内容,PDF怎么旋转页面
  12. Jenkins使用FTP上传文件报错问题处理
  13. 一个刚毕业程序员试用期工作内容
  14. MySQL kill进程后出现killed
  15. SystemUI之NavigationBar导航栏
  16. Concat和Add操作
  17. C++面向对象课程设计——4S店管理系统(源代码内附流程图)
  18. 虹科方案 | 在数字化的变电站中低成本实现无缝集成的独特解决方案
  19. 安全卫士App需要的基本操作(入门概述)
  20. Windows 10 全新界面要来了,全新的 UI 界面。

热门文章

  1. 如何解决蓝屏代码0x000007B问题
  2. IOS常用开源库(转)
  3. BIM建模:话说管线综合,分久必合,合久必分
  4. 在bilibili平台利用第三方推流完成摄像头(手机)、电脑屏幕、背景共存直播。以线上自习室为例
  5. HTML5中 HTML列表/块/布局 韩俊强的博客
  6. 教你制作无缝的背景填充图案
  7. 原来python的继承,重写,多态是场家庭剧
  8. ant design table 合并单元格
  9. ps怎么制作图片html,怎么将PS的图片制作成网页?
  10. Related Field got invalid lookup: icontains