今天的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,作用相同。




mysql 条件分组计数 sql根据条件分组_怎么用sql按条件把表分离


几个常用函数及其作用

mysql 条件分组计数 sql根据条件分组_SQL_02

SQL 的运行顺序图


上图是SQL的运行顺序,可以帮助理清思路。

练习:

  1. 查询课程编号为“0002”的总成绩


mysql 条件分组计数 sql根据条件分组_mysql 条件分组计数_03


mysql 条件分组计数 sql根据条件分组_怎么用sql按条件把表分离_04


/*
分析思路
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;


知识点:

  1. 涉及到查找"每”"每个"时,要想到用group by
  2. 看到问题要先翻译成大白话,分析思路再写SQL语句
  3. 如字符串里有单引号或是双引号,该符号前要使用转义字符('')