1.汇总分析
count、sum、avg、max、min
-- count 算出教师数:SELECT COUNT(教师姓名) FROM teacher;(剔除空值计算)
-- count 算出全部行数: SELECT COUNT(*) FROM teacher;
-- avg 算出平均成绩:SELECT AVG(成绩) FROM score;
-- max min 算出最高、最低成绩: SELECT MAX(成绩),MIN(成绩) FROM score;
-- DISTINCT 取消重复值:SELECT COUNT(DISTINCT 姓名) FROM student;
练习1:-- 查询课程号为"0002"的总成绩:
SELECT SUM(成绩) FROM score WHERE 课程号='0002';
练习2 -- 查询选了课程的学生人数:
SELECT COUNT(DISTINCT 学号) FROM score;
2.分组:group by
-- GROUP BY 计算男女类别人数:
SELECT 性别,COUNT(*) as '学生人数' FROM student WHERE 出生日期>'1990-01-01' GROUP BY 性别;
运行顺序:from子句——where子句——group by子句——select子句
练习1 -- 查找各科成绩最高分、最低分:
SELECT 课程号,MAX(成绩) as '最高分',Min(成绩) as '最低分' FROM score GROUP BY 课程号;
练习2 -- 查找每门课程选修的学生数:
SELECT 课程号,COUNT(学号) as 学生数 FROM score GROUP BY 课程号;
练习3 -- 查找男生、女生人数:
SELECT 性别,COUNT(学号) as 学生数 FROM student GROUP BY 性别;
3.对分组结果指定条件
where 指定行的条件;having 对分组结果指定条件
-- 取出男生组:
SELECT 性别,COUNT(*) as 学生数 FROM student GROUP BY 性别
HAVING COUNT(*)>1;
运行顺序: from 从哪张表中查找数据 ——where 查询条件——group by 分组——having 对分组结果指定条件——select 查询结果
练习1 -- 平均成绩>60学生学号和平均成绩:
SELECT 学号,AVG(成绩) as 平均成绩 FROM score GROUP BY 学号
HAVING AVG(成绩)>60;
练习2 -- 至少选修2门课程学生学号:
SELECT 学号,count(课程号) as 课程数 FROM score GROUP BY 学号
HAVING count(课程号)>=2;
练习3 -- 查询同名同姓学生名单并统计同名人数:
SELECT 学号,姓名,count(姓名) as 人数 FROM student GROUP BY 姓名
HAVING count(姓名)>=2;
4.用sql解决业务问题
翻译成大白话、写出分析思路、写出对应的sql子句
练习 -- 平均成绩>=80课程成绩:
SELECT 课程号,AVG(成绩) as 平均成绩 FROM score GROUP BY 课程号
HAVING AVG(成绩)>=80;
5.对查询结果排序
order by asc 升序、order by desc 降序
运行顺序: from 从哪张表中查找数据 ——where 查询条件——group by 分组——having 对分组结果指定条件——order by 对查询结果排序——select 查询结果
从查询结果取出指定行:limit
练习 1 -- 查询不及格课程并按课程号从大到小排列
SELECT 课程号,成绩 from score WHERE 成绩<60 ORDER BY 课程号 desc;
练习2 -- 查询每门课平均成绩,平均成绩升序排列,课程号降序排列
SELECT 课程号,AVG(成绩) as 平均成绩 from score GROUP BY 课程号
ORDER BY AVG(成绩) ASC,课程号 desc;
6.如何看懂报错信息
where子句中不能使用count子句;字符串类型的数字,需先修改数据类型
运行顺序: from 从那张表中查找数据 ——where 查询条件——group by 分组——having 对分组结果指定条件———select 查询结果——order by 对查询结果排序——limit 从查询结果取出指定行