分析:
1、输出结果用到了两张表的内容,先考虑联结;
2、两张表的关系通过共有的字段device_id产生,因此这俩字段相等是联结条件(ON子句);
3、由于不考虑没有答过题的学生,所以使用内联结(INNER JOIN),会自动过滤没答过题的;
4、根据要求按大学分组(GROUP BY);
5、计算用户平均答题数量,即 答题总数/用户数 ,不同用户可以答相同题目,所以答题总数直接算总数就行,但是一个用户答好几题也只算一个用户,所以算device_id要加DISTINCT;
6、根据大学对结果排序(ORDER BY)。
代码如下:
SELECT university, COUNT(question_id)/COUNT(DISTINCT up.device_id) AS avg_answer_cnt
FROM user_profile AS up
    INNER JOIN
        question_practice_detail AS qpd
    ON 
        up.device_id=qpd.device_id
GROUP BY university
ORDER BY university;
补充(内联结过程):
对于两张表A和B,内联结就是先从表A拿一条记录,然后对表B的每一条记录,判断是否满足连接条件(ON子句),如果满足,则表A记录和该表B记录水平连接,作为联结表的一条记录;如果不满足就跳过。通过这两重循环就创建了联结表。
此外,对于表A有但是表B没有的字段值,内联结认为不满足条件,会直接跳过,所以上述题目会自动过滤没答过题的用户。
如果要在结果中包含仅一个表有的字段值,就是外联结的事了。