本文内容目录:
- 汇总分析
- 分组
- 对分组结果指定条件
- 用SQL解决业务问题
- 对查询结果排序
- 看懂SQL报错信息
一、汇总分析
1、常见的汇总函数
count:用于求某列的行数
sum:用于求某列数据的和(只能对数值类型的列计算)
avg:求某列数据的平均值(只能对数值类型的列计算)
max:求某列数据的最大值
min:求某列数据的最小值
函数用于对输入的数据执行某项特定的指令,然后将结果输出。
SELECT COUNT(教师姓名) -- 输出结果不包括Null值
from teacher;
SELECT COUNT(*) -- 输出结果包括Null值
FROM teacher;
SELECT sum(成绩) -- sum/avg只能对数值类型的列计算
FROM score;
SELECT avg(成绩) -- 返回成绩列的平均值
from score;
SELECT max(成绩),min(成绩) -- 查找成绩列中的最大值和最小值
from score;
SELECT COUNT(DISTINCT(姓名)) -- 函数可以结合使用,返回去重后的数值
from student;
练习:
1、查询课程编号为‘0002’的总成绩
SELECT sum(成绩) as 0002总成绩
from score
where 课程号='0002';
2、查询选了课程的学生人数
SELECT COUNT(DISTINCT(学号)) as 学生人数
from score;
二、分组 Group by
SELECT 性别,count(*) --运行顺序:先运行第2~4行,最后运行第1行
from student
where 出生日期>'1990-01-01'
group by 性别;
练习:
1、查询各科成绩最高分和最低分
SELECT 课程号,max(成绩),min(成绩)
from score
group by 课程号;
2、查询每门课程被选修的学生数
SELECT 课程号,count(学号)
from score
group by 课程号;
3、查询男生、女生人数
SELECT 性别,count(*)
from student
group by 性别;
三、对分组结果指定条件 having
select 查询结果
from 从哪张表中查找数据
where 查询条件
group by 分组
having 对分组结果指定条件
-- 运行顺序:先运行2~5行,再运行第1行
练习:
1、查询平均成绩大于60分的学生的学号和平均成绩
SELECT 学号,avg(成绩)
from score
group by 学号
having avg(成绩)>60;
2、查询至少选修两门课程的学生学号
SELECT 学号,count(课程号) as 选修课程数目
from score
group by 学号
having count(课程号)>=2;
3、查询同名同姓学生名单并统计同名
select 姓名 as 同名同名名单,count(姓名) as 人数
from student
group by 姓名
having count(姓名)>1;
四、用SQL解决业务问题
用SQL解决业务问题的步骤:
1、将问题翻译成大白话
2、写出分析思路
3、写出对应的SQL子句
练习:计算每门课程的平均成绩并且平均成绩大于等于80分
SELECT 课程号,avg(成绩) as 平均成绩
from score
group by 课程号
having avg(成绩)>=80;
五、对查询结果排序 order by
select 查询结果
from 从哪张表中查找数据
where 查询条件
group by 分组
having 对分组结果指定条件
order by 对查询结果排序
-- 关键字默认按照升序对记录进行排序,也可以使用升序(asc),降序(desc)进行指定
-- 运行顺序:先运行2~5行,再运行第1行,最后运行第6行
SQL可指定多个排序列名,这种情况下先按第一个列进行排序,当第一个列中有多个相同值时,再按第二个列的顺序进行排序。
SELECT *
from score
ORDER BY 成绩 asc,课程号 desc;
-- 当用于排序的列中存在空值时,空值会排在前面,可借此观察该列的空值情况
SELECT *
from teacher
ORDER BY 教师姓名;
从查询结果中取出指定行:limit
SELECT *
from score
limit 2; -- 2指的是只返回前两行的数据
select 查询结果
from 从哪张表中查找数据
where 查询条件
group by 分组
having 对分组结果指定条件
order by 对查询结果排序 -- 升序asc,降序desc
limit 从查询结果中取出指定行
-- 运行顺序:先运行2~5行,再运行第1行,最后运行第6、7行
练习:
1、查询不及格的课程并按课程号从大到小排列
SELECT 课程号,成绩
from score
having 成绩<60
ORDER BY 成绩 desc;
2、查询每门课程的平均成绩,结果按平均成绩升序排序。平均成绩相同时,按课程号降序排序
SELECT 课程号,avg(成绩) as 平均成绩
from score
GROUP BY 课程号
ORDER BY avg(成绩) asc,课程号 desc;
五、如何看懂报错信息
常见错误:
1、在group by中使用了select 里的别名
SELECT 课程号,avg(成绩) as 平均成绩
from score
where 平均成绩>=80
ORDER BY avg(成绩) asc,课程号 desc;
报错信息:
显示无法识别‘平均成绩’,因为where子句执行的时候,select子句尚未执行,因此无法进行正常识别
2、在where中使用聚合函数
SELECT 性别,count(*)
from student
where count(*)
GROUP BY 性别;
报错信息:
六、课后练习
本次练习来自SQLZOO网站的SELECT from nobel 和 SUM and COUNT 部分。
SELECT from nobel 部分:
补充知识点:当字符串中包含单引号或双引号时,需要进行转义字符的处理。
补充知识:
在排序过程中,如果需要某字符串排在最前或最后,可以引入subject in ('字符串' )来进行一个if的判断,如果是该字符,返回值为1,如果不是该字符,返回值为0,据此可以进行特定顺序的排列。
SUM and COUNT 部分: