【MySQL】多表联合查询常见练习题

数据库表如下:

teacher:老师表

course:课程表

**student:**学生表

class:班级表

sc:成绩表

一、根据上面5张表写sql语句

1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

sql 复制代码
select student.*,t1.score 课程1分数,t2.score 课程2分数 from student

inner join (select * from sc where cid=1) t1 on student.sid=t1.sid

inner join (select * from sc where cid=2) t2 on t1.sid=t2.sid

where t1.score>t2.score;

2. 查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

sql 复制代码
select student.sid,sname,avg(score) from student

left join sc on student.sid=sc.sid

group by student.sid

having avg(score)>=60;
sql 复制代码
select student.sid,sname,avg(score) from sc,student

where student.sid=sc.sid

group by student.sid

having avg(score)>=60;

3. 查询在 SC 表存在成绩的学生信息

sql 复制代码
select * from student where sid in

(select sid from sc);
sql 复制代码
select distinct student.* from student

inner join sc on student.sid=sc.sid ;

4. 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

sql 复制代码
select student.sid,sname,count(cid),sum(score) from student

left join sc on student.sid=sc.sid

group by student.sid;

5. 查询「李」姓老师的数量

sql 复制代码
select count(*) from teacher where tname like '李%';

6. 查询学过「张三」老师授课的同学的信息

sql 复制代码
select * from student where student.sid in(

select sid from sc where sc.cid =(

select cid from course where course.tid=(

select tid from teacher where tname='张三'

)

    )

);

7. 查询没有学全所有课程的同学的信息

sql 复制代码
select student.*,count(cid) from student

left join sc on student.sid=sc.sid

group by student.sid

having count(cid)<(select count(*) from course);

8. 查询至少有一门课与学号为" 01 "的同学所学相同的同学的信息

sql 复制代码
select distinct student.* from student

left join sc on student.sid=sc.sid

where cid in(

    select cid from sc where sid=1 and student.sid != 1

);

9. 查询和" 01 "号的同学学习的课程完全相同的其他同学的

注意:一模一样 1.范围相同 2.个数相同

sql 复制代码
select student.* from  student

inner join sc on student.sid=sc.sid

where student.sid not in                          -- 范围(逆向)

    (select sid from sc where cid not in

       (select cid from sc where sid=1)

    )

and student.sid != 1

group by student.sid

having count(cid)=(select count(*) from sc where sid=1);  -- 个数相同

10. 查询没学过"张三"老师讲授的任一门课程的学生姓名

sql 复制代码
select sname from student where student.sid not in

    (select sid from sc where sc.cid =

       (select cid from course where course.tid =

           (select tid from teacher where tname='张三')

    )

  )

11. 查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

sql 复制代码
select student.sid,sname,avg(score) from sc,student

where score<60 and sc.sid=student.sid

group by student.sid

having count(cid)>=2;

12. 检索" 01 "课程分数小于 60,按分数降序排列的学生信息

sql 复制代码
select * from student,sc

where student.sid=sc.sid and cid=1 and score<60

order by score desc

13. 查询各科成绩最高分、最低分和平均分,以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率(及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90)

sql 复制代码
select sc.cid,cname,max(score),min(score),avg(score),

    count(case when score >=60 then score end)/count(*) * 100 及格率,

    count(case when score >=70 and score <80 then score end)/count(*) * 100 中等率,

    count(case when score >=80 and score <90 then score end)/count(*) * 100 优良率,

    count(case when score >90 then score end)/count(*) * 100 优秀率

from course,sc

where course.cid=sc.cid

group by course.cid
-- 各科成绩最高分、最低分和平均分
sql 复制代码
select sc.cid,cname,max(score),min(score),avg(score) from course,sc

where course.cid=sc.cid

group by course.cid
-- 及格率,中等率,优良率,优秀率
sql 复制代码
select cid,

    count(case when score >=60 then score end)/count(*) * 100,

    count(case when score >=70 and score <80 then score end)/count(*) * 100,

    count(case when score >=80 and score <90 then score end)/count(*) * 100,

    count(case when score >90 then score end)/count(*) * 100

from sc

group by cid
相关推荐
A15362553 分钟前
2026 电商物流系统推荐:多渠道仓配履约数字化选型指南
大数据·数据库·人工智能
tianyu23417 分钟前
MySQL字符串处理函数完全指南:从入门到实战
mysql·字符串·函数·截取
天空之外13623 分钟前
Docker安装MySQL 8.4 LTS、Docker安装Redis 7.4.x、Docker安装MinIO
java·mysql·docker
ClouGence1 小时前
CloudDM:开源免费!一站式数据库访问、SQL审核、权限与脱敏管控平台
数据库·sql·开源
(轻舟已过万重山)2 小时前
第39章 评估迭代:上线只是开始,迭代才是关键
大数据·数据库·人工智能
oradh2 小时前
Oracle参数文件(PFILE与SPFILE)维护操作总结
数据库·oracle·oracle参数·spfile·pfile
l1t2 小时前
kryonix提交的DuckDB 统一并优化标量执行器基础设施 - #24564 PR
开发语言·数据库·数据仓库·sql
鸽芷咕2 小时前
【金仓数据库征文】从 Oracle 到金仓:一次零误差的数据库国产化迁移实录
数据库·oracle
0566463 小时前
RAG 向量检索:从“查字“到“查意“
数据库·人工智能·学习·oracle
bug嘛我经常写3 小时前
dbf文件UTF-8转GBK编码,以及两编码文件互转
数据库·python