携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天
计算函数
- QL16 查找GPA最高值
因为题目要求保留一位小数点,并且四舍五入\ 所以这里需要使用round函数
SELECT round(MAX(gpa),1)
FROM user_profile
WHERE university = '复旦大学'
或者参考代码如下:
SELECT round(gpa,1)
FROM user_profile
WHERE university = '复旦大学'
ORDER BY gpa DESC
LIMIT 1
这里是将gpa进行降序排列,取第一个
- SQL17 计算男生人数以及平均GPA
参考代码如下:
SELECT COUNT(gender) AS male_num,
ROUND(AVG(gpa),1) AS avg_gpa
FROM user_profile
WHERE gender IN ('male')
这里的知识点有重新命名新列表的用法:
AS 列名的用法
还有ROUND()函数,保留指定小数位数的用法
分组查询
- SQL18 分组计算练习题
参考代码如下:
SELECT gender,university,
COUNT(university) AS user_num,
ROUND(AVG(active_days_within_30),1) AS avg_active_days,
ROUND(AVG(question_cnt),1) AS avg_question_cnt
FROM user_profile
GROUP BY gender,university
COUNT(university/gender/device_id) AS user_num
- SQL19 分组过滤练习题
参考代码如下:
SELECT university,
ROUND(AVG(question_cnt),3) AS avg_question_cnt,
ROUND(AVG(answer_cnt),3) AS avg_answer_cnt
FROM user_profile
GROUP BY university HAVING avg_question_cnt < 5 OR avg_answer_cnt < 20
这一题的知识点就是havig函数的使用
之所以where不能使用的原因在于其关键字无法与聚合函数group by 一起使用;
原因:因为 where 的操作对象是一条记录,比如说当一条记录xxx时,在什么条件下可以用 where
但是涉及到多条记录时,比如说这里的对象是从一组一组中再过滤到"平均问问题书小于 5" 的小组
这种情况下,where 就不适用了
此时,提供了 having 的关键词。
where 从记录中法过滤出某一条记录
having 可以从一组组记录中过滤掉其哪几组
- SQL20 分组排序练习题
参考代码如下:
SELECT university,
ROUND(AVG(question_cnt),4) AS avg_question_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt ASC
解析过程如下:
问题分解:
- 限定条件:无;
- 不同大学:按学校分组
group by university- 平均发帖数:
avg(question_cnt)- 升序排序:
order by avg_question_cnt