join on、where、having

前言

本文分享一下个人对join的理解和使用经验,以及由此引发的on、where、having的区别。


join

使用场景:当我们要查询一些数据,这些列数据有一些列来源于A表,一些列来源于B表,A表和B表之间有关联关系,这时就要用到join关键字了。LEFT JOIN返回左表的全部行和右表满足ON条件的行,怎么理解这句话?目的是要从左表(A)中查一部分列,从右表(B)查询一些列,A.列肯定都能取到值,当on条件成立时,B.列能取到值,反之B.列取到的是null。其他join原理相同;

使用前的准备:在写sql前应分析清楚要查询数据的维度和哪张表的维度一致,应该将这张表作为主表,不考虑条件过滤,这样查询出来的数据条数就应该和主表的数据条数一致。另外就是需要弄清楚各个表之间的对应关系,是一对一、一对多、多对一、多对多?以此来考虑怎么取数,取数逻辑对不对。

on、where、having

最常见做易懂的是where,那我们就以where为标杆对比一下on、having与where的区别

on、where:所有的查询都会产生一个中间临时表,查询结果就是从临时表中得到的。on和where后面所跟限制条件的区别,主要与限制条件起作用的时机有关,on根据限制条件对数据库记录进行过滤,然后产生临时表;而where是在临时表产生之后,根据限制条件从临时表中筛选结果。

having、where:having和where的区别也是与限制条件起作用时机有关,having是在聚集函数计算结果出来之后筛选结果,查询结果只返回符合条件的分组,having不能单独出现,只能出现在group by子句中。而where是在计算之前筛选结果,如果聚集函数使用where,那么聚集函数只计算满足where子句限制条件的数据。

总结:因为on限制条件发生时间较早,产生的临时报表数据集要小,因此on的性能要优于where;where在聚集函数之前筛选数据,having在计算之后筛选分组,因此where的性能要优于having。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值