一道SQL查询引出where和on的区别

一道SQL查询引出where和on的区别

题目是 牛客网的 SQL34 统计复旦用户8月练题情况
我第一次用的是这样的SQL语句

select
up.device_id,
up.university,
count(qpd.question_id),
sum(if(qpd.result='right',1, 0))
from user_profile as up left join question_practice_detail as qpd on
up.device_id=qpd.device_id
where up.university='复旦大学' and
qpd.date>='2021-08-01' and qpd.date<='2021-08-31'
group by up.device_id;

结果是

3214 复旦大学 3 0

正确答案是

3214 复旦大学 3 0
4321 复旦大学 0 0

这是因为

  • on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。

  • where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录),条件不为真的就全部过滤掉。

当我们在where后面加上条件 qpd.date>=’2021-08-01′ and qpd.date<=’2021-08-31’,由于device_id=4321的用户没有做题,这样的用户就被过滤掉,不合符题目要求“对于在8月份没有练习过的用户,答题数结果返回0”,所以结果就会少一行。
正确的SQL语句是

select
up.device_id,
up.university,
count(qpd.question_id),
sum(if(qpd.result='right',1, 0))
from user_profile as up left join question_practice_detail as qpd on
up.device_id=qpd.device_id
and qpd.date>='2021-08-01' and qpd.date<='2021-08-31'
where up.university='复旦大学'
group by up.device_id;

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注