【DAY4|SQL自学打卡】多表查询

前言

欢迎来到我的学习篇章!

我使用的学习平台:牛客刷题网

推荐的原因:能够在线编程,非常方便,有题,还能判断对错,也能看到各路大神的解题思路

SLogan:利用有限的时间,撸起袖子加油干!

       学习界面:快来点击学习吧!
在这里插入图片描述

首先回顾一下上次涉及到的知识点:
1、求最大值
MAX(<列名>)
2、重命名
使用AS语法
3、计数函数
COUNT()
4、求平均值
AVG()
5、保留小数位数
ROUND(列名,保留位数)
6、分组
GROUP BY 通常和HAVING 子句一起使用
  
SLogan:利用有限的时间,撸起袖子加油干!

一、学习过程

1、子查询

在这里插入图片描述
【SQL21】浙江大学用户题目回答情况
在这里插入图片描述
在这里插入图片描述
解题思路:
先从第二张表里找到浙江大学的所有学生id列表where university=‘浙江大学’,再去第一张表筛选出id在这个列表的记录,用where in

代码如下:

SELECT device_id,question_id,result FROM question_practice_detail
WHERE device_id IN(
    SELECT device_id FROM user_profile
    WHERE university='浙江大学'
) 
ORDER BY question_id ASC;

结果:
在这里插入图片描述

2、链接查询

在这里插入图片描述

【SQL22】统计每个学校答过题的用户的平均答题数
在这里插入图片描述在这里插入图片描述
解题思路:
问题分解:
①每个学校:按学校分组,GROUP BY university
②平均答题数量:在每个学校的分组内,用总答题数量除以总人数即可得到平均答题数量COUNT(question_id) / COUNT(distinct device_id)
③表连接:学校和答题信息在不同的表,需要做连接
需要对两个表进行联结FROM …JOIN…ON…。

代码如下:

SELECT university,
ROUND(COUNT(question_id) / COUNT(distinct a.device_id),4) AS avg_answer_cnt
FROM question_practice_detail AS a
join user_profile AS b
on a.device_id=b.device_id
group by university

结果:
在这里插入图片描述

【SQL23】统计每个学校各难度的用户平均刷题数
在这里插入图片描述

解题思路:
这道题一共有三张表,这里题目表省略,大家可以去牛客网刷题的地方练练手看看,我们开始解题思路。
每个学校:按学校分组group by university
不同难度:按难度分组group by difficult_level
平均答题数:总答题数除以总人数count(B.question_id) / count(distinct B.device_id)
来自上面信息三个表,通过关系连接表与表中间关系字段。进行两次的内连接,或者左外连接。

代码如下:

SELECT
    university,
    difficult_level,
    ROUND(count(b.question_id) / count(distinct b.device_id), 4) AS avg_answer_cnt
FROM question_practice_detail AS b
 
left join user_profile AS a
on a.device_id=b.device_id
 
left join question_detail AS c
on c.question_id=b.question_id
 
GROUP BY university, difficult_level

结果:
在这里插入图片描述

【SQL24】统计每个用户的平均刷题数
在这里插入图片描述
解题思路:
这一题和上一题同理,需要将三个表分别连接起来,然后分组,最后再筛选“山东大学”,这里就需要用到之前我们碰到过的HAVING通常与GROUP BY子句一起使用。

代码如下:

SELECT university,difficult_level,
ROUND(COUNT(b.question_id) / COUNT(DISTINCT b.device_id),4) AS avg_answer_cnt
FROM question_practice_detail AS b

left join user_profile AS a
on a.device_id=b.device_id

left join question_detail AS c
on c.question_id=b.question_id

GROUP BY university,difficult_level
HAVING university='山东大学'

结果:
在这里插入图片描述

2、组合查询

【SQL25】查找山东大学或者性别为男生的信息
在这里插入图片描述

解题思路:
本题要求结果不去重,所以这一题涉及到一个新的知识点:
union 和union all的区别
union是合并两个查询语句的结果集,并排除重复项
union all是不排除重复项的,(符合本题要求)
union使用前提
使用union合并两个表时,需要两个表的结果集字段完全一样;

代码如下:

SELECT device_id,gender,age,gpa FROM user_profile 
WHERE university='山东大学'
UNION ALL
SELECT device_id,gender,age,gpa FROM user_profile 
WHERE gender='male'

结果:
在这里插入图片描述

总结

  以上,便是今天的SQL学习打卡,今天的练习综合性比较强,准备到时候给大家出一个综合总结!感谢您的学习观看!

 我会继续分享我的学习过程哒!

欢迎小伙伴们和我一起坚持打卡,评论区互相监督!

      牛客——不见不散!

猜你喜欢

转载自blog.csdn.net/m0_62279905/article/details/127207660
今日推荐