这里需要强调的是b表中关联字段的值是唯一的这种情况,并且b表尽量是列举类型的,意味着表比较小。

====================

准备数据:

1. 建两个类似表,test1,test2,只有id和val两个字段。

CREATE TABLE `test1` (
`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
`val` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ;

2. 插入数据

  1)test1表

    这里顺便说下,有些童鞋可能觉得插入语句例如插入多条,需要写多个sql语句,实际可以只写一个。

    如下一条sql,可以实现插入三条记录(insert关键字后边可以省略into;values利用逗号分隔)

    insert test1(val) values ('a'),('b'),('c');

    插入3条记录,各个查询方式效果不太明显,这里还有个插入技巧,成倍数对该表原数据进行多次插入。

    如 insert test1(val) (select val from test1);  #这里注意没有values关键字

    多次执行该语句,很快总记录数达到十万条以上。

  2)test2表

    该表数据有3条,有一条的val在test1表存在

    insert test2(val) values ('a'),('x'),('y');

3. 查询

查询在test1表中存在,且test2表中没有的记录

这里实现方法有很多,我主要介绍3种:

  1)利用not in

    SELECT a.* from test1 a where a.val not in (select b.val from test2 b);

  2)not exists

     SELECT a.* from test1 a where not exists (SELECT 1 from test2 b where a.val = b.val);  #执行耗时相对较长

  3)left join

    select a.* from test1 a left join test2 b on a.val = b.val where b.val is null; # 先执行left join,再执行where

=============================

当b表中,val的值唯一的情况下且b表较小,以上查询是可取的。否则,left join这种使用可能会很灾难,内存溢出,死掉都可能发生。

可根据实际情况,选择自己的方式。

sql的一个查询,情景:a表中存在的数据,且在b表中不存在 (not in,not exists的更多相关文章

  1. 我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中:

    我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中: C/C++ code   ? 1 int retrieve(int scanno,void* buf); 在 ...

  2. 根据从redis缓存的数据查询出来,在从数据库中取出所有的数据,俩个数据进行比较,去掉重复,剩下库中新插入的数据,取出新数据,然后把redis中的缓存数据清空把从数据库中查出来的所有数据放到redis缓存中

    参考代码: public String getNewCenter(HttpServletRequest request,HttpServletResponse resonse){ JSONObject ...

  3. vue中什么样的数据可以是在视图中显示

    1. Vue中不可以添加不存在的属性,因为不存在的属性是没有getter和setter的. <div id="app"> {{msg.a}} {{msg.b}} < ...

  4. 将从数据库中获取的数据写入到Excel表中

    pom.xml文件写入代码,maven自动加载poi-3.1-beta2.jar <!-- https://mvnrepository.com/artifact/poi/poi --> & ...

  5. oracle利用merge更新一表的某列数据到另一表中

    假设你有两张表 t1 表 -------------------------- id |    name   |   pwd 1  |      n1     | t2 表 ------------- ...

  6. [django]主次表如何取出对方数据[主表obj.子表__set()]

    [sql]mysql管理手头手册,多对多sql逻辑 国家--城市例子 class Country(models.Model): name = models.CharField(max_length=3 ...

  7. java加载外部文件数据到代码中:外部数据文件放到jar包中,调用方法getResourceAsStream

    任务要将数据文件geo.txt加载进行.因为是别人写的总体项目,不能乱动位置.只能将geo.txt打包到jar中某目录.比如,放到.class文件下怎么加载:http://riddickbryant. ...

  8. c++从文件中读取一行数据并保存在数组中

    从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...

  9. 模板列传值到子窗体中,子窗体中多选gridview中checkbox保存数据多项到数据库中

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

随机推荐

  1. python短信发送

    '''以云之讯平台为例:''' url = 'https://open.ucpaas.com/ol/sms/sendsms' # 账户sidsid = 'f0ad70b276a8b63eb44f415 ...

  2. <Android 基础(三十三)> TabHost ~ 仿微信底部菜单

    简介 Container for a tabbed window view. This object holds two children: a set of tab labels that the ...

  3. python学习笔记之——python安装mysqldb后,pycharm导入还是报错问题

    在安装mysqldb过程中遇到,本来已经安装了mysqldb了,但是在pycharm中import   MySQLdb还是报错找不到该模块的问题.解决方法如下:1.file->settings ...

  4. CVE-2018-18820 icecast 栈缓冲区越界写漏洞分析

    前言 icecast 是一款开源的流媒体服务器 , 当服务器配置了 url 认证时,服务器在处理 HTTP 头部字段时错误的使用了 snprintf 导致栈缓冲区的越界写漏洞( CVE-2018-18 ...

  5. Ink——一款使用React风格开发命令行界面应用(CLI App)的nodejs工具

    Github: https://github.com/vadimdemedes/ink Ink introduction: React for CLIs. Build and test your CL ...

  6. 【three.js练习程序】旋转、缩放场景

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Prometheus Node_exporter 之 Node Exporter

    Node Exporter 1. Node Exporter Scrape Time type: GraphUnit: secondsLabel: Seconds{{collector}} - 各个收 ...

  8. php编译安装 报错 make ***[libphp5.la] Error 1解决方法

    报错信息: /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [libphp5.la] Err ...

  9. sql server复制表数据到另外一个表 的存储过程

    ) Drop Procedure GenerateData go CREATE PROCEDURE GenerateData @tablename sysname AS begin ) ) ) dec ...

  10. Java重要类详解之ArrayList类

    https://blog.csdn.net/shengmingqijiquan/article/details/52634640 一.ArrayList概述 ArrayList 是一个数组队列,相当于 ...