首页
学习
活动
专区
圈层
工具
发布

SQL语法—left join on 多条件

.* from a left join b on a1=b1 and a2=b2 and a3=b3 和楼上那个相比,楼上是在联接的时候就过滤了,我的是联接后过滤,两个结果是不一样的 select...a.*, b.* from a left join b on a1=b1 where a2=b2 and a3=b3 在使用left jion时,on和where条件的区别如下: 1、 on条件是在生成临时表时使用的条件...这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉 ---- 重点 先匹配,再筛选where条件。 本文将通过几个例子说明两者的差别。...SELECT a.* FROM product a LEFT JOIN product_details b ON a.id=b.id AND b.weight!...注: 如果你使用 LEFT JOIN 来寻找在一些表中不存在的记录,你需要做下面的测试:WHERE 部分的 col_name IS NULL,MYSQL 在查询到一条匹配 LEFT JOIN 条件后将停止搜索更多行

39.8K72
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    left join-on-and 与 left join-on-where 和 inner join on 加条件和where加条件的区别

    摘要 关于这两种写法的重要知识点摘要如下: left-join 时,即使有相同的查询条件,二者的查询结果集也不同,原因是优先级导致的,on 的优先级比 where 高 on-and 是进行韦恩运算连接生成临时表时使用的条件...在left join下,两者的区别: on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (tb_user) 的行。...where则是在生成临时表之后使用的条件,此时已经不管是否使用了left join了,只要条件不为真的行,全部过滤掉。 在多表查询时,on 比 where 更早起作用。...的 写法 left-join-on-and 在连表查询过程中先根据 on-and 条件过滤右表(即 tb_score 表),再执行 join 操作生成临时表,然后对临时表执行 where 条件,因此,on-and...写法会先对右表同时做2个条件的过滤 写法 left-join-on-where 在连表查询过程中先根据 on 条件过滤右表,再执行 join 操作生成临时表,然后对临时表执行 where 条件, 因此

    4.6K30

    mysql 如何优化left join

    h.hotel_id is null     这个sql是用来查询出c表中有h表中无的记录,所以想到了用left join的特性(返回左边全部记录,右表不满足匹配条件的记录对应行返回null)来满足需求...如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复,基本上MySQL采用的是最容易理解的算法来实现join。...一般情况下参与联合查询的两张表都会一大一小,如果是join,在没有其他过滤条件的情况下MySQL会选择小表作为驱动表,但是left join一般用作大表去join小表,而left join本身的特性决定了...另外,我今天还明白了一个关于left join 的通用法则,即:如果where条件中含有右表的非空条件(除开is null),则left join语句等同于join语句,可直接改写成join语句。 ...那么如何优化left join:  1、条件中尽量能够过滤一些行将驱动表变得小一点,用小表去驱动大表  2、右表的条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上

    12K41

    MySQL 案例:left join 与 BUG

    ; 在腾讯云 CDB 上的执行结果: mysql> select * from stu t1 left join(select id,sname as sname_t1,1 as cname from...明确这个 bug 的情况之后,解决问题的方法自然也明确了:where 条件中不要使用这个被定义为常量的 cname 就行,比如: select * from stu t1 left join(select...执行优化器把这个 left join 改写成了 join: mysql> explain select * from stu t1 left join(select id,sname as sname_t1,1...的空值拒绝优化策略有一定的关系,简单来说,如果 where 条件中出现了 is not null 或者是效果等同的条件,那么 MySQL 可以把外连接改写成内连接,此处引用官方文档的说明: Instead...后续有机会在详细解析这个优化策略,从结果上来看,替换掉 where 条件的内容之后,查询结果就恢复正常了: mysql> select * from stu t1 left join(select id

    2.5K176

    MySQL之LEFT JOIN问题汇总

    使用ON和WHRERE对表数据过滤 背景 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论、一条评论有多少个赞等等。...答案是两个需求都是第一条语句是正确的,要搞清楚这个问题,就得明白mysql对于left join的执行原理,下节进行展开。...原理 mysql 对于left join的采用类似嵌套循环的方式来进行从处理,以下面的语句为例: SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2...从这个伪代码中,我们可以看出两点:1、右表限制用ON如果想对右表进行限制,则一定要在on条件中进行,若在where中进行则可能导致数据缺失,导致左表在右表中无匹配行的行在最终结果中不出现,违背了我们对left...num一班 4二班 0三班 0四班 0需求2由于在on条件中对左表限制,导致数据多余(其他班的结果也出来了,还是错的) 通过上面的问题现象和分析,可以得出了结论:在left join语句中,左表过滤必须放

    1.4K20

    MySQL:Left Join 避坑指南

    链接 | segmentfault.com/a/1190000020458807 现象 left join在我们使用mysql查询的过程中可谓非常常见,比如博客里一篇文章有多少条评论、商城里一个货物有多少评论...答案是两个需求都是第一条语句是正确的,要搞清楚这个问题,就得明白mysql对于left join的执行原理,下节进行展开。...根源 mysql 对于left join的采用类似嵌套循环的方式来进行从处理,以下面的语句为例: SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2...从这个伪代码中,我们可以看出两点: 如果想对右表进行限制,则一定要在on条件中进行,若在where中进行则可能导致数据缺失,导致左表在右表中无匹配行的行在最终结果中不出现,违背了我们对left join...:在left join语句中,左表过滤必须放where条件中,右表过滤必须放on条件中,这样结果才能不多不少,刚刚好。

    1.6K20

    LEFT JOIN条件在on后面和在where后面的区别

    LEFT JOIN条件在ON后面和在WHERE后面的区别 Persion表 截屏2023-05-26 21.53.03.png City表 截屏2023-05-26 21.53.20.png 简单的...LEFT JOIN SELECT * FROM Person p LEFT JOIN City c ON p.City = c.City 执行结果 截屏2023-05-26 21.55.51.png...我们加上AND条件试试 SELECT * FROM Person p LEFT JOIN City c ON p.City = c.City AND c.City = '北京' 截屏2023-05...2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。...结论 1、LEFT JOIN 今天ON条件过滤时候,只会对右表数据条件过滤,对左表数据没有任何影响 2、WHERE 条件是对结果表进行过滤,所以会对左表数据产生影响 3、INNER JOIN ON

    91220

    数据库系列 | left join加上where条件咋了?

    1SQL语句:left join后面加上where条件 数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户 2SQL LEFT JOIN 关键字 LEFT...3LEFT JOIN 关键字语法 SELECT column_name(s) FROM table_name1 LEFT JOIN table_name2 ON table_name1.column_name...=table_name2.column_name **注释:**在某些数据库中, LEFT JOIN 称为 LEFT OUTER JOIN。..., sql_person.city, sql_order.order_no, sql_order.status FROM sql_person LEFT JOIN sql_order ON...where条件是在临时表生成好后,再对临时表进行过滤的条件 where 条件加上,已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉 过滤条件放在 where后面: 是先连接然生成临时查询结果

    2.2K10

    MySQL之LEFT JOIN中使用ON和WHRERE对表数据

    原文链接:https://segmentfault.com/a/1190000020458807 背景 left join在我们使用mysql查询的过程中可谓非常常见...SELECT c.name, count(s.name) as numFROM classes c left join students son s.class_id = c.idand s.gender...答案是两个需求都是第一条语句是正确的,要搞清楚这个问题,就得明白mysql对于left join的执行原理,下节进行展开。...原理 mysql 对于left join的采用类似嵌套循环的方式来进行从处理,以下面的语句为例: SELECT * FROM LT LEFT JOIN RT ON P1(LT,RT)) WHERE P2...,还是错的) 通过上面的问题现象和分析,可以得出了结论:在left join语句中,左表过滤必须放where条件中,右表过滤必须放on条件中 SQL 看似简单,其实也有很多细节原理在里面,一个小小的混淆就会造成结果与预期不符

    1.2K30

    Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢

    解决 通过对table c中的连接字段content_id和user_no分别加上了索引, 加上索引后的执行计划如下  总结 需要注意:参与join的表,需要在连接条件上建索引。...知识延伸 MySQL使用嵌套循环算法或其变种来进行表之间的连接。 在5.5版本之前,MySQL只支持一种表间关联方式,也就是嵌套循环(Nested Loop)。...如果关联的表数据量很大,那么join关联的时间会很长。在5.5版本以后,MySQL引入了BNL算法来优化嵌套循环。...for(row_n in table_n){ if(row_1,row_2...row_n都满足join条件){ 把row_1,row...于是,mysql5.5对这个算法进行了优化,新增了Index Nested-loop Join,Block Nested-loop Join。

    3.7K10
    领券