SQL 子查询和链接查询

1.题目:现在运营想要查看所有来自浙江大学的用户题目回答明细情况,请你取出相应数据

question_practice_detail  答题详情表

 user_profile   用户表

 期望结果:

 链表查询: 将question_practice_detail作为基础表,进行user_profile左连接,将用户表的university字段设置为浙江大学。

select
    qpd.device_id,
    qpd.question_id,
    qpd.result
from
    question_practice_detail as qpd
    left join user_profile as up on qpd.device_id = up.device_id
where
    up.university = '浙江大学'

子查询

select
    qpd.device_id,
    qpd.question_id,
    qpd.result
from
    question_practice_detail as qpd
where
    device_id in(
        select
            device_id
        from
            user_profile
        where university='浙江大学'
    )

首先在user_profile中查找到university中为浙江大学的device_id,然后查question_practice_detail表中where条件查询中 in 查找到的device_id的结果。

2.统计每个学校的答过题的用户的平均答题数

user_profile  用户表

 question_practice_detail  答题详情表

 期望结果:

 分析:每个学校的答题平均结果,那么就是每个学校的答题总数,除以每个学校的答题用户数,由于答题用户数可以用专门的device_id来标识,因为要统计总数,所以需要使用count函数。

由于要统计的是每个学校,所以需要使用group by来分组,结果需要保留4位小数,所以需要使用round函数。

将答题情况表和用户表连接:

 select * from  question_practice_detail left join  user_profile on question_practice_detail.device_id = user_profile.device_id;

 select university, count(question_id) from  question_practice_detail left join  user_profile on question_practice_detail.device_id = user_profile.device_id group by university;

 统计每个学校的答题总数:

 最终结果

select
    university,
    count(question_id) / count(distinct question_practice_detail.device_id) as avg_answer_cnt
from
    question_practice_detail
    left join user_profile on question_practice_detail.device_id = user_profile.device_id
group by
    university;

 3.统计每个学校各难度的用户平均刷题数

user_profile  用户表

question_practice_detail   答题详情表

 question_detail  题目难度等级表

 分析:由于是三张表 用户表 用户答题表 题目难度等级表,由于题目要求各难度各学校用户的等级,所以需要将三张表连起来查询,并且使用group by 学校 难度等级分组,由于是答过题的平均数,所以需要使用count统计

首先将三张表连接

 select * from question_practice_detail left join  user_profile on question_practice_detail.device_id = user_profile.device_id left join question_detail on question_practice_detail.question_id = question_detail.question_id;

 结果:

select
    university,
    difficult_level,
    round(
        count(qpd.question_id) / count(distinct qpd.device_id),
        4
    ) as avg_answer_cnt
from
    question_practice_detail as qpd
    left join user_profile as up on qpd.device_id = up.device_id
    left join question_detail as qd on qpd.question_id = qd.question_id
group by
    university,
    difficult_level;

猜你喜欢

转载自blog.csdn.net/weixiwo/article/details/130042650
今日推荐