MYSQL查询A表中不存在于B表中的所有符合条件的数据

在开发过程中,总有一些需求是需要查看在A表中ID不存在于B表中的ID的情况:

下面有三种方法可以实现这一需求:

第一种:使用Not in 方法通过子查询的结果集来做过滤:

select * from A where 1=1 AND A.ID not in (select ID from  B )

这种情况最常见也是最容易理解的逻辑SQL代码,但是会有很多问题出现。

首先,这种情况是针对数据量比较小的情况使用的,原因在于IN 和 NOT IN并不是针对索引进行查询的,操作效率相对较慢。可以通过使用NOT EXISTS 关键字进行优化,相对IN来说EXISTS的效率要高一些,应该在开发过程中尽量少使用in,并改为left join左连接进行查询过滤。

其次,使用not in 会出现查询结果不符合预期的情况:(测试了很多遍发现原因是因为子查询结果集中存在NULL值)

所以在使用in的时候,需要注意下面两种情况:

1.在使用IN 和 NOT IN 时要注意 IN范围中有NULL和空值的情况

2.在where语句中考虑NULL的同时要考虑空字符串的情况

第二种:在卡法中最常见的left join 方法,实现数据的过滤。

SELECT * FROM A LEFT JOIN B ON A.Id=B.Id  WHERE 1=1 AND B.Id IS NULL; 

第三种:查询速度最快,在应用到插入数据时,可在避免重复插入相同数据时又可以获取较快的时效,速度比上两个快非常多,但是不常见。

SELECT * FROM A WHERE  1=1 AND (SELECT COUNT(1) FROM B WHERE A.Id=B.Id)=0;

原文地址:https://www.cnblogs.com/adolph2715/p/10921765.html

时间: 2024-08-11 03:30:40

MYSQL查询A表中不存在于B表中的所有符合条件的数据的相关文章

jQ禁止右键点击、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器、预加载图片、页面样式切换、所有列等高、动态控制页面字体大小、获得鼠标指针的X值Y值、验证元素是否为空、替换元素、延迟加载、验证元素是否存在于Jquery集合中、使DIV可点击、克隆对象、使元素居中、计算元素个数、使用Google主机上的Jquery类库、禁用Jquery效果、解决Jquery类库与其他Javascript类库冲突

1. 禁止右键点击 代码如下: $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 代码如下: $(document).ready(function() { $("input.text1").val("Enter your search text here"); textFill($

JS 数组中查找符合条件的数据索引

日常工作中经常会需要我们前端获取后端为我们传递的数据放在页面中渲染的问题.大批量的数据后端会根据具体的情况来放在数组中传递给我们,但是如果遇到数组中有需要特殊需要处理的数据怎么办?原来100个数据,渲染规则完全一致,这个时候我们用一个循环就可以搞定,但是有的时候需求并不会这样simple,也有100个数据中有任意个不定位置的特殊元素需要特殊处理,这个时候我们需要找一下解决办法: 1.首先将特殊的元素剔除掉,把剩余可以简单循环渲染的数据重新组成数组,首先进行第一步的渲染.这个时候我们可以用到的方法

如何从List<T>中筛选符合条件的数据的集合或个数

ChannelList就是一个List类型的数据,IsOpen 是其元素的属性 channelCount = (from channel in DevicesManager.Instance.CurrentDevice.ChannelList where channel.IsOpen group channel by channel.ChannelID).Count();

查询在一张表不在另外一张表的记录及效率探究

在我做项目的时候遇到一个需求,要将存在于表ta而不存在于表tb中的数据查询出来. 记录使用的方法和探讨效率. 数据准备 创建表ta,并且使用存储过程插入13000条数据,在我的机器上运行时间: 346.719s.如果觉得插入的速度比较慢,可以直接导入我建好的表,百度云地址 http://pan.baidu.com/s/1dFtovg1 ,里面已经有数据了,直接导入sql执行即可,这样比用存储过程要快很多. DROP TABLE IF EXISTS ta; CREATE TABLE `ta` (

生产要不要开启MySQL查询缓存

一.前言在当今的各种系统中,缓存是对系统性能优化的重要手段.MySQL Query Cache(MySQL查询缓存)在MySQL Server中是默认打开的,但是网上各种资料以及有经验的DBA都建议生产环境中把MySQL Query Cache关闭.按道理,MySQL Server默认打开,是鼓励用户使用缓存,但是大拿们却建议关闭此功能,并且国内各个云厂商提供的MySQL云服务中默认都是关闭这个功能,这是为什么?他们在使用中遇到了什么坑?本文将会从以下几方面来详解MySQL Query Cach

mysql 查询select语句汇总

数据准备: 创建表: create table students( id int unsigned primary key auto_increment not null, name varchar(20) default '', age tinyint unsigned default 0, height decimal(5,2), gender enum('男','女','人妖','保密'), cls_id int unsigned default 0, isdelete bit defau

MySQL查询数据表中数据记录(包括多表查询)

MySQL查询数据表中数据记录(包括多表查询) MySQL查询数据表中数据记录(包括多表查询) 转自:http://www.baike369.com/content/?id=5355 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: select selection_list // 要查询的内容,选择哪些列 from table_list // 从什么表中查询,从何处选择行 where primary_

mysql查询-从表1中查询出来的结果重新插入到表1

原有表结构 CREATE TABLE `t_card_user` ( `id` varchar(32) NOT NULL, `card_user_id` bigint(20) DEFAULT NULL COMMENT 'UserID受设备最大用户数影响,范围为1--最大用户数.', `card_no` bigint(20) DEFAULT NULL COMMENT 'CardNo最大为4294967295(2^32次方)', `start_time` datetime DEFAULT NULL

MYSQL查询~ 存在一个表而不在另一个表中的数据

A.B两表,找出ID字段中,存在A表,但是不存在B表的数据.A表总共13w数据,去重后大约3W条数据,B表有2W条数据,且B表的ID字段有索引. 方法一 使用 not in ,容易理解,效率低  ~执行时间为:1.395秒~ 1 select distinct A.ID from A where A.ID not in (select ID from B) 方法二 使用 left join...on... , "B.ID isnull" 表示左连接之后在B.ID 字段为 null的记录