SQL学习之高级查询

2,260 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天

计算函数

  • QL16 查找GPA最高值

image.png

因为题目要求保留一位小数点,并且四舍五入\ 所以这里需要使用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

image.png

参考代码如下:

SELECT COUNT(gender) AS male_num,
ROUND(AVG(gpa),1) AS avg_gpa
FROM user_profile
WHERE gender IN ('male')

这里的知识点有重新命名新列表的用法: AS 列名的用法
还有ROUND()函数,保留指定小数位数的用法

分组查询

  • SQL18 分组计算练习题

image.png

参考代码如下:

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 分组过滤练习题

image.png

参考代码如下:

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 分组排序练习题

image.png

参考代码如下:

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