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. Linux基础入门(20135207 王国伊)

    实验一  Linux系统简介 一.实验心得 首个实验是简单介绍了Linux系统的简介,了解Linux系统的历史和发展.使我受益匪浅 实验二  基本概念及操作 一.学习目标 1.实验楼环境介绍 2.常用 ...

  2. Django实际站点项目开发经验谈

    开发了两个月的Django站点正式上线了,看着网站从无到有,从前端到后台,从本地开发到环境部署,一点一滴的堆砌成型,着实带给我不小的乐趣. Django站点介绍: 开发环境:阿里云服务器centos6 ...

  3. [30分钟]MSSQL快速入门教程

    1.什么是SQL语句 sql语言:结构化的查询语言.(Structured Query Language),是关系数据库管理系统的标准语言. 它是一种解释语言:写一句执行一句,不需要整体编译执行.语法 ...

  4. Object C学习笔记26-文件管理(二)

    上一篇简单的介绍了如何获取文件属性,删除,拷贝文件等,本文继续记录Object C中文件IO操作. 一. 获取文件的执行主目录 在Object C中提供了一个方法 NSHomeDirectory() ...

  5. Google浏览器导出书签

    C:\users\用戶名\AppData\Local\Google\Chrome\User Data\Default\Bookmarks 這個文件就是書簽啊,復制一下就行了

  6. 在eclipse中安装插件

    1.在Eclipse中菜单help选项中选择install new software选项, 2.在work with 栏中输入 http://download.eclipse.org/releases ...

  7. java数组的增删改查

    import java.util.List; import java.util.ArrayList; import java.util.Set; import java.util.HashSet; p ...

  8. JSP/SERVLET入门教程--Servlet 使用入门

    现在的JSP书籍有的是直接讲述JSP的使用,然后再讲解SERVERLET的使用;也有书籍是先讲述SERVERLET的使用,然后讲解JSP使用.个人认为第二种相对好一些,至于原因大家可以在学习体会到!所 ...

  9. 关于OOM那些事儿

    最近在aliyun上crontab里放的一个java脚本把机器搞翻了,ssh连不上T_T 发现OOM了,真是无语.并不懂Java的内存模型,转一篇备用吧. 转载自:http://www.cnblogs ...

  10. BZOJ-1202 狡猾的商人 并查集+前缀和

    我记得这个题,上次之前做的时候没改完,撂下了,今天突然想改发现,woc肿么A 了= =看来是我记错了.. 1202: [HNOI2005]狡猾的商人 Time Limit: 10 Sec Memory ...