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. 20135202闫佳歆--week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程--实验及总结

    week 8 实验:理解进程调度时机跟踪分析进程调度与进程切换的过程 1.环境搭建: rm menu -rf git clone https://github.com/megnning/menu.gi ...

  2. 【总结】学习Socket编写的聊天室小程序

    1.前言 在学习Socket之前,先来学习点网络相关的知识吧,自己学习过程中的一些总结,Socket是一门很高深的学问,本文只是Socket一些最基础的东西,大神请自觉绕路. 传输协议 TCP:Tra ...

  3. Java学习笔记(五)——google java编程风格指南(中)

    [前面的话] 年后开始正式上班,计划着想做很多事情,但是总会有这样那样的打扰,不知道是自己要求太高还是自我的奋斗意识不够?接下来好好加油.好好学学技术,好好学习英语,好好学习做点自己喜欢的事情,趁着自 ...

  4. jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

    一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数 ...

  5. android之简易新闻客户端

    将一个新闻信息保存到一个XML文件中,并将放在服务器下.通过手机客户端来从服务器下载该文件并解析显示. news.xml <?xml version="1.0" encodi ...

  6. Quartz.Net在windows服务中的使用

    写在前面 这几天在弄一个项目,需要定时抓取一些数据,当时也想直接用timer算了.因为之前也弄过这样的项目,但是一想,已经用过了,再去使用同一种思路,未免太乏味了.就换了一种新玩法.这里将之前看到的一 ...

  7. Linq之Linq to XML

    目录 写在前面 系列文章 linq to xml 总结 写在前面 在很多情况下,都可以见到使用xml的影子.例如,在 Web 上,在配置文件.Microsoft Office Word 文件(将wor ...

  8. Linq之Expression进阶

    目录 写在前面 系列文章 表达式树解析 表达式树特性 编译表达树 总结 写在前面 让我们首先简单回顾一下上篇文章介绍的内容,上篇文章介绍了表达式树的基本概念(表达式树又称为“表达式目录树”,以数据形式 ...

  9. Bootstrap3.0学习第八轮(工具Class)

    详情请查看http://aehyok.com/Blog/Detail/14.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...

  10. AJAX(二)AJAX框架

    上文(AJAX(一)AJAX的简介和基础)对ajax异步请求服务器做了详细的介绍和基础应用,可以看出,ajax的一些过程是相对不变的.不必要每次发送请求都写一遍发送代码,一些ajax开发人员已经把他们 ...