练习1:汇总分析
5大汇总函数:count、sum、avg、max、min
1)查询课程编号为“0002”的总成绩
2)查询选了课程的学生人数
利用distinct把重复的学号去掉。
练习2:常见面试题
对数据分组
1)查询各科成绩最高和最低的分
2)查询每门课程被选修的学生数
3)查询男生、女生人数
练习3:常见面试题
对分组结果指定条件;理解SQL运行顺序
1)查询平均成绩大于60分学生的学号和平均成绩
后面having子句,不建议用select子句中的别名“平均成绩”,因为其他数据库可能识别不出来。(having子句先于select子句运行)
2)查询至少选修两门课程的学生学号
3)查询同名同姓学生名单并统计同名人数
练习4:每门课程的平均成绩
业务问题套路
1)如何计算各科的平均成绩
2)如何计算每门课程的平均成绩并且平均成绩大于等于80分
练习5:常见面试题
对查询结果排序:升序、降序、指定多个排序列名、空值的排序
1)查询不及格的课程并按课程号从大到小排列
因为同一门课,有多人对应不同的成绩,此题不用对课程号分组(group by)。
对比上面两图,发现用where或者having子句都可以。
2)查询每门课程的平均成绩,结果按平均成绩升序排列。平均成绩相同时,按课程号降序排列
asc:升序;desc:降序。
3)检索课程编号为“0002”且分数小于85的学生学号,结果按按分数降序排列
4)统计每门课程的学生选修人数(超过2人的课程才统计)
要求输出课程号和选修人数,查询结果按人数降序排序,若人数相同,按课程号升序排序
5)查询两门及两门以上不及格课程的同学的学号及不及格课程的平均成绩
注意:输出结果是“不及格”成绩的平均成绩。
练习6:SQL练习题
几种常见的SQL错误
1)常见错误:在having子句中使用了select里的别名
因为having子句先于select子句运行,所以会导致运行的开始识别不了“别名”
Tips:按理说,既然having子句是先于select子句运行的,是无法识别出having子句中的“平均成绩”(别名)的。
课程里讲的是适合所有数据库的原理,对应到不同的数据库会有差别。
2)常见错误:在where中使用汇总函数
5大 汇总函数:count、sum、avg、max、min,不能在where中使用,可用在 having或 者select子句中。
3)常见问题:字符串类型的数字
表面是数字,实则是“字符串”类型。数字类型和字符串类型的排序规则是不一样的。
sqlzoo 练习题
sqlzoo:
SQLZOOsqlzoo.net一、sqlzoo平台Select_from_Nobel(简单查询)
网址: https:// sqlzoo.net/wiki/SELECT_ from_Nobel_Tutorial/zh
注意:人名中本身含有所有格‘,为了避免和where子句中的单引号冲突,写成 ‘’
1:代表'Chemistry'或'Physics';0:剩余其它。
subject in ('Physics','Chemistry')返回值(0或者1),会对每一个subject做一个if的判断,有的是1,没有的是0,再用order by把这些值排序在下面。
不是这两个科目('Physics','Chemistry')的就是0排在前边,是这两个科目的返回1就排在后边了。
Tips:不特别注明的话,默认是按升序(asc)排列
活学会用,举一反三
注:1:符合h开头的名字;0:不符合。默认升序排列(0→1),所以为了让hasgdjah排在前面,需要用desc(降序)。
和上面第14题原理一样,值得好好理解消化,举一反三,学以致用。
二、sqlzoo平台SUM and COUNT(汇总分析)
网址: https:// sqlzoo.net/wiki/SUM_and _COUNT/zh
去掉group by也可以,对比上面两张截图,说明语句有优化的空间,还得继续精进。
客户端Navicat使用过程中报错,解决经验收集:
总结
对于同一个业务问题,可以用不同的SQL语句来解决,要多看多练,精进优化SQL语句的能力。