mysql查询在一张表不在另外一张表的记录
 
问题: 
 
查询一个表(tb1)的字段记录不在另一个表(tb2)中   
  条件:tb1的字段key的值不在tbl2表中   
  ----------------------    
最原始的写法:   
  select   A.*   from   tbl1 A where   A.key   not   in   (select   key   from   tbl2)      
  
如果tbl2表中数据量很大,比如数据上百万条,每次都这样匹配效率会非常低。    
   
 
解决问题: 
 
SELECT tb1.* FROM tb1 LEFT JOIN tb2 ON tb1.id=tb2.id WHERE tb2.id IS NULL;
 
 
关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子 
 
给出了一个简单的解释,相信会对你有所启示。 
 
 
--建表table1,table2: 
create table table1(id int,name varchar(10)) 
create table table2(id int,score int) 
insert into table1 select 1,'lee' 
insert into table1 select 2,'zhang' 
insert into table1 select 4,'wang' 
insert into table2 select 1,90 
insert into table2 select 2,100 
insert into table2 select 3,70 
如表 
------------------------------------------------- 
 table1  | table2  | 
------------------------------------------------- 
id  name |id  score | 
1  lee     |1  90 | 
2  zhang |2  100 | 
4  wang |3  70 | 
------------------------------------------------- 
 
以下均在查询分析器中执行 
 
一、外连接 
1.概念:包括左向外联接、右向外联接或完整外部联接 
 
2.左连接:left join 或 left outer join 
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的所有行,而不仅仅是联接列所匹 
 
配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列 
 
均为空值(null)。 
(2)sql语句 
select * from table1 left join table2 on table1.id=table2.id 
-------------结果------------- 
id name id score 
------------------------------ 
1 lee 1 90 
2 zhang 2 100 
4 wang NULL NULL 
------------------------------ 
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示 
 
3.右连接:right join 或 right outer join 
(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有 
 
匹配行,则将为左表返回空值。 
(2)sql语句 
select * from table1 right join table2 on table1.id=table2.id 
-------------结果------------- 
id name id score 
------------------------------ 
1 lee 1 90 
2 zhang 2 100 
NULL NULL 3 70 
------------------------------ 
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示 
 
4.完整外部联接:full join 或 full outer join 
(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表 
 
的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。 
(2)sql语句 
select * from table1 full join table2 on table1.id=table2.id 
-------------结果------------- 
id name id score 
------------------------------ 
1 lee 1 90 
2 zhang 2 100 
4 wang NULL NULL 
NULL NULL 3 70 
------------------------------ 
注释:返回左右连接的和(见上左、右连接) 
 
二、内连接 
1.概念:内联接是用比较运算符比较要联接列的值的联接 
 
2.内连接:join 或 inner join 
 
3.sql语句 
select * from table1 join table2 on table1.id=table2.id 
-------------结果------------- 
id name id score 
------------------------------ 
1 lee 1 90 
2 zhang 2 100 
------------------------------ 
注释:只返回符合条件的table1和table2的列 
 
4.等价(与下列执行效果相同) 
A:select a.*,b.* from table1 a,table2 b where a.id=b.id 
B:select * from table1 cross join table2 where table1.id=table2.id  (注:cross join 
 
后加条件只能用where,不能用on) 
 
三、交叉连接(完全) 
 
1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以 
 
第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录) 
 
2.交叉连接:cross join (不带条件where...) 
 
3.sql语句 
select * from table1 cross join table2 
-------------结果------------- 
id name id score 
------------------------------ 
1 lee 1 90 
2 zhang 1 90 
4 wang 1 90 
1 lee 2 100 
2 zhang 2 100 
4 wang 2 100 
1 lee 3 70 
2 zhang 3 70 
4 wang 3 70 
------------------------------ 
注释:返回3*3=9条记录,即笛卡尔积 
 
4.等价(与下列执行效果相同) 
A:select * from table1,table2 
 
 
左连接如果要关联三张表,那么接连使用两个left outer join和on组合。

mysql查询在一张表不在另外一张表的记录的更多相关文章

  1. mysql 查询某字段里含有(或者不含)某字符的所有记录方法(转)

    select gid, username from users where FIND_IN_SET(8,gid); //查询gid里含有数字8的记录,gid是varchar ,数据格式:"1 ...

  2. MySQL 查询多张表中相同字段的最大值

    MySql : 有N张表,N未知,每张表都有一个字段(id),每张表的字段结构不完全一样,如何查询所有表里面所有id的最大值?如下图所示: 对上面三张表进行操作的话,结果应该为:9 SQL语句: se ...

  3. mysql 查询数据库或某张表有多大(字节)

    转载:https://www.cnblogs.com/diandiandidi/p/5582309.html 1.要查询表所占的容量,就是把表的数据和索引加起来就可以了 select sum(DATA ...

  4. mysql查询数据库大小和表

    每个mysql都有一个库information_schema,里面有一张表TABLES存储了所有数据库表的信息,因此,可以从这张表中查看数据库大小和表大小 查询数据库大小 ,),'GB') as da ...

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

    MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...

  6. 从MySQL全库备份中恢复某个库和某张表【转】

    从MySQL全库备份中恢复某个库和某张表 一.全库备份-A [root@mha2 backup]#mysqldump -uroot -p123456 --default-character-set=u ...

  7. MySQL查询结果复制到新表(更新、插入)

    MySQL中可以将查询结果复制到另外的一张表中,复制的话通常有两种情况,一种是更新已有的数据,另一种是插入一条新记录.下面通过例子来说明.首先构建两个测试表. 表t1: 表t2: 1.如果t2表中存在 ...

  8. mysql查询操作之单表查询、多表查询、子查询

    一.单表查询 单表查询的完整语法: .完整语法(语法级别关键字的排列顺序如下) select distinct 字段1,字段2,字段3,... from 库名.表名 where 约束条件 group ...

  9. MySQL数据库(4)_MySQL数据库外键约束、表查询

    一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

随机推荐

  1. python机器学习《回归 一》

    唠嗑唠嗑 依旧是每一次随便讲两句生活小事.表示最近有点懒,可能是快要考试的原因,外加这两天都有笔试和各种面试,让心情变得没那么安静的敲代码,没那么安静的学习算法.搞得第一次和技术总监聊天的时候都不太懂 ...

  2. 常用的user32API说明

    整理了一下常用的user32API说明 还有软件Microsoft Spy++供大家下载  Spyv10.00.30319.rar using System; using System.Collect ...

  3. 游戏世界之Unity3D的基础认识

    1.写在前面 Unity3D是由Unity Technologies开发的一个让你轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏 ...

  4. 开源分布式实时计算引擎 Iveely Computing 之 WordCount 详解(3)

    WordCount是很多分布式计算中,最常用的例子,例如Hadoop.Storm,Iveely Computing也不例外.明白了WordCount在Iveely Computing上的运行原理,就很 ...

  5. 百度地图 IOS版开发经验分享

    最近刚完成app中地图的应用,感觉非常的曲折,折腾了很久,刚才开始一直不能成功使用百度地图api,报一大堆的错误,后来换到高德地图,又发现服务端使用的百度的经纬度,又从高德换回百度,泪奔. 这里简单比 ...

  6. [AHOI2013]打地鼠(网络流)

     [问题描述]      游戏里一共会冒出来N个地鼠,这些地鼠冒出来的位置都分布在一条直线上.第i个地鼠会在Ti时刻在Xi位置冒出来,打到第i个地鼠的得分是Pi.     当游戏开始时(也就是0时刻) ...

  7. jQuery基础之(六)jQuery浏览器的兼容性(以CSS3特写兼容举例)

    CSS3充分吸收多年了web发展的需求,吸收了很多新颖的特性.例如border-radius css3特性中最令人兴奋的莫过于选择器的增强,例如属性选择器可以根据某个属性值来选择标记,位置选择器可以根 ...

  8. ThreadLocal模式的核心元素

    首先来看ThreadLocal模式的实现机理:在JDK的早期版本中,提供了一种解决多线程并发问题的方案:java.lang.ThreadLocal类.ThreadLocal类在维护变量时,世纪使用了当 ...

  9. Convention插件

    考虑使用COnvention插件可以进行零配置而且插件进行很多规范的约定也可以对开发合作当中按着它相应的规律开发..感觉也挺方便管理的.下面简单介绍它的使用. 首先我们需要使用到的jar包: Java ...

  10. Address already in use: JVM_Bind<null>:80

    Address already in use: JVM_Bind<null>:80 咱还是闲话少说,直接切入正题. 起因: 一直用Tomcat,但是前几天突然报错: java.net.Bi ...