5.7 课堂案例:学生成绩管理的数据查询

1. 单表和多表的查询

 (1)查询入学总分前3名学生的学号sno、姓名sname和入学总分enterscore。
mysql> select sno AS 学号, sname AS 姓名, enterscore AS 入学总分
    -> from student
    -> order by enterscore desc
    -> limit 3;

(2)查询教师工号tno、姓名tname、性别sex、职称title和院系名称deptname。
mysql>  select tno AS 教师工号, tname AS 姓名, sex AS 性别, title AS 职称,deptname AS 院系名称
    -> from teacher inner join department on department.deptno=teacher.deptno;

注意拼写,表相连关键条件

(3)查询选修了“大学物理”课程的学生信息。
mysql>  select student.sno AS 学号, sname AS 姓名, grade AS 大学物理成绩
    -> from score inner join student on score.sno=student.sno
    -> where cno=(select cno from course where cname ='大学物理');

注意:

1.拼写

2.当2个表中有相同的列名时,注意声明查询的是哪一个表的列

(4)查询“大学物理”和“证券投资学”这两门课程不及格的学生。
mysql> select student.sno AS 学号, student.sname AS 姓名, course.cname AS 课程名称, score.grade AS 成绩
    ->  from score join student on score.sno=student.sno
    -> join course on score.cno= course.cno
    -> where score.grade<60 and course.cname IN('证券投资学','大学物理');

(5)查询尚未选修任何课程的学生信息。
mysql> select sno AS 学号, sname AS 姓名
    -> from student
    -> where sno NOT IN(select sno from score);

2. 使用GROUP BY子句和聚合函数

 (1)查询各院系的学生人数,要求显示结果中包含所有院系。
mysql> select department.deptname AS 院系名称, count(student.sno) AS 学生人数
    -> from student join department on student.deptno=department.deptno
    -> group by student.deptno;

(2)查询每位教师授课的班级数量,查询结果按班级数量的降序排列。
mysql>  select teacher.tname AS 姓名,count(teaching.classno) AS 教学班级数
    -> from teaching join teacher on teacher.tno=teaching.tno
    -> group by teaching.tno
    -> order by count(teaching.classno) desc;

注意:

order by 字段名或表达式 

(3)查询各院系的学生的平均成绩,查询结果按平均成绩的降序排列。
mysql> select department.deptname AS 院系名称, avg(grade) AS 平均分
    -> from score join student on student.sno=score.sno
    -> join department on student.deptno=department.deptno
    -> group by student.deptno
    -> order by avg(grade) desc;

注意: 记得写分组

(4)查询每门课程的选课人数,结果按照选课人数的降序显示。
mysql> select course.cname AS 课程名称, count(score.cno) AS 学生人数
    -> from score join course on score.cno= course.cno
    -> group by score.cno
    -> order by count(score.cno) desc;

(5)查询各门课程的平均成绩,查询结果按平均成绩的降序排列。
mysql> select score.cno AS 课程编号, course.cname AS 课程名称, avg(grade) AS 平均分
    -> from score join course on score.cno=course.cno
    -> group by score.cno
    -> order by avg(grade) desc;

(6)查询每个学生平均成绩和选课门数,查询结果先按照选课数量的降序排序,选课数
量相同时按照平均成绩降序排序。
mysql> select score.sno AS 学号, student.sname AS 姓名, count(score.cno) AS 选课数量, avg(grade) AS 平均成绩
    -> from score join student on score.sno=student.sno
    -> group by score.sno
    -> order by count(score.cno) desc,avg(grade) desc;

(7)查询选修课程少于3门的学生信息。
mysql> select student.sno AS 学号, student.sname AS 姓名, count(score.cno) AS 选课数量
    -> from score join student on student.sno=score.sno
    -> group by(score.sno)
    -> having count(score.cno)<3;

(8)统计学生未通过课程的数量。
mysql> select student.sno AS 学号,student.sname AS 姓名,count(score.cno) AS 未通过课程数量
    -> from score join student on score.sno=student.sno
    -> where grade<60
    -> group by score.sno;

(9)统计每个学生已修课程的总学分。


 分析:大于等于60分才能获得学分,在成绩表course中没有表示学分的字段,可以通过学
时计算出来,每16个学时是1个学分,即hours/16。

mysql> select student.sno AS 学号,student.sname AS 姓名,count(score.cno) AS 通过课程数量, sum(hours/16) AS 总学分
    -> from student join score on student.sno=score.sno join course on course.cno=score.cno
    -> where score.grade>=60
    -> group by score.sno;

3. 子查询

 (1)查询尚未被学生选修的课程信息。
mysql> select cno AS 课程编号,cname AS 课程名称
    -> from course
    -> where cno NOT IN (select cno from score);

 (2)查询高等数学成绩低于平均值的学生。
mysql> select score.sno AS 学号, student.sname AS 姓名, score.grade AS 成绩
    -> from score,course,student,(select cno,avg(grade) AS avg_grade from score group by cno) AS t
    -> where score.sno=student.sno and score.cno=course.cno and t.cno=score.cno and grade<avg_grade and cname='高等数学';

(3)查询与“王晓红”在同一院系的其他学生的信息。
mysql> select sno AS 学号, sname AS 姓名, deptno AS 院系代码
    -> from student
    -> where deptno=(select deptno from student where sname='王晓红') and sname !='王晓红';

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

婧婧子♔♔♔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值