前言
昨天学习了条件查询,今天一起学习高级查询,做题之前让我们回顾一下昨天的几个知识点。
1、排序子句:
ORDER BY <列名> [ASC | DESC ][,<列名> … ]
2、WHERE子句
3、BETWEEN AND 子句
4、过滤空值:
①判断取值为空的语句格式为:列名 IS NULL
②判断取值不为空的语句格式为:列名 IS NOT NULL
5、WHERE IN 和NOT IN :
列名 [NOT] IN(常量1, 常量2,…常量n)
6、AND 和 OR
7、字符匹配
列名 [NOT ] LIKE
以上便是昨天的学习内容,今天我们开始学习高级查询
SLogan:利用有限的时间,撸起袖子加油干!既要面包也要玫瑰!!!
一、学习过程
1、计算函数
【SQL16】查找GPA最高值
解题思路:
首先解题的思路是先筛选出’复旦大学’‘,其次再选出gpa最高值
这里可以用到MAX( <列名> ):求列值最大值;
代码如下:
SELECT max(gpa) FROM user_profile
WHERE university='复旦大学'
结果:
【SQL17】计算男生人数以及平均GPA
解题思路:
首先看结果可知需要进行表头重命名,用as语法,用以存放男生人数,这里需要用到计数,count()函数;其次是求平均值,使用avg()函数。浮点数的平均值可能小数点位数很多,按照示例保存一位小数,用round()函数
保留小数位数:round(列名,位数)
代码如下:
SELECT
COUNT(gender) as male_num,ROUND(avg(gpa),1) FROM user_profile
WHERE gender='male'
结果:
2、分组查询
【SQL18】分组计算练习题
解题思路:
这是一道综合考查题,我们利用上面的知识点去解题。
分组:GROUP BY 。
SELECT gender,university,
COUNT(device_id) AS user_num,
ROUND(avg(active_days_within_30),1) AS avg_active_day,
ROUND(avg(question_cnt),1) AS avg_question_cnt
FROM user_profile
GROUP BY gender,university
结果:
【SQL19】分组过滤练习题
解题思路:
分组:GROUP BY
注意点!!:使用HAVING子句
HAVING子句用于对分组后的结果再进行过滤,
它的功能有点像WHERE子句,但它用于组而不是单个记录。
在HAVING子句中可以使用统计函数,但在WHERE子句中则不能。
HAVING通常与GROUP BY子句一起使用。
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
结果:
【SQL20】分组排序训练题
解题思路:
这是一道综合排序 分组题,我们利用之前涉及到的知识点去解题。
SELECT
university,
ROUND(avg(question_cnt),4) AS avg_question_cnt
FROM user_profile
GROUP BY university
ORDER BY avg_question_cnt ASC
结果:
总结
以上,便是今天的SQL学习打卡,最后三个综合题非常好的融合了我们之前学到的知识点。再接再厉,难度一点点加深,希望越学越好,欢迎大家的监督与指正!!!