MySQL中left join on后面的条件和where后面的条件的区别

做项目的时候,遇到的大坑!所以在此记录一下。

大概的sql如下:

select * from `goods` g LEFT JOIN `goods_rel` grl on g.id = grl.case_id LEFT JOIN `user` ur on grl.user_id = ur.id where g.id = 100 and ur.status=0;

  这一段sql的意思大概就是:三张表关联,然后同时user表的status=0,这张表搜出来后,数据显示为空,需要注意g.id=100的这个goods,他的扩展信息表goods_rel里的user_id是null;

select * from `goods` g LEFT JOIN `goods_rel` grl on g.id = grl.case_id LEFT JOIN `user` ur on grl.user_id = ur.id and ur.status=0 where g.id = 100;

  换了一段sql后,发现数据显示出来了:

1.在on后面加条件仅适合用于left join (right join未测,inner join与where类似)
2.不考虑where条件下,left join 会把左表所有数据查询出来,on及其后面的条件仅仅会影响右表的数据(符合就显示,不符合全部为null,on后面紧跟着的是关联语句,后面的and条件只能管到右表!)
3.where后面加条件与左连接本身无关,影响的是连接产生后的数据(上面的例子很好解释,ur.status=0影响的是连接之后产生的数据,因为id=100的这个goods没有userId,所以也就是不满足ur.status=0,被过滤了)
4.所以左连接关注的是左边的主表数据,不应该把on后面的从表中的条件加到where后,这样会影响原有主表中的数据(这里的ur.status=0应该放在on后面,因为这样的话只会影响到右表数据,到那时如果放在where后面相当于影响了三表关联后的中间表!!导致显示为空)

原文地址:https://www.cnblogs.com/Booker808-java/p/12207303.html

时间: 2024-11-13 08:15:25

MySQL中left join on后面的条件和where后面的条件的区别的相关文章

mysql中left join ,right join 以及inner join 比较

下面是例子分析表A记录如下: aID        aNum 1           a20050111 2           a20050112 3           a20050113 4           a20050114 5           a20050115 表B记录如下: bID        bName 1            2006032401 2           2006032402 3           2006032403 4           20

mysql中left join中的on条件 和 where条件区别

需要知道sql中关键字的执行顺序. FROM-> ON->JOIN-> WHERE->GROUP BY-> HAVING->SELECT-> DISTINCT->ORDER BY->LIMIT on在join前边.join在where前边.知道这两点,那就好说了. 注意join中的on是对关联表起作用,不是对主表. 如果想过滤主表中的数据,要用where. 具体案例可以参照:http://xianglp.iteye.com/blog/868957

Mysql中Left Join 与Right Join 与 Inner Join 与 Full Join的区别

看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果. 在数据库中新建两张表,并插入要测试的数据. 新建表: [sql] view plain copy USE [Test] GO /****** 对象:  Table [dbo].[EMP]    脚本日期: 06/22/2012 15:37:28 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE T

面试|简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针. 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速度. 普通索引允许被索引的数据列包含重复的值.如果能确定某个数据列将只包含彼 此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它 定义为一个唯一索引. 也就是说,唯一索引可以保证数据记录的唯一性. 主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于

SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

原文:SQL Server 与MySQL中排序规则与字符集相关知识的一点总结 字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的基础上特定的字符排序方式,排序规则是基于字符集的,是对字符集在排序方式维度上的一个划分.排序规则是依赖于字符集的,一种字符集可以有多种排序规则,但是一种排序规则只能基于某一种字符集的比如中文字符集,也即汉字,可以按照“拼音排序”.“

MySql 中Join操作的用法

SQL标准中的Join的类型: 首先,设置表employees和department的数据为: 1.inner join - on操作类型 内连接inner join是基于连接谓词将两张表(如A和B)的列组合在一起的,产生新的结果表. 例子: SELECT * FROM employees a inner join department b ON a.department_id = b.department_id 查询结果为: 注意:inner join 可以简写为join,该查询得出的结果为两

MySQL关联left join 条件on与where不同,很实用,但要慎用

在mysql查询中,有时候业务复杂了,不得不写多表查询:很多程序猿前期都喜欢写子查询,因为子查询简单易懂,不容易出问题,但子查询的效率毕竟不如关联查询:关联查询我觉得是把双刃剑,在不懂它的机制时,还是慎用,我碰到过以前的同事,因为关联查询没写好,把奖品(查询活动中奖信息)发错的,还好大奖不是汽车: 网上摘的例子,比较好理解 MySQL关联left join条件on和where条件的区别表的结构 `products` CREATE TABLE `products` ( `pid` int(3) N

MySQL的left join中on与where的区别

关于 “A LEFT JOIN B ON 条件表达式” 的一点提醒 ON 条件(“A LEFT JOIN B ON 条件表达式”中的ON)用来决定如何从 B 表中检索数据行,即使on中包含有A表中的列的限制条件,也不会过滤A的任何数据(A的数据只会通过where过滤). 如果 B 表中没有任何一行数据匹配 ON 的条件,将会额外生成一行所有列为 NULL 的数据 在匹配阶段 WHERE 子句的条件都不会被使用.仅在匹配阶段完成以后,WHERE 子句条件才会被使用.它将从匹配阶段产生的数据中检索过

MySql中join基础

在MySQL中,使用的最多就是join.理解他之后能对我们的业务代码有更深的概念.当然这里只是一个简单的入门,也只是个人理解,如有不正确的地方,也请见谅. 了解顺序 各种join的概念 对应关系 (Hive中)join的原理 一.各种join的概念 join的基本概念 join实际上就是数学中的求交集.当我们说集合A={1,2,3,4,5},集合B={2,3},两个集合的交集时,实际上是在求两个集合的共同元素,也就是集合A的元素=集合B的 元素的个数. 放到现实世界中,集合A和集合B就不再是一维