MySql练习(查询“01“课程比“02“课程成绩高的学生的信息及课程分数)
文章目录1、学生表2.课程表3.教师表4.成绩表解析:1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数2、查询 平均成绩大于等于60分的同学 的 学生编号和学生姓名和平均成绩3.查询在sc表中不存在成绩的 学生信息。4、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩5、查询"李"姓老师的数量6、查询学过"张三"老师授课的同学的信息7、查询学过编号为"01"并且也学过编号
文章目录
1、学生表
Student(SID,Sname,Sage,Ssex)
–SID 学生编号,Sname 学生姓名,Sage 年龄,Ssex 学生性别
编号 姓名 年龄 性别
1 赵雷 20 男
2 钱电 20 男
3 孙风 21 男
4 吴兰 18 女
5 孙兰 17 女
2.课程表
Course(CID,Cname,TID)
–CID --课程编号,Cname 课程名称,TID 教师编号
课程号 课程名称 教师编号
1 语文 2
2 数学 1
3 英语 3
3.教师表
Teacher(TID,Tname)
–TID 教师编号,Tname 教师姓名
教师编号 教师名
1 张三
2 李四
3 王五
4.成绩表
SC(SID,CID,score)
–SID 学生编号,CID 课程编号,score 分数
学生编号 课程编号 分数
1 1 80
1 2 71
1 3 87
2 1 88
2 2 70
2 3 89
3 1 68
3 2 78
3 3 87
4 1 67
4 2 58
4 3 89
5 1 56
5 2 89
6 3 38
解析:
1.两个表有外键才可以直接关联。(即要有同一个属性)
2.课程表 或 成绩表 是重要的中介,比如:教师表和成绩表需要课程表来连接
3.模式:
Select 结果需要的属性
From 需要用到的表
Where 条件
1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数
分析:必须要用:学生信息(Student)和课程分数(SC)
可能要用: Course、SC
select s.*, s1.score 1score , s2.score 2score //需要学生信息和两科分数
from Student s, SC s1, SC s2 //一张表两个别名 在表的数据的所有组合里找满足条件的
where //条件的组合
s.SID = s1.SID and //找同一个人
s.SID = s2.SID and
s1.CID ='01' and //比01课程比02高
s2.CID = '02' and
s1.score > s2.score;//SC表确定了课程是01,所以那一列肯定01分数
2、查询 平均成绩大于等于60分的同学 的 学生编号和学生姓名和平均成绩
学生姓名(在Student表),平均成绩(在SC表找)
mysql函数:avg(变量):对变量求平均 count()组里的数据条数、max()、min()、sum()求和
分组:group by SID //根据学生的SID进行分组,保证每一组都是同一个学生
having avg(score) >= 60;//条件:对同一个同学的分数求平均;要大于60
select s.SID,s.sname,avg(c.score) avgscore
from Student s,SC c
where s.SID = c.SID //两个表建立连接的外键
group by c.SID
having avc(c.score) >= 60;
执行顺序:where>group>having(优先级)
父子查询:先子查询
3.查询在sc表中不存在成绩的 学生信息。
Student 和SC
select *
from Student //在学生信息表里找SID不在SC表的
where SID not in
( select distinct(SID)//子查询 在学生成绩表里查询所有不重复的id(即每个学生的id)并返回
from sc) ;
4、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
Student和SC
from SC group by SID;//相同ID在一组
select s.SID,s.sname,count(*),sum(c.score) //最后计算并返回信息
from Student s,SC c
where s.SID = c.SID //先连接表
group by c.SID //再分组
5、查询"李"姓老师的数量
Teacher 模糊查询:like ‘李%’
select conut(*)
from Teacher
where tname like '李%';
6、查询学过"张三"老师授课的同学的信息
Student、Teacher,SC,Corese
select s.*
from Student s,Teacher t,SC sc,Courese c
where s.SID = sc.SID and //连接
sc.CID = c.CID and
c.TID = t.TID and
t.tname = '张三';//筛选
7、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
Student,SC
select s.*
from Student s,SC s1,SC s2 //一个表起俩名,就可以同时查两属性
where s.SID = s1.SID
and s1.SID=s2.SID
and s1.CID='01'
and s2.CID ='02';
8、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩
分析:
1.需要的表:Student、SC
2.先过滤在分组在统计判断:
from SC
where SC.score < 60 //将成绩小于60的人按SID分组,然后判断每个SID挂科数量
group by SC.SID
having count(*) > 1
方法1:是不及格的平均
select s.SID,s.sname,avg(c.score) //同一个SID在一组,计算其平均成绩
from Student s,SC c
where s.SID = c.SID and //需要同时满足的条件;按SID相等连接起来再筛选
c.score < 60//检索到了所有不及格的人和不及格的分数值,下面再分组并筛选
group by c.SID
having count(*) > 1;
方法2:所有科目的平均
select s.SID,s.sname,avg(c.score)
from Student s,SC c
where s.SID = c.SID and
s.SID in
(select SID //在成绩表里找 挂科数大于1的人的SID
from SC
where SC.score < 60
group by SC.SID
having count(*) > 1);
更多推荐
所有评论(0)