一、汇总分析
1.知识点汇总
count:求某列的行数,如果函数中输入的时【列名】除去空值null以后的行数;如果输入【*】则会输出所有的行数
sum:对某列数据求和(只能对数据类型的列计算)
avg:求某列数据求和的平均值(只能对数值类型的列计算)
max:求某列数据的最大值
min:求某列数据的最小值
2.习题
1)查询课程编号为“0002”的总成绩
2)查询选了课程的学生人数
思路解析:一开始我是从student数据表里面对姓名去重后计算学生总人数,但是这个思路有两个问题:第一个不一定每个学生都选了课程,我忽略了前置条件“选了课程”;第二个对“学生姓名”去重,不够严谨,会存在同名同姓不同人的情况,应该对“学号”去重,学号是唯一的。
正确思路:应该在“score”表中对“学号”去重,并且将最终结果设置为“学生人数”
二、分组
1.知识点汇总
1)数据分组(group by) —应用函数 (count) —组合结果
2)SQL运行顺序
2.习题
1)查询各科成绩最高和最低的分
解题思路:分组,用group by 对课程分类;应用函数,最高用max()函数,最低用min()函数;最后组合结果。
2)查询每门课程被选修的学生数
解题思路:分组,用group by 对课程分类;应用函数,统计学生数用count()函数。
3)查询男、女生人数
解题思路:先分组,用group by 对性别分组;然后用count()函数统计人数。
三、对分组结果指定条件
1.知识点汇总
1)where只能指定“行”的数据,having可以对“分组后的数据”指定条件。
2)SQL运行顺序
2.练习
1)查询平均成绩大于60分学生的学号和平均成绩
解题思路:平均成绩即为计算每个学生的平均成绩,涉及每个就需要分组;平均成绩大于60分即对分组结果指定条件。
2)查询至少选修两门课程的学生学号
解题思路:对学生学号分组,计算选修课程总数,筛选出课程数量大于等于2的学生学号.
3)查询同名同姓学生名单并统计同名人数
解题思路:先查找姓名相同的学生,每个姓名相同学生的人数。查询结果为姓名和人数,再筛选出同名人数>=2 的结果。
四、用sql解决业务问题
1.知识点汇总
方法:翻译问题—学出分析思路—写出对应的SQL子句
五、对查询结果排序
1.知识点汇总
1)降序(desc):从大到小
升序(asc): 从小到大
2)指定多个排序列名:排列顺序从左到右
3)空值(null)的排序:空值会在查询列开头显示
4)从查询记过中取出指定行:limit
5)SQL运行顺序
2.练习
1)查询不及格的课程并按课程号从大到小排列
(备注:用红色数字标识了SQL语句运行顺序)
2)查询每门课程的平均成绩,结果按平均成绩升序排序。平均成绩相同时,按课程号降序排列。
解题思路:每门课程即需要用group by 对课程分组,平均成绩即用avg()函数。
(备注:用红色数字标识了SQL语句运行顺序)
六、看懂报错信息
常见错误
1.在group by 或者having 中使用了select里的别名:因为在运行group by 和having
语句的时候是还未执行select语句,所以并不知道别名是什么。
2.在where中使用聚合函数
3.字符串类型的数字