Mysql学习7
1 测试表数据
有3个表S(学生表),C(课程表),SC(学生选课表)
S(SNO,SNAME)代表(学号,姓名)
C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩)
1.1 课程表
1.2 学生表
1.3 学生选课表
2 练习题
2.1 找出没选过“黎明”老师的所有学生姓名
第一步;从c表中找出黎明老师的课程编号
select cno from c where cteacher = '黎明';
第二步:从sc表中找出选黎明老师的学生的学号
select sno from sc where cno = ( select cno from c where cteacher = '黎明');
第三步:从s表中选择sno不在上表中的学生姓名
select
sno,sname
from
s
where sno not in (select sno from sc where cno = ( select cno from c where cteacher = '黎明'));
2.2 列出2门以上(含2门)不及格(<60分的)学生姓名及平均成绩
第一步:找出不及格门数超过两门的学生姓名
select
sc.sno ,s.sname
from
sc sc
join
s
on
sc.sno = s.sno
where
sc.scgrade < 60
group by
sc.sno
having
count(*) > 2;
第二步:求出每个学生的平均成绩
select
sno,avg(scgrade)
from
sc
group by
sno;
第三步:将上边两张表进行表关联
select
t1.*,t2.avggrade
from
(....) t2
join
(....) t1
on
t1.sno = t2.sno;
2.3 既学过1号课程又学过2号课所有学生的姓名
第一步:找出学了1号课的学生
select sno from sc where cno = 1;
第二步:在上边的学生中找出选了2号课的学生
select
sno
from
sc
where cno = 2 and sno in (select sno from sc where cno = 1);
第三步;在s表中找出学号在上表的学生姓名
select sname from s where sno in (t);
第三步还可以写成:将t表和学生表进行关联。
2.4 用一条SQL语句查询出每门课都大于80分的学生姓名
select
distinct name
from
t_student
where
name not in( select name from t_student where(fenshu < 80));
select
name
from
t_student
group by
name
having
min(fenshu) > 80;