假如我有下面这张表
学生姓名 学生ID 课程名称 课程ID 测试类型 测试分数
A 111 设计 1111 练习 90
A 111 设计 1111 练习 80
A 111 设计 1111 练习 0
A 111 设计 1111 考试 90
A 111 设计 1111 考试 30
B 222 设计 1111 练习 30
B 222 设计 1111 练习 80
B 222 设计 1111 练习 90
B 222 设计 1111 考试 90
B 222 设计 1111 考试 90
C 333 设计 1111 练习 90
C 333 设计 1111 练习 90
C 333 设计 1111 练习 90
C 333 设计 1111 考试 90
C 333 设计 1111 考试 90
A 111 绘画 2222 项目 90
A 111 绘画 2222 项目 90
A 111 绘画 2222 练习 90
A 111 绘画 2222 练习 90
A 111 绘画 2222 考试 90
背景大概是:这门课程的分数是由数部分组成(测试类型),每部分又有不同次数的测试(这里分成了2次考试3次练习,但是其他课程可能不同x次考试y次练习z次练习等等)
现在我想进行下面查询操作 :
求出每个学生在这门课中参加的每种类型的测试的平均分数(按次数平均)(学生 课程 测试类型 最终分数)例如:
学生 课程 类型 分数
A 设计 练习 (90+80+0)/3
A 设计 考试 (xx+yy)/2
A 绘画 项目 (xx+yy)/2
A 绘画 考试 xx/1
B 设计 练习 (xx+yy+zz)/3
大概这样。。看起来好像比较复杂,简单说就是我想知道 该课程中,学生每个类型的测试参与次数(比如A的设计课 练习3次考试2次 绘画课项目2作练习2次考试1次)在数据量很大的时候就比较头疼了,感觉思路有些混乱,动不了笔。
这就不对啦,乱了可以一点一点理清,学这个如果没有错误尝试是不会有进步的,这种感觉无从下手,那就自己朝着认为错的思路走,通过实践才能明白到底哪里错,怎么改,你上面的只是比较简单的,单表进行查询操作,如果你不积累错误经验,就不会有提升,你上面题无非求学生类型的平均分而已,只要对学生和类型进行分组查询求平均成绩即可
select 学生ID,测试类型,avg(测试分数) from 成绩表 group by 学生ID,测试类型
还有比较复杂的,需要进行多表联立查询,同时也是比较简单的sql,例如有四张表
学生表:学号,姓名,年龄,生日,爱好
课程表:课程编号,课程名,教师id
教师表:教师号,姓名,年龄
成绩表:ID,学生ID,课程ID,分数
问题:
1.求分数大于80的的科目所对应的老师信息
2.求平均分最高的学生信息
3.求平均成绩最低的科目所对应的教课老师信息。。。。。
再难一点的就是,给你关于用户对一个app的行为日志表,根据数据求每日新增,每日活跃,每周新增人数
select avg(测试分数) from 成绩表 group by 学生ID,测试类型
学生姓名 学生ID 课程名称 课程ID 测试类型 测试分数
求出每个学生在这门课中参加的每种类型的测试的平均分数(按次数平均)(学生 课程 测试类型 最终分数)
你这个总结已经很到位了,直接按总结的这个需求出发,由此推出结论:保留学生信息,按课程和测试类型分组
那么,数据库指令可以得出
-- 为避免学生重名,这里以ID为依据分组
select 学生ID,课程ID,测试类型,avg(测试分数) as 平均分数,count(0) as 参加次数
from 成绩表
group by 学生ID,课程ID,测试类型