题解 | #统计复旦用户8月练题情况#

统计复旦用户8月练题情况

https://www.nowcoder.com/practice/53235096538a456b9220fce120c062b3

select
    up.device_id,
    up.university,
    count(qpd.question_id) as question_cnt,
    sum(case when qpd.result="right" then 1 else 0 end) as right_question_cnt
from user_profile up
left join question_practice_detail qpd on up.device_id=qpd.device_id and month(qpd.date)=8 
where university="复旦大学" 
group by up.device_id,up.university

在 SQL 查询中,JOIN ... ON 子句和 WHERE 子句都用于过滤数据,但它们的作用和过滤的时机有所不同。以下是 AND MONTH(q.date) = 8 放在 LEFT JOIN ... ON 子句中与放在 WHERE 子句中的区别:

  1. 放在 LEFT JOIN ... ON 子句中:当 AND MONTH(q.date) = 8 作为 LEFT JOIN 条件的一部分时,它在执行联结操作时用于确定哪些行应该被包括在结果集中。这意味着只有当 question_practice_detail 表中的 date 字段的月份为 8 时,相应的行才会与 user_profile 表中的行联结。
  2. 放在 WHERE 子句中:如果 AND MONTH(q.date) = 8 放在 WHERE 子句中,它将在联结操作完成后,对结果集进一步过滤。这意味着无论 LEFT JOIN 产生了哪些行,只有那些 date 字段的月份为 8 的行才会被保留在最终结果集中。

在大多数情况下,将条件放在 JOIN 条件中还是 WHERE 子句中,结果可能相同,但逻辑上存在细微差别。在某些情况下,这可能会影响查询的效率,尤其是在处理大量数据时。如果 JOIN 条件可以过滤掉大量不符合条件的行,这可能会减少需要进一步处理的数据量,从而提高查询效率。

最佳实践通常是将与联结逻辑直接相关的条件放在 JOIN 子句中,将与过滤结果集相关的条件放在 WHERE 子句中。这样可以提高查询的可读性和可能的性能。

全部评论

相关推荐

点赞 评论 收藏
分享
老板加个卤鸡蛋:HR看了以为来卧底来了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务