如何关联另一张表统计对应State的出现次数?SQL查询疑问
统计学生对应State出现次数的问题解决
原语句的问题解析
- 你写的语句本质是做内连接(
FROM student, school WHERE ...和INNER JOIN逻辑一致),只保留两张表中school_code匹配的记录,再按State分组计数。 - 结果远低于预期的核心原因:内连接会过滤掉student表中那些school_code在school表中找不到匹配的学生,这部分学生完全没被纳入统计。
- 另外排序默认是升序,要实现“从多到少”的需求,必须在
ORDER BY后加DESC。
正确的SQL写法
场景1:统计所有学生(含学校信息缺失的学生)
如果要把那些没有对应学校信息的学生也统计进来(这部分State会显示为NULL),用左连接:
SELECT school.state, COUNT(student.id) AS student_count FROM student LEFT JOIN school ON student.school_code = school.school_code GROUP BY school.state ORDER BY student_count DESC;
这里用COUNT(student.id)而不是COUNT(school.state),是因为左连接后无匹配的学生对应的school.state为NULL,COUNT(school.state)会忽略这些记录,而COUNT(student.id)能准确统计所有学生数。
场景2:只统计有对应学校信息的学生
如果只需要统计那些能匹配到学校的学生,用内连接但调整计数逻辑:
SELECT school.state, COUNT(student.id) AS student_count FROM student INNER JOIN school ON student.school_code = school.school_code GROUP BY school.state ORDER BY student_count DESC;
你的疑问解答
- 不管是内连接还是左连接,都是先将两张表按关联条件生成临时的连接表,再对这个临时表分组统计。
- 原语句里的
COUNT(school.state),是统计分组内school.state非空的记录数,但因为内连接过滤了无匹配的学生,再加上如果有school.state为空的学校(虽然概率低),都会导致计数比实际学生数少;而COUNT(student.id)是直接统计每个State对应的学生记录数,更准确。
内容的提问来源于stack exchange,提问作者user20942123
相关产品推荐
相关产品推荐

