mysql 查询在一张表不在另外一张表的记录

SQL Join子句,主要用在select语句中,把两个或多个表的行结合起来,基于这些表之间的共同字段(往往是id字段)来查询,从多个表中返回满足条件的所有行。

常见join子句类型

常见join子句类型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT JOIN、FULL JOIN,其中第一种为内连接,后三种为外连接。

不同的join子句类型区别如下图所示:
  在这里插入图片描述
介绍其中4种:
1、方法一(仅适用单个字段):使用 not in ,比较容易理解,缺点是效率低
如:select A.ID from A where A.ID not in (select ID from B);
2、方法二(适用多个字段匹配):使用 left join…on… , “B.ID isnull” 表示左连接之后在B.ID 字段为 null的记录。
如:select A.ID from A left join B on A.ID=B.ID where B.ID is null ;
3、方法三(适用多个字段匹配)
如:select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;
4、方法四(适用多个字段匹配)
如:select * from A where not exists(select 1 from B where A.ID=B.ID)
总结:
方法一:第一种not in 场景使用子查询数据量小的情况。因为我子查询只有20w的数据。但是总表有100w。所以我使用not in的话我使用的是外表的索引所以数据较快。弊端。子查询里面不能存在null字段。如果有,那么你数据就会准。这种方式的实际情况其实是和字表做hash连接。
方法二:左连接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)。两表进行关联。数据量为两个表的笛卡尔积。返回左表的全部数据。右边不满足条件的为null。如果左表数据大的话,这样关联数据也不小。所以速度这么慢,属于正常。
方法四:第二种not in 场景使用子查询数据量小的情况。因为我子查询只有20w的数据。但是总表有100w。所以我使用not exists的话我使用的是子表的索引。但是我外表数据太大。所以导致速度变慢。本质:对外表作loop循环,每次loop循环再对内表进行查询。

总结:

如果右表是子表,也就是说右表有多条记录匹配左表的话,那么展示的最终结果是多条记录和左表匹配。如下图展示
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

总结:left join 其实也就是匹配左表的过程,on条件后不应该加上左表的条件。

转:https://www.cnblogs.com/jelly12345/p/16828722.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

游鱼_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值