文章结构
- 汇总分析
- 分组
- 对分组结果制定条件
- 用SQL解决业务问题
- 对查询结果进行排序
- 如何看懂报错信息
一.汇总分析
聚集函数:聚集函数会对NULL以外的对象进行汇总。但是只有COUNT函数例外,使用COUNT(*)可以查出包含NULL在内的全部数据的行数[输入的是列名的时候NULL不统计],注意:其他函数并不能将星号作为参数。
COUNT: COUNT() 函数返回符合指定条件的行数。
SQL COUNT() 函数_w3cschoolwww.w3cschool.cn1.查询某列的行数[NULL不计数],count输入参数为列名。
2.查询所有记录数(行数)
SUM函数:函数返回数字列的总和。
实例1:求学号为'0001'的学生的课程总成绩。
AVG函数:函数返回数字列的平均值。
实例1:求学号为'0001'的学生的课程平均成绩。
MAX/MIN函数:函数返回所选列的最大值/最小值。
实例1:求课程号为'0002'的课程最高分和最低分。
注意:聚集函数,如果以列名为参数,那么在计算之前就已经把NULL 排除在外了。因此,无论有多少个 NULL 都会被无视,被无视和等于0是不同的,具体自己体会AVG函数中二者的区别。
函数小练习:
1.查询课程编号为'0002'的总成绩.
2.查询选了课程的学生人数.
二.分组
GROUP BY:主要是用来通过对某个字段进行分组查询,使用 GROUP BY 子句时,会将表中的数据分为多个组分别进行处理。
注意:因为聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数,要么为GROUP BY语句的参数,要么为一个常数否则会出错。
select子句后面接无论是列名,还是其他聚合函数,都要做到每行输出的元素做到一一对应。因为按continent分组之后再组合后的结果,每个continent都只有一个值,但是一个continent肯定不止一个country,所以会出一对多的情况【一对多的数据往往需要分组】,于是会报错,GROUP BY后的数据,应该是搭配聚集函数使用,才能一对一(聚集函数只有一个返回值)。【mysql不会报错】
分组练习题:
1.查询各科成绩最高和最对分。
2.查询每门课程选修的学生数量。
3.查询男生人数,女生人数。
3.查询选择了课程'0002'男生人数,女生人数。
三.对分组结果指定条件[HAVING]。
HAVING通常是对GROUP BY后的数据进行筛选的[基本上都和聚集函数搭配使用]。
补充资料:
(1)聚集函数:诸如(COUNT,MAX,MIN,SUM,AVG)等基于整列数据进行计算的返回单一值的函数。
(1)HAVING是先分组再筛选记录,WHERE在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选。
(2)具体来说:聚集函数也叫列函数,它们都是基于整列数据进行计算的,而WHERE子句则是对数据行进行过滤的。聚集函数要对全列数据进行计算,因而使用它的前提是:结果集已经确定!而WHERE子句还处于“确定”结果集的过程中,因而不能使用聚集函数。与WHERE子句不能出现聚集函数正相反的是,我们几乎看不到不使用聚集函数的HAVING子句。为什么?因为在水平方向上根据外部指定条件的筛选(也就是对行的筛选),WHERE子句可以独立完成,剩下的往往都是需要根据结果集自身的统计数据进一步筛选了,这时,几乎都需要通过HAVING子句配合聚集函数来完成。其次,WHERE子句运行效率比HAVING子句也要快。
(3)使用 COUNT 函数等对表中的数据进行聚合操作时,DBMS 内部就会进行排序处理。排序处理是会大大增加机器负担的高负荷的处理 。通过 WHERE 子句指定条件时,由于排序之前就对数据进行了过滤,因此能够减少排序的数据量。但 HAVING 子句是在排序之后才对数据进行分组的,因此与在 WHERE 子句中指定条件比起来,需要排序的数据量就会多得多。
转自:
CSDN-专业IT技术社区-登录blog.csdn.net练习题:
1.查询平均成绩大于60分的学生学号和平均成绩。
2.查询至少选修两门课程的学生的学号。
3.查询同名同姓的学生名单并统计同名人数。
四.用SQL解决业务问题
[磨刀不误砍柴工]
- 翻译成大白话
- 写出分析思路
- 写出对应的SQL语句
五.对查询结果进行排序
- ORDER BY在SELECT语句之后运行.
- ORDER BY子句中可以使用SELECT子句中定义的列的别名。
- ORDER BY子句中可以使用SELECT子句中未出现的列或者聚合函数。
- ORDER BY子句中如果同时指定多个排序键。规则是优先使用左侧的键,如果该列存在相同值的话,再接着参考右侧的键。
图片出自:
SQL ORDER BY 关键字www.w3cschool.cn排序应用:查看空值情况。
limit:从查询结果中取出指定行,一般来说,limit是对查询结果做限定,一般是最后运行。
练习题:
1.查询不及格的课程并且按照课程号从大到小排列。
2.查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同的时候,按照课程号降序排列。
3.查询两门以上不及格课程的同学的学号及不及格课程的平均成绩。
补充:Sql语句运行顺序
六.如何看懂sql报错信息。
1.在GROUP BY 中使用了 SELECT里别名,SELECT 子句在 GROUP BY 子句之后执行。在执行 GROUP BY 子句时, SELECT 子句中定义的别名, DBMS 还并不知道。
2.在SELECT子句中书写了多余的列,在使用 COUNT 这样的聚合函数时, SELECT 子句中的元素有严格的限制。 使用聚合函数时,SELECT 子句中只能存在以下三种元素。
3.在WHERE中使用聚合函数。
4.HAVING 子句和包含 GROUP BY 子句时的 SELECT 子句一样,能够使用的要素有一定的限制,限制内容也是完全相同的。 HAVING 子句中能够使用的 3 种要素如下所示。
如:①HAVING COUNT(*)= 2 这样的条件,其中 COUNT(*)是聚合函数, 2 是常数,全都满足上述要求。②或者后面接的时GROUP BY子句中的列名。
七.Sqlzoo练习
select from nobel:
SUM and COUNT: