题目
1,查询平均成绩大于60分的同学的学号和平均成绩
2,查询所有同学的学号,姓名,选课数,总成绩
3,查询性’李’的老师个数
4,查询’python’课程比’java’课程成绩高的所有学生的学号
5,查询没有学过王老师课的同学的学号,姓名
创建数据库,根据题目创建表
进入mysql创建数据库
create database 数据库名 charset utf8;
选择数据库
use 数据库名
根据上边的题目,可以推算出需要四张表
表 | 字段 |
---|---|
学生表 | id(约束:逐渐自增) name学生名称 |
老师表 | id(约束:逐渐自增) name老师名称 |
课程表 | id(约束:逐渐自增) name老师名称 tid老师id |
分数表 | id(约束:逐渐自增) name科目名字 sid学生id cid科目id score分数 |
## 创建老师表 字段 id主键自增 name老师名字
# create table teacher(id int primary key auto_increment,name varchar(100));
##创建科目表 id主键自增 name科目名字 tid老师id
# create table course(id int primary key auto_increment,name varchar(100),tid int);
##创建学生表 id主键自增 name学生名字
# create table stu(id int primary key auto_increment,name varchar(100));
##创建分数表 id主键自增 name科目名字 sid学生id cid科目id score分数
# create table score(id int primary key auto_increment,sid int,cid int,score int);
##老师表数据
# insert into teacher values(0,'王老师'),(0,'李老师');
##科目表数据
# insert into course values(0,'java',1),(0,'python',2);
## 学生表数据
# insert into stu values(0,'小明'),(0,'小李'),(0,'小张');
## 分数表数据
# insert into score values(0,1,1,50),(0,1,2,100),(0,2,1,60),(0,3,2,70);
老师表结构及数据
学生表结构及数据
科目表结构及数据
分数表结构
题目讲解
第一题
1,查询平均成绩大于60分的同学的学号和平均成绩
avg()求出平津成绩 group by 根据某个字段进行分组 having 查询结果后进行过滤
select sid,avg(score) as sc from score group by sid having sc>60;
第二题
2,查询所有同学的学号,姓名,选课数,总成绩
方法一
查询学生id 名字 使用count()函数得出选课数 sum()函数得出总成绩 学生表内连接分数表 通过学生id进行链接 然后根据学生id进行分组
select stu.id,stu.name,count(score.id),sum(score.score) from stu inner join score on stu.id =score.sid group by stu.id,stu.name;
方法二
第一步: 先查询分数表 查询出分数表中的学生id count()函数得出选课数 sum()函数得出总成绩 根据sid进行分组
select sid,count(id),sum(score) from score group by sid;
第二步:因为题目上还需要显示学生的姓名所以还要链接学生表
查询学生表 通过内连接 查询的分数表的数据 别名 as b 通过共同的sid链接
select stu.name,b.* from stu inner join (select sid,count(id),sum(score) from score group by sid) as b on stu.id=b.sid;
第三题
3,查询性’李’的老师个数
显示老师名称 利用count()计算出行李老师的个数 where条件查询 name like姓李的老师 ‘李%’ 根据老师名字进行分组group by分组
select name,count(*) from teacher where name like '李%' group by name;
第四题
4,查询’python’课程比’java’课程成绩高的所有学生的学号
第一步:查询出所有python的学生学号以及分数
select score.score,score.sid from score inner join course on score.cid=course.id where course.name='python';
第二步: 查询出所有java的学生学号以及分数
select score.score,score.sid from score inner join course on score.cid=course.id where course.name='java';
python查询出的数据 别名a java查询出的数据别名b
查询a 使用内连接 b数据通过sid学生id链接 然后链接学生表 同样a.sid进行连接学生表 最后where条件 a的分数大于b的分数’
select stu.name,a.score as python,b.score as java from (select score.score,score.sid from score inner join course on score.cid=course.id where course.name='python')
as a inner join (select score.score,score.sid from score inner join course on score.cid=course.id where course.name='java')
as b on a.sid=b.sid inner join stu on a.sid=stu.id where a.score>b.score;
第五题
5,查询没有学过王老师课的同学的学号,姓名
第一步:分数表查询上过王老师课的所有学生id 通过内连接查询出分数表中王老师教过的课程
查询课程表得出王老师教的课程id 内连接老师id 通过tid链接 条件是teacher.name=王老师
select course.id from course inner join
teacher on course.tid=teacher.id where teacher.name='王老师';
第二步: 查询出所有学过王老师课的学生id 通过分数表查询 分数表中有学生id和课程id 通过课程id就可以得到老师信息
select sid from score where cid in(select course.id from course inner join
teacher on course.tid=teacher.id where teacher.name='王老师');
上边两步都能查出数据后,就可所以进行查询了
查询学生表 看那个学生id不在王老师教过的学生id中
select * from stu where id not in(select sid from score where cid in(select course.id from course inner join
teacher on course.tid=teacher.id where teacher.name='王老师'));