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. CodeForces 166E -Tetrahedron解题报告

    这是本人写的第一次博客,学了半年的基础C语言,初学算法,若有错误还请指正. 题目链接:http://codeforces.com/contest/166/problem/E E. Tetrahedro ...

  2. Opencv step by step - 阈值化

    Opencv里面的阈值化做起来比较简单,只需要一个函数即可: /* Applies fixed-level threshold to grayscale image. This is a basic ...

  3. 安装.NET CORE

    需要安装两个包 https://github.com/dotnet/cli 1. .NET Core Installer 2. .NET Core SDK Installer

  4. 1.SQLAlchemy文档-简介(中文版)

    Python的SQL工具包和对象关系映射器     SQLAlchemy的是Python的SQL工具包和对象关系映射器,让应用程序开发人员可以使用上SQL的强大功能和灵活性.     它提供了一套完整 ...

  5. 微信第一个“小程序”亮相:不是APP胜似APP!

    前天晚上,微信终于推出了“小程序”功能.看过效果演示之后,网友表示,好多App可以卸载了! 据了解,微信“小程序”已首批开放给200名拥有微信服务号的开发者进行内测,而且目前开发者发布的小程序无法在用 ...

  6. dp式子100个……

    1.        资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2.        资源问题2------01背包问题F[I,j]:=max(f[i- ...

  7. c# 6.0新特性(一)

    写在前面 接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性.在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习.废话不多说,直奔主题. 原文 ...

  8. 每天一个linux命令(20):linux chmod命令

    chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...

  9. 传智168期JavaEE就业班 day04-dom

    * 课程回顾: * js语法 * js的动态函数和匿名函数 * js动态函数 Function new Function(); * 匿名函数:没有名称的函数,起个名称 var add = functi ...

  10. sersync + rsync 实现文件的实时同步

    这里有一点要特别注意了,就是在你完成备份之后,先不要把本地的文件都给删除了,先把服务停了之后再删除文件, 因为你已删除,检查到两边不一致,他又会把备份端给删除了.所以特别得注意了.这里吃过一次亏. 还 ...