今天搞懂了on where 和 on and的区别,mark一下。其实本质上还是对and和where的本质要了解:and只是一个连接词,where是从句开头。
SELECT *
FROM table_a a LEFT JOIN table_b b
on a.id = b.id
where a.name = 'Lucy'
SELECT *
FROM table_a a LEFT JOIN table_b b
on a.id = b.id
and a.name = 'Lucy'
在上面两个代码中,第一个代码是指,a左连接b之后,where对整张表进行筛选,条件为a.name = 'Lucy',最后select出这张子表的所有数据。
第二个代码是说,a左连接b,条件是a.id = b.id且a.name = 'Lucy',最后select出全部数据。所以总体来说就是先对a进行筛选,再合并。
——————————————————————————————————————————
有这个问题的原因是今天看coursera的课程,然后在error correction那里这道题看不懂,所以和同学讨论了一下区别。

(图片来源cousera)
这道题目的背景是,想要知道profile界面被浏览过的用户比例。
events表中记录了event,比如被他人浏览界面(view_user_profile)以及进行该活动的时间(event_time);user表中记录了user的id。解这道题的思路就是,先筛选出events表中被他人浏览界面的活动(event_name = 'view_user_profile'),然后与users表合并,此时有些user没有被浏览界面的话,event_name那里会显示NULL;而被浏览过的就会显示view_user_profile。
这个时候问题就变成,我们怎么将这个event_name为null和不为null的情况分开统计呢?因为不能用event_name,所以需要用b表中其他的变量来看空还是非空(毕竟event_name不满足条件的话整个数据都会是null),这里就用event_time来识别,用min函数的原因是用了group by,需要做聚合运算。
图中是要改正的源代码,这个跑出来的结果只有True;把where改成and就有True有False,是正确答案,原因可以看最上面的两个代码
本文介绍了SQL中on where和on and在连接查询时的区别,强调and仅作为连接词,where用于从句筛选。通过案例分析了在左连接中,where筛选整表,而on则在连接时指定条件。问题源于Coursera课程中的错误修正题目,涉及如何统计profile界面被浏览用户的比例,利用event_time和min函数识别并区分event_name的null和非null情况。
817

被折叠的 条评论
为什么被折叠?



