Mysql求两个表(查询结果)的差集
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求两个表(查询结果)的差集相关推荐
- MySQL 笔记5 -- 多表查询
MySQL 笔记5 – 多表查询 MySQL 系列笔记是笔者学习.实践MySQL数据库的笔记 课程链接: MySQL 数据库基础入门教程 参考文档: MySQL 官方文档 一.表之间关系 1.一对一 ...
- 在MySQL中实现交叉表查询1(静态交叉表)
在MySQL中实现交叉表查询1(静态交叉表) 一.什么是交叉表 交叉表查询是将来源于某个表中的字段进行分组,一组列在交叉表左侧,一组列在交叉表上部,并在交叉表行与列交叉处显示表中某个字段的各种计算值. ...
- MYSQL数据库实验三多表查询_MYSQL数据库语句之多表操作(三)
多表操作 join查询(join按照功能分可以分为3类): cross join(交叉连接):获取多个表中的交叉关系. inner join(内连接):获取2个表中字段匹配关系的记录. 外连接 lef ...
- MySQL数据库应用 多表查询_mysql数据库-多表查询
今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: 数据库的创建 : create ...
- 基于SpringDataJpa的mysql动态分页多表查询
基于SpringDataJpa的mysql动态分页多表查询 由于这篇文章预计篇幅会很长,关于Spring Data JPA的知识就简短的分享,更多的请自行度娘,JPA 封装了很多查询的接口,但今天要讲 ...
- MySQL比较两个表数据差异,在t2表而不在t1表的数据
MySQL比较两个表数据差异,在t2表而不在t1表的数据 SELECT * FROM t2 WHERE id NOT IN (SELECT id FROM t1);
- 在MySQL中实现交叉表查询2(动态交叉表)
在MySQL中实现交叉表查询2(动态交叉表) 交叉表分为静态交叉表和动态交叉表.其中静态交叉表中的列是固定的,因此相对容易实现:而动态交叉表中的列需要动态生成. 一.静态交叉表的实现 参见上一篇文章: ...
- MySQL比较两张表数据相同、不同结果记录
两张表:水果设备表sb_fruit.系统设备表xt_fruit,比较两张表中相同.不同的数据结果. 自己开始尝试写的方法: (1)设备与系统共有数据: select sb.id,sb.name_idn ...
- 记录:数据库(MySQL)之多表查询
数据库(MySQL)之多表查询 1.创建表 -- 多表联合查询 -- 创建三个表,并进行插入数据 -- 创建emp表,并插入数据 CREATE TABLE emp ( eno int(5),-- 员工 ...
最新文章
- 模拟一下goldengate中断后,重新同步操作
- es每次结果不一样_电子血压计不准!每次测血压都不一样……
- LINUX ORACLE 启动与关闭
- hbuilderx内置服务器启动失败_我们来看看Swoole是如何实现WebSocket服务器及客户端的...
- WebService高级,可靠消息
- 电脑上没有iis组件,怎么才能安装iis?
- (一)UDPSocket 服务端编写(超详细)
- 闩锁效应的产生原因及解决办法
- 【Mathematica】 曲面的绘制
- 联邦学习(Federated Learning)
- 如何修改PDF内容,PDF怎么旋转页面
- Jenkins使用FTP上传文件报错问题处理
- 一个刚毕业程序员试用期工作内容
- MySQL kill进程后出现killed
- SystemUI之NavigationBar导航栏
- Concat和Add操作
- C++面向对象课程设计——4S店管理系统(源代码内附流程图)
- 虹科方案 | 在数字化的变电站中低成本实现无缝集成的独特解决方案
- 安全卫士App需要的基本操作(入门概述)
- Windows 10 全新界面要来了,全新的 UI 界面。