首页 > 其他分享 >join的on和where的区别

join的on和where的区别

时间:2022-12-02 19:24:14浏览次数:34  
标签:join 区别 cpd cf where id condition

select * from a left join b on a.xx=b.xx and condition1 where condition2;

1.先进行on然后进行where

 

2.on是join的条件,取a和b两张表的数据组合成中间表c,on是对a和b进行过滤

where是对中间表c进行过滤。

 

3.同一个condition放在on和where中是否有性能差距?

一般来说,能先过滤数据就先过滤数据,那么放在on中性能更好一点。不过

需要你实际explain,不过非特殊情况(1.非逻辑特殊,即condition摆放在on和where会导致结果不同 2.非业务特殊,需要特别进行查询优化),一般把非on a.xx=b.xx的condition放在where后面就好了。给SQL服务一点信心,相信它能够自己优化查询,它能在不影响结果的情况下尽早进行condition的过滤。

 

4.不考虑性能,我任意一个查询都能把除了a.xx=b.xx的其他condition都放在where后面吗?

不行,有些condition放在on和where会导致结果不一致。

回到第二点,on除了join两张表,它的condition是对a和b进行数据过滤,而where是对c进行过滤。

只要不是对同一个东西进行判断,那么就一定存在数据前后不相等的情况。即使a join b相当于c,但是,不是同一个对象就不是同一个对象。

看这个sql

SELECT count(*) FROM c_fact cf LEFT JOIN c_processing_detail cpd on cf.id = cpd.fact_id  AND cpd.domain_id ='TB'
WHERE  cf.domain_id ='TB' 
AND cf.is_latest  
AND cpd.id IS NULL ;

SELECT count(*) FROM c_fact cf LEFT JOIN c_processing_detail cpd on cf.id = cpd.fact_id
WHERE  cf.domain_id ='TB' 
AND cf.is_latest  
AND cpd.id IS NULL 
AND cpd.domain_id ='TB';

这里就有很大的区别。第一个sql是有数据的,第二个sql是没有数据的。

我on的时候过滤b表的数据来和你进行连接,连接结束之后对c进行cpd.id的判断。

我on的时候不进行数据过滤,on之后同时判断cpd.id is null && cpd.domain_id='TB', 一个数据id都为null了,其他列还能有数据?

所以,不要把冲突的condition全部放在where中。

 

5.最重要的一点

on 和 where最大的区别在于,如果你的join a.xx=b.xx不是一对一的,那么原本的a表100条件数据,b表的100条件数据,join后的c表数据不一定是小于100条的(完全一对一的join,任何join都是<=max(a.size, b.size)).

这样一来,如果你的on condition过滤了非一对一的数据,结果就肯定相差很大。

标签:join,区别,cpd,cf,where,id,condition
From: https://www.cnblogs.com/woyujiezhen/p/16945396.html

相关文章

  • ~/.bashrc和/etc/profile的区别,如何将conda加进环境变量
    使用su-会执行etc/profile,而不会执行~/.bashrc.直接终端登录,会执行~/.bashrc。如何解决conda安装了,却找不到的现象Forbashuse:$cdYOUR_PATH_ANACONDA/bin$./......
  • join查询的结果和in查询结果不一致
    SELECTcount(*)FROMc_factcfLEFTJOINc_processing_detailcpdoncf.id=cpd.fact_idWHEREcpd.domain_id='TB'ANDcf.domain_id='TB'ANDcf.is_latest......
  • WeakHashMap 和 HashMap 的区别是什么,何时使用?
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。前言大家好,我是小彭。在之前的文章里,我们聊到了Java标准库中HashMap与LinkedHashMap的......
  • 子查询优化之 Semi-join 优化 | StoneDB 研发分享 #2
    缘起StoneDB在列式存储引擎Tianmu的加持下,在大多数场景下相对MySQL都会有大幅性能提升。当然,这是需要工程师不断优化代码才能做到的,而且,性能好也需要通过基准测试才......
  • 公募与私募的区别
    公募和私募的主区别在于以下三点:1、募集方式不同。公募是通过公开发售来募集资金,而私募是通过非公开发售来募集资金的;2、募集对象及门槛不同。公募募集对象为广大社会......
  • 前端和后端字符串比较的区别
    1,javaSriptvarstr1="123";varstr2="123";console.log(str1==str2);//trueconsole.log(str1===str2);//true这个没什么要说的js里面引入了严格执......
  • 行式存储和列式存储的区别
    1.什么是行式存储和列式存储?2.行式存储分析?缺点:--行式在读取数据的时候,所查询的目标只涉及少数几项属性,但由于这些目标数据埋藏在各行数据单元中,而行单元又特别大,......
  • InputStream和OutputStream的区别和转换
    InputStream和OutputStream都是流,里面都能存储数据流(字节流或字符流)都代表内存数据,而且都是通过构造方法里传一个参数(比如File对象);它们的区别是:InputStream是将外部数据(......
  • annotate和aggregate的区别
    一.基本区别aggregate:返回使用聚合函数后的字段和值。annotate:在原来模型字段的基础之上添加一个使用了聚合函数的字段二.使用方法classBook(models.Model):......
  • 重要:QA和QC的区别
    来自《术以载道》这本书的不错的论述:质量保证(QA)与质量控制(QC)是经常混淆的两个概念,这两个概念如果不能清晰地辨别,就会涉及公司内关于质量保证活动的职责分配问题,以及质量保......