众所周知,左连接和右连接的含义是以哪一张表为准。

  左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中B表部分的内容就全是NULL。

  

  

  现在有两个表,一个category表和goods表:

mysql> select * from category;
+----+---------+
| id | cate |
+----+---------+
| 1 | food |
| 2 | clothes |
| 3 | book |
| 4 | sport |
| 5 | music |
| 6 | video |
+----+---------+
6 rows in set (0.01 sec) mysql> select * from goods;
+----+---------+-------------------+
| id | cate_id | name |
+----+---------+-------------------+
| 0 | 5 | You Are Not Alone |
| 1 | 2 | T-shirt |
| 2 | 1 | water |
| 3 | 1 | rice |
| 4 | 3 | C++ primer |
| 5 | 4 | basketbal |
+----+---------+-------------------+
6 rows in set (0.00 sec)

  

  现在要查出每一种分类下的商品,那么可以很简单的使用左连接了:

mysql> select * from category
-> left join goods
-> on category.id = goods.cate_id
-> order by category.id;
+----+---------+------+---------+-------------------+
| id | cate | id | cate_id | name |
+----+---------+------+---------+-------------------+
| 1 | food | 2 | 1 | water |
| 1 | food | 3 | 1 | rice |
| 2 | clothes | 1 | 2 | T-shirt |
| 3 | book | 4 | 3 | C++ primer |
| 4 | sport | 5 | 4 | basketbal |
| 5 | music | 0 | 5 | You Are Not Alone |
| 6 | video | NULL | NULL | NULL |
+----+---------+------+---------+-------------------+
7 rows in set (0.01 sec)

  从上面的结果中很全就能看到video分类中没有商品。

  需求:只查询哪一种分类下面没有商品

  这个很好实现,可以用下面几个方法:

  1、使用not in

mysql> select * from category where id not in ( select cate_id from goods);
+----+-------+
| id | cate |
+----+-------+
| 6 | video |
+----+-------+
1 row in set (0.01 sec)

  2、仍旧使用左连接,只不过对于结果加一个where筛选

mysql> select * from category
-> left join goods
-> on category.id = goods.cate_id
-> where goods.id is NULL;
+----+-------+------+---------+------+
| id | cate | id | cate_id | name |
+----+-------+------+---------+------+
| 6 | video | NULL | NULL | NULL |
+----+-------+------+---------+------+
1 row in set (0.00 sec)

  

  至于为什么不适用not in,这是因为他不使用索引,如果数据量大的时候,效率并不高。

  同样,如果要显示和总表中匹配了记录,隐藏左表没有匹配到的记录,可以将后面的where goods.id is not NULL;

  同样,对于右连接来说也是一样的。

MySQL 使用左连接替换not in的更多相关文章

  1. 深入浅出:MySQL的左连接、右连接、等值连接

    深入浅出:MySQL的左连接.右连接.等值连接 三种连接的语法 为便于更多的技友快速读懂.理解,我们只讨论2张表对象进行连接操作的情况,大于2张表对象进行的连接操作原理也是一样的. 1.左连接(LEF ...

  2. 深入浅出:MySQL的左连接、右连接、内连接

    http://blog.csdn.net/wyzxg/article/details/7276979 三种连接的语法 为便于更多的技友快速读懂.理解,我们只讨论2张表对象进行连接操作的情况,大于2张表 ...

  3. MySQL的左连接、右连接和全连接的实现

    表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...

  4. MySQL之左连接与右连接

    左连接: select 列1,列2,列N from tableA left join tableB on tableA.列 = tableB.列(正常是一个外键列) [此处表连接成一张大表,完全当成一 ...

  5. Mysql之左连接右连接内连接——示例 (转)

    下面是两张表 表stu 表tech 1.右连接 当使用右连接语句查询时,返回结果如下: 1 SELECT stu.id,stu.name,stu.classe_name,tech.id,tech.na ...

  6. 【数据库】MySQL的左连接、右连接和全连接的实现

    表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...

  7. mysql之左连接、右连接、内连接、全连接、等值连接、交叉连接等

    mysql中的各种jion的记录,以备用时查 1.等值连接和内连接, a.内连接与等值连接效果是相同的,执行效率也相同,只是书写方式不一样,内连接是由SQL 1999规则定的书写方式 比如: sele ...

  8. MySql之左连接,右连接

    左连接,右连接查询的表 中 on后面的条件不会影响主表的数据,只会影响右表的数据. 例: 没加条件的时候 左表加条件: 右表加条件: 通过上面3处对比可以看出来,用LEFT JOIN 的时候不管对左表 ...

  9. MYSQL 表左连接 ON AND 和ON WHERE 的区别

    首先是针对左右连接,这里与inner join区分 在使用left join时,on and 和on where会有区别 1. on的条件是在连接生成临时表时使用的条件,以左表为基准 ,不管on中的条 ...

随机推荐

  1. 简述KVM架构和Xen架构

    暑假最后一篇更新,因为,,,明天我就回学校了. 以下均为个人理解,如果有不对的地方还望各位dalao不吝赐教. 虚拟化 虚拟化是通过Hypervisor程序实现的,Hypervisor的作用是将硬件虚 ...

  2. 小程序request封装

    我们知道,一个项目开发时,有许多环境,如:开发环境,测试环境,预生产环境,生成环境,若项目上线时要每个接口的域名改一遍,这是效率很低的做法.另外,许多接口都有前缀,例如 /api/  /wxapi/  ...

  3. OAuth2基本概念和运作流程

    OAuth(开放授权)是一个关于授权的开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.目前的版本是2.0版,本文 ...

  4. 【适合N卡独显电脑的环境配置】Tensorflow教程-Windows 10下安装tensorflow 1.5.0 GPU with Anaconda

    注意: 1.目前Anaconda 更新原命令activate tensorflow 改为 conda activate tensorflow 2. 目前windows with anaconda 可以 ...

  5. filter 实现登录状态控制

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 网站需要做用户登录鉴权控制,没有登录的话,不能访问网站,提示需要登录. 实现方式: 使 ...

  6. 004_centos安装pip的几种方式及pip源

    一. (1) yum -y install epel-release yum install python-pip pip install --upgrade pip (2) python脚本的一键安 ...

  7. camke使用例程

    1 同文件夹直接编译 1 同文件夹直接编译 # cmake needs this line cmake_minimum_required(VERSION 2.8) # Define project n ...

  8. Flask 框架 debug=Ture 和Json解码:

    Flask框架常用配置文件: 以下推荐四种方法: (一):创建一个配置类. (二):正常代码配置文件. 接下下来两种方法需要新建文件: 步骤为: 1:在当前目录下新建一个文件,名字为:config.i ...

  9. c++面经积累<1>

    引用和指针 指针是一个实体,需要分配内存空间,而引用只是一个别名,不需要分配内存空间 指针可以有多级,而引用只能有一级. 指针和引用的自增运算不一样,指针是指向下一个空间,而引用是引用的变量值增加 s ...

  10. Mybatis学习总结(九)——查询缓存

    一.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能.mybaits提供一级缓存和二级缓存. 1.一级缓存是sqlSession级别的缓存.在操作数据库时需要构造sqlSe ...