Bootstrap

mysql逻辑查询练习题

题目

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='王老师'));

在这里插入图片描述

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;