sql的一个查询,情景:a表中存在的数据,且在b表中不存在 (not in,not exists
这里需要强调的是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的更多相关文章
- 我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中:
我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中: C/C++ code ? 1 int retrieve(int scanno,void* buf); 在 ...
- 根据从redis缓存的数据查询出来,在从数据库中取出所有的数据,俩个数据进行比较,去掉重复,剩下库中新插入的数据,取出新数据,然后把redis中的缓存数据清空把从数据库中查出来的所有数据放到redis缓存中
参考代码: public String getNewCenter(HttpServletRequest request,HttpServletResponse resonse){ JSONObject ...
- vue中什么样的数据可以是在视图中显示
1. Vue中不可以添加不存在的属性,因为不存在的属性是没有getter和setter的. <div id="app"> {{msg.a}} {{msg.b}} < ...
- 将从数据库中获取的数据写入到Excel表中
pom.xml文件写入代码,maven自动加载poi-3.1-beta2.jar <!-- https://mvnrepository.com/artifact/poi/poi --> & ...
- oracle利用merge更新一表的某列数据到另一表中
假设你有两张表 t1 表 -------------------------- id | name | pwd 1 | n1 | t2 表 ------------- ...
- [django]主次表如何取出对方数据[主表obj.子表__set()]
[sql]mysql管理手头手册,多对多sql逻辑 国家--城市例子 class Country(models.Model): name = models.CharField(max_length=3 ...
- java加载外部文件数据到代码中:外部数据文件放到jar包中,调用方法getResourceAsStream
任务要将数据文件geo.txt加载进行.因为是别人写的总体项目,不能乱动位置.只能将geo.txt打包到jar中某目录.比如,放到.class文件下怎么加载:http://riddickbryant. ...
- c++从文件中读取一行数据并保存在数组中
从txt文本中读取数据存入数组中 #include <iostream> #include <fstream> #include <string> #include ...
- 模板列传值到子窗体中,子窗体中多选gridview中checkbox保存数据多项到数据库中
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
随机推荐
- Android 监听手机GPS打开状态
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70854942 本文出自[赵彦军的博客] GPS_Presenter package ...
- CSS 小结笔记之图标字体(IconFont)
本篇主要介绍一种非常好用的图标大法——图标字体(IconFont). 什么是图标字体?顾名思义,它是一种字体,只不过这个字体显示的并不是具体的文字之类的,而是各种图标. 网站上经常会用到各种图标,之前 ...
- 【three.js练习程序】拖动选中的物体
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 《SQLSERVER2012实施与管理实战指南》前4章节笔记内容
<SQLSERVER2012实施与管理实战指南>前4章节笔记内容 <SQLSERVER2012实施与管理实战指南>的前面4章是<SQLSERVER企业级平台管理实践> ...
- SQL Server全文搜索
SQL Server全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语 ...
- php notes
1. foreach中的引用 <?php $arr = array(1, 2, 3, 4); foreach ($arr as &$value) { $value = $value * ...
- [Windows] [Firewall] 增加进入规则
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP l ...
- Python处理Windows事件日志(json)
通过NXlog将Windows事件日志保存为json格式文件,然后在Python中使用json.loads()进行处理. NXlog在将Windows事件日志保存为json格式文件,文件中带入了BOM ...
- 美式九球比赛规则 (Nine-ball)
九球比赛规则 (Nine-ball) 九球比赛规则 一.器材: 1.台面规格: a.内沿长254厘米. b.内沿宽127厘米. c.高80厘米. d.角袋口内沿最近距离为10.5厘米(±1毫米),腰袋 ...
- PHP 传值操作和传地址操作
PHP中有两种赋值操作 一种是传值操作 example: $a = 1; $b = $b; 这个就是传值 传地址是: example2: $a = 1; $b = &$a; 这两者有什么区别呢 ...