题解 | #统计复旦用户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 子句中的区别:
- 放在 LEFT JOIN ... ON 子句中:当 AND MONTH(q.date) = 8 作为 LEFT JOIN 条件的一部分时,它在执行联结操作时用于确定哪些行应该被包括在结果集中。这意味着只有当 question_practice_detail 表中的 date 字段的月份为 8 时,相应的行才会与 user_profile 表中的行联结。
- 放在 WHERE 子句中:如果 AND MONTH(q.date) = 8 放在 WHERE 子句中,它将在联结操作完成后,对结果集进一步过滤。这意味着无论 LEFT JOIN 产生了哪些行,只有那些 date 字段的月份为 8 的行才会被保留在最终结果集中。
在大多数情况下,将条件放在 JOIN 条件中还是 WHERE 子句中,结果可能相同,但逻辑上存在细微差别。在某些情况下,这可能会影响查询的效率,尤其是在处理大量数据时。如果 JOIN 条件可以过滤掉大量不符合条件的行,这可能会减少需要进一步处理的数据量,从而提高查询效率。
最佳实践通常是将与联结逻辑直接相关的条件放在 JOIN 子句中,将与过滤结果集相关的条件放在 WHERE 子句中。这样可以提高查询的可读性和可能的性能。
