今天的SQL相关汇总分析内容包含了:函数,分组,排序和指定行等
一、函数有:
count(列名):求某列的行数,不包含空值(null); count(*) 求全部的行数,包含空值(null)
sum(列名):对某列数据求和,只能对数值类型的列计算
avg(列名):求某列数据的平均值,只能对数值类型的列计算
max(列名):求某列数据的最大值
min(列名):求某列数据的最小值
二、分组和特殊条件查询:group by 和having
group by是分组,having是对分组结果指定条件。这里的having作用类似where,区别是当后面的条件是函数时,只能使用having。
三、排序order by asc/desc
asc是升序:从小到大排 (默认的排序)
desc是降序:从大到小排
注:我们也可以同时指定多个排序列名 order by <列名1> asc,<列名2> desc;
对于含有空值(null)的列排序时,空值会在查询结果开头显示,方便查询表格中空值的情况
四、指定行limit
在mysql中如果返回的数据行很多,可以用limit来限制返回的行数。在SQL中使用的是top,作用相同。
几个常用函数及其作用
SQL 的运行顺序图
上图是SQL的运行顺序,可以帮助理清思路。
练习:
- 查询课程编号为“0002”的总成绩
/*
分析思路
select 查询结果 [总成绩:汇总函数sum]
from 从哪张表中查找数据[成绩表score]
where 查询条件 [课程号是0002]
*/
select sum(成绩)
from score
where 课程号 = '0002';
2. 查询选了课程的学生人数
/*
这个题目就是:查询有多少人选了课程
select 学号,成绩表里学号可能有重复值需要去掉
from 从课程表查找score;
*/
select count(distinct 学号) as 学生人数
from score;
3. 查询各科成绩最高和最低的分, 以如下的形式显示:课程号,最高分,最低分
/*
分析思路
select 查询结果 [课程ID:是课程号的别名,最高分:max(成绩) ,最低分:min(成绩)]
from 从哪张表中查找数据 [成绩表score]
where 查询条件 [没有]
group by 分组 [各科成绩:也就是每门课程的成绩,需要按课程号分组];
*/
select 课程号,max(成绩) as 最高分,min(成绩) as 最低分
from score
group by 课程号;
4. 查询每门课程被选修的学生数
/*翻译:即查找每门课程有多少人选修,按课程号分组
*/
select 课程号, count(学号)
from score
group by 课程号;
5. 查询男生、女生人数
/*翻译:即按性别分组算人数
分析思路
select 查询结果 [性别,对应性别的人数:汇总函数count]
from 从哪张表中查找数据 [性别在学生表中,所以查找的是学生表student]
where 查询条件 [没有]
group by 分组 [男生、女生人数:按性别分组]
having 对分组结果指定条件 [没有]
order by 对查询结果排序[没有];
*/
select 性别,count(*)
from student
group by 性别;
6. 查询平均成绩大于60分学生的学号和平均成绩
/* 翻译:即查询每个学生的学号和平均成绩,条件:平均成绩>60
注:
这里涉及到“每个”就是要分组了
平均成绩大于60分,就是对分组结果指定条件
*/
select 学号, avg(成绩)
from score
group by 学号
having avg(成绩)>60;
7. 查询至少选修两门课程的学生学号
/* 即查询每个学生的学号及选修的课程数,条件:选修的课程数>=2
翻译成大白话:
第1步,需要先计算出每个学生选修的课程数据,需要按学号分组
第2步,至少选修两门课程:也就是每个学生选修课程数目>=2,对分组结果指定条件
*/
select 学号, count(课程号) as 选修课程数目
from score
group by 学号
having count(课程号)>=2;
8. 查询同名同姓学生名单并统计同名人数
/* 即查找同姓名的人并计数,统计同名人数就是找计数>=2的
翻译成大白话,问题解析:
1)查找出姓名相同的学生有谁,每个姓名相同学生的人数
查询结果:姓名,人数
条件:怎么算姓名相同?按姓名分组后人数大于等于2,因为同名的人数大于等于2
*/
select 姓名,count(*) as 人数
from student
group by 姓名
having count(*)>=2;
9. 查询不及格的课程并按课程号从大到小排列
/* 即查找课程号,条件:成绩<60,再按课程号降序
分析思路
select 查询结果 [课程号]
from 从哪张表中查找数据 [成绩表score]
where 查询条件 [不及格:成绩 <60]
group by 分组 [没有]
having 对分组结果指定条件 [没有]
order by 对查询结果排序[课程号从大到小排列:降序desc];
*/
select 课程号
from score
where 成绩<60
order by 课程号 desc;
10. 查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
/*
分析思路
select 查询结果 [课程号,平均成绩:汇总函数avg(成绩)]
from 从哪张表中查找数据 [成绩表score]
where 查询条件 [没有]
group by 分组 [每门课程:按课程号分组]
having 对分组结果指定条件 [没有]
order by 对查询结果排序[按平均成绩升序排序:asc,平均成绩相同时,按课程号降序排列:desc];
*/
select 课程号, avg(成绩) as 平均成绩
from score
group by 课程号
order by 平均成绩 asc,课程号 desc;
知识点:
- 涉及到查找"每”"每个"时,要想到用group by
- 看到问题要先翻译成大白话,分析思路再写SQL语句
- 如字符串里有单引号或是双引号,该符号前要使用转义字符('')