目录
1.查询没有选修java学生的姓名
2.查询不同老师所教不同课程的平均分从高到低显示:
3.查询出只选修一门课程的全部学生的学号和姓名:
4.按各科平均成绩从低到高和及格率的百分数从高到低顺序:
一、
相关的代码如下:
select sname
from students
where students.sid not in(select choices.sid
from choices
where cid='1003')
思路:
首先,我们知道学生姓名是在students表中的,那么全部的学号都在students表中,那么我们只需要选出选修了java课程的同学的学号,在这里用的是一个子查询语句。相关代码如上。
二、
思路:
首先,这里是不同老师不同课程的平均分,那么就需要在分组的时候,加上课程,不然会报分组的异常,嗯,这个就是关键点,代码如下:
select teacher.TId 教师id, teacher.Tname 教师姓名, course.CId 课程id , avg(sc.score) 平均成绩 from teacher , sc , course where teacher.TId =course.TId and course.CId = sc.CId group by teacher.TId , teacher.Tname , course.CId order by avg(sc.score) desc
三、查询出只选修一门课程的全部学生的学号和姓名:
思路:
“只选修一门课程”,在这里我们需要按学号对其进行分组,再用having语句对其进行判断代码如下:
select sc.sid,sname,count(1) 课程数 from sc left join student on sc.sid=student.sid group by sc.sid,sname having count(cid)=1
也可以这样:
select sc.sid,sname,(1) 课程数 from sc left join student on sc.sid=student.sid group by sc.sid,sname having count(cid)=1
四、按各科平均成绩从低到高和及格率的百分数从高到低顺序:
思路:
首先,就是要将成绩换算成绩点,那么在这里我们可以在其中重新建立一个表来作为绩点的标识,还是看代码吧:
目录
select sc.CId 课程号,avg(score) 平均成绩,(t.jige/t.num)*100 及格百分数 from sc,( select CId,count(case when score>=60 then 1 end) jige,count(*) num from sc group by CId)t where t.CId=sc.CId group by t.CId order by 及格百分数 desc,平均成绩