01.创建表
1.1 表MUL
1.2 创建表
1 | # --学生表 |
02.创建表
2.0 创建数据展示
2.1 学生表
1 | --插入学生表测试数据 |
2.2 课程表
1 | --课程表测试数据 |
2.3 教师表
1 | --教师表测试数据 |
2.4 成绩表
1 | --成绩表测试数据 |
03.常见查询
3.1 查询"01"课程比"02"课程成绩高的学生的信息及课程分数
1 | -- [分析] 筛选出课程号01这门课的成绩比02这门课成绩高的学生,输出这些学生的信息及课程分(表:Student,Score)——表联结 |
3.2 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
1 | -- [分析] 要求平均成绩,就需要用group by对学生分组,然后利用聚合函数avg求出平均成绩,由于where语句中不能包含聚合函数,故再利用having语句和60分比较。 |
3.3 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
1 | -- [分析]学生编号、学生姓名在表student中;选课数可通过在表score中通过group by 学生编号后利用count(c_id)算出;所有课程的总成绩则用sum可以算出。 |
3.4 查询"李"姓老师的数量
1 | -- [分析] 这里用到知识点字符串模糊查询,如:where 姓名 like '猴%' 即可查到猴什么什么。 |
3.5 学过"张三"老师授课的同学
1 | -- [分析] 老师的信息在表teacher中,可通过teacher.t_id与表course联结, |
3.6 学过编号为"01"并且也学过编号为"02"的课程的同学的信息
1 | -- [分析]由于既要学过01课程的,又要学过02课程的,所以共需要联结两次才能达到筛选效果 |
3.7 学过编号为"01"但是没有学过编号为"02"的课程的同学的信息
1 | -- [分析] 在上述语句中用and联结,注意不能直接将“=”换成“<>” |
3.8 查询没有学全所有课程的同学的信息
1 | -- [分析]没学全所有课程的情况很多,如学0门,学1门,学2门。所以这里先筛选出学全所有课程的同学再取反,即没有学全所有课程的同学。 |
3.9 查询没学过"张三"老师讲授的任一门课程的学生姓名
1 | select s_name |
3.10 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
1 | select a.s_id,a.s_name,avg(b.s_score) |
3.11 检索"01"课程分数小于60,按分数降序排列的学生信息
1 | -- [分析] 内联结+子查询筛选+排序 |
3.12 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩(重要!)
1 | select a.s_id,(select s_score from Score where s_id = a.s_id and c_id = '01') as 语文, |
3.13 查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率–及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90(重要!)
1 | -- [分析] 用到case语句,后面记得按课程号分组来显示全部结果 |
3.14 查询学生的总成绩并进行排名
1 | select s_id,sum(s_score) |
3.15 查询不同老师所教不同课程平均分从高到低显示
1 | select a.t_id,avg(b.s_score) |
3.16 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
1 | select a.*,sum(b.s_score) |
3.17 查询学生平均成绩及其名次
1 | select s_id,avg(s_score),rank() over (order by avg(s_score) desc) as rank_score |
__END__