mysql查询语文比数学成绩高的学号_MySQL数据库入门(九)多表复杂查询练习及讲解-中...
建表与数据准备
j建库和建表的操作请参考“多表复杂查询练习及讲解-上”的内容,在此不再赘述。
use day5; # 切换day5为当前数据库
show tables;
+----------------+
| Tables_in_day5 |
+----------------+
| course |
| score |
| student |
| teacher |
+----------------+
练习题
第六题:
查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分:
这题很简单,不需要连表,只要课程id、最高分和最低分,用分组函数就能搞定:
select course_id 课程id,max(num) 最高分,min(num) 最低分
from score
group by course_id;
第七题:
查询至少有一门课与学号1所学课程相同的学生学号和姓名:
1.从socre表中查出学号1学的全部课程id:
select course_id
from score
where student_id=1;
2.再从score表中找含有学号1课程的记录,记得要去重而且要去掉学号1:
select distinct student_id
from score
where student_id!=1 and course_id in(
select course_id
from score
where student_id=1);
3.最后与student表拼接,显示学号和姓名,注意要right join(因为右表记录不能遗漏的),另外可以加上order by学号更加美观:
select sid 学号,sname 姓名
from student
as a right join
(select distinct student_id
from score
where student_id!=1 and course_id in(
select course_id
from score
where student_id=1))
as b on a.sid=b.student_id
order by 学号;
第八题:
查询语文成绩比数学成绩好的学生学号及名字:
这道题这里讲一个新东西,用变量保存查询结果及调用变量保存的查询结果。请注意变量的用法——@变量名字:
1.首先查询course表中语文的课程id和数学课程的id:
select @course1:=cid # 查询语文课的id,保存到变量course1中
from course
where cname='语文';
select @course2:=cid # 查询数学课的id,保存到变量course2中
from course
where cname='数学';
2.做一个学号、语文课成绩、数学课成绩的连表:
select a.学号,a.课程1,b.课程2
from(
select student_id 学号,num 课程1
from score
where course_id=@course1) a
inner join(
select student_id 学号,num 课程2
from score
where course_id=@course2) b
on a.学号=b.学号
where 课程1>课程2;
3.最后与student表拼接,显示学号和姓名,注意要right join(因为右表记录不能遗漏的),另外可以加上order by学号更加美观:
select sid 学号,sname 姓名
from student
right join(
select a.学号,a.课程1,b.课程2
from(
select student_id 学号,num 课程1
from score
where course_id=@course1) a
inner join(
select student_id 学号,num 课程2
from score
where course_id=@course2) b
on a.学号=b.学号
where 课程1>课程2) c
on student.sid=c.学号
order by 学号;
注意:这一题运用了一个新技巧,临时变量保存临时查询结果。为了提高代码的复用率,在经常变更查询内容但不变更查询条件的情况下,用临时变量单独保存查询内容会很方便。另外就是如果发现某些查询的结果需要反复用到,那么可以先将该结果保存到临时变量中,这样可以减少查表次数从而提高查询效率。
第九题:
查平均成绩大于60分的学生学号、姓名、平均成绩,结果按成绩从高到低排序:
这一题写SQL代码难度不大,难的是要找出题中隐含条件。在这道题中要找出平均成绩大于60分的学生,但在数据库存在有些学生部分课程缺考的情况,缺考的课程应该按0计算!所以不能直接用avg(num)>60来作为having条件。
1.首先查course表得出总共有几门课程:
select @total:=count(*)*60 # 计算平均成绩大于60考分的总数
from course;
2.再从score表查总成绩大于@total的学生,获取学号和平均成绩:
select student_id 学号,avg(num) 平均成绩
from score
group by student_id
having sum(num)>@total
order by 平均成绩 desc;
3.最后连接student表,显示学生学号、姓名、平均成绩:
select 学号,sname 姓名,平均成绩
from student a
inner join(
select student_id 学号,avg(num) 平均成绩
from score
group by student_id
having sum(num)>@total
order by 平均成绩 desc) b
on a.sid=b.学号;
第十题:
查询所有学生的学号、姓名、总成绩、课程数,按总成绩从高到低排序:
这一题写SQL代码难度不大,但还是有很多人会做错。请注意题目要求是查询所有学生的信息,连表的时候必须使用student左连接右查询子表,这样才能查到所有学生的信息!
请实际运行一下代码,就会发现有一个学生是没成绩的。假如用的是inner join那么答题结果就不会包含没成绩的学生。
select student.sid 学号,student.sname 姓名,b.总成绩,b.课程数
from student
left join
(select student_id 学号,count(num) 课程数,sum(num) 总成绩
from score
group by student_id)
as b on student.sid=b.学号
order by 总成绩 desc;
第十一题:
查询没上过“江成”老师课的学生学号和姓名;
这一题有难度,要避开两个坑:一是要想到一名老师可能教多门课;二是要会用逆向思维,从score表中找出所有上过“江成”老师课的学生,然后再从studeng表中排除那些学生,剩下的就是没上过“江成”老师课的学生。
1.从teacher表中找出“江成”老师的id,再去course表中找出“江成”老师教的全部课程:
select cid
from course
where teacher_id=(
select tid
from teacher
where tname='江成');
2.从score表中找出所有学过“江成”老师’的学生id,另外要记得用distinct去重:
select distinct student_id
from score
where course_id in (
select cid
from course
where teacher_id=(
select tid
from teacher
where tname='江成'));
3.从student表中找出所有不在第二步表中的学生:
select sid 学号,sname 姓名
from student
where sid not in(
select distinct student_id
from score
where course_id in (
select cid
from course
where teacher_id=(
select tid
from teacher
where tname='江成')));
第十二题:
查询学过“江成“老师所有课程的学生学号和姓名:
这一题比上一题还要难,解题思路是首先要找出这位老师教的所有课程(可能不止一门课),其次计算这位老师教了几门课;然后找出学过这位老师课程的学生另外排除掉课程数量不足的学生;最后再拼接学生表列出学号和姓名。
1.找出“江成”老师教的全部课程:
select cid
from course
where teacher_id=(
select tid
from teacher
where tname='江成');
2.算出“江成”老师教几门课:
select @total:=count(*)
from course
where teacher_id=(
select tid
from teacher
where tname='江成');
3.找出学过“江成”老师课的学生,只保留成绩数量等于老师教的课程数的学生:
select student_id
from score c
inner join(
select cid
from course a
inner join(
select tid
from teacher
where tname='江成') b
on a.teacher_id=b.tid) d
on c.course_id=d.cid
group by student_id
having count(student_id)=@total;
4.再将第三步的表与student表拼接,最终显示学过“江成“老师所有课程的学生学号和姓名:
select sid 学号,sname 姓名
from student e
inner join(
select student_id
from score c
inner join(
select cid
from course a
inner join(
select tid
from teacher
where tname='江成') b
on a.teacher_id=b.tid) d
on c.course_id=d.cid
group by student_id
having count(student_id)=@total) f
on e.sid=f.student_id
order by 学号;
标签:多表,入门,学号,course,student,MySQL,where,id,select
来源: https://blog.csdn.net/m0_47670683/article/details/113785061
mysql查询语文比数学成绩高的学号_MySQL数据库入门(九)多表复杂查询练习及讲解-中...相关推荐
- MySQL数据库入门(十)多表复杂查询练习及讲解-下
建表与数据准备 建库和建表的操作请参考"多表复杂查询练习及讲解-上"的内容,在此不再赘述. use day5; # 切换day5为当前数据库show tables; +------ ...
- mysql查询姓名第二个字_mysql数据库(二)——表的查询
1.单表查询 1.1 查询语法 SELECT 字段1,字段2... FROM 表名 WHERE 条件 GROUP BY field HAVING 筛选 ORDER BY field LIMIT 限制条 ...
- 高级筛选英语或计算机分数大于85,利用高级筛选功能筛选出语文或数学成绩大于等于80的所有记录...
利用高级筛选功能筛选出语文或数学成绩大于等于80的所有记录 选择全部数据, 按语文成绩排序,删除低于80的行: 再按分别数学.英语排序删除相应行. 剩下的都满足. 只筛选三次,手动操作比输入 正则表达 ...
- 题目32:给出一名学生的语文和数学成绩,判断他是否恰好有一门课不及格(成绩小于60分)。
题目转载:http://python.wzms.com/s/1/26 题目描述: 给出一名学生的语文和数学成绩 判断他是否恰好有一门课不及格(成绩小于60分) 输入格式: 一行,包含两个在0到100之 ...
- mysql数据意外删了怎么办_MySQL数据库意外崩溃导致表数据文件损坏无法启动怎么办...
MySQL数据库意外崩溃导致表数据文件损坏无法启动怎么办 发布时间:2020-07-20 13:45:46 来源:亿速云 阅读:57 作者:小猪 这篇文章主要为大家展示了MySQL数据库意外崩溃导致表 ...
- hive SQL 创建数据库,创建hive表、查询时,其表名,字段,统统不区分大写(在底层一律转换为小写)
hive SQL 创建数据库,创建hive表.查询时,其表名,字段,统统不区分大写(在底层一律转换为小写) (1).默认default数据库 hive默认自带一个名为default的数据库,如果建表时 ...
- MySQL三表查询(学生表、课程表、成绩表)查询出语文成绩比数学成绩高的学生信息
有三张表 学生表 课程表 成绩表 要求查处语文成绩低于数学成绩的学生信息 先去课程表中查出课程cid select cid from course where cname='语文'; select c ...
- 用mysql查询所以同学学号_mysql数据库练习查询41题答案
2.查询"生物"课程比"物理"课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - ...
- mysql数据库入门教程(4):查询讲解大全
SQL脚本导入 开始 在进行查询之前,必须得有写好的sql文件吧. 先导入写好的sql脚本 打开sqlyang客户端 右击root@localhost 选择执行sql脚本 选择文件,点击执行,最后点击 ...
最新文章
- CI框架 -- 附属类
- [CQOI2015]选数(数论分块+杜教筛)
- 开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3
- 使用Python扩展库spleeter分离MP3音乐文件中的伴奏和人声
- PyTorch实战福利从入门到精通之四——卷积神经网络CIFAR-10图像分类
- Linux系统管理(7)——Linux单用户模式详解 及应用场景
- Extjs Grid 数据绑定 json 分页 不分页
- 计算机用户名起什么好,如何随机取名计算机名-如何改计算机用户名
- 整理了25个Python文本处理案例,收藏!
- 2022年最新陕西水利水电施工安全员考试题库及答案
- Web身份验证(WebAuthn)
- The Intriguing Obsession
- Cloud IDEs For Web Developers – Best Of
- pytesseract 安装错误总结
- 使用javascript制作 滚动字幕及时钟
- 洞悉物联网发展1000问之智能外卖会挑战饿了吗?
- UOS与Deepin OS区别详解
- pt, px, DPI: 关于长度单位的误解
- 在ESXi界面给虚拟机配的内核数与虚机内任务管理器显示数不一致
- Unity3D VR 动画暂停播放