20260709MySQL作业题

907 字
5 分钟
20260709MySQL作业题

多表查询综合案例:学校课程管理系统#

1. 数据库和表结构创建#

-- 创建数据库
DROP DATABASE IF EXISTS school_management;
CREATE DATABASE school_management;
USE school_management;
-- 创建学生表
DROP TABLE IF EXISTS student;
CREATE TABLE student (
sid INT PRIMARY KEY,
sname VARCHAR(20) NOT NULL,
gender VARCHAR(2) NOT NULL DEFAULT '男',
class VARCHAR(20) NOT NULL
) COMMENT '学生表';
-- 创建课程表
DROP TABLE IF EXISTS course;
CREATE TABLE course (
cid INT PRIMARY KEY,
cname VARCHAR(30) NOT NULL,
credit INT NOT NULL DEFAULT 2
) COMMENT '课程表';
-- 创建选课表
DROP TABLE IF EXISTS sc;
CREATE TABLE sc (
scid INT PRIMARY KEY AUTO_INCREMENT,
sid INT NOT NULL,
cid INT NOT NULL,
score INT,
sc_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(sid) REFERENCES student(sid),
FOREIGN KEY(cid) REFERENCES course(cid),
CONSTRAINT sid_cid_unique UNIQUE(sid, cid)
) COMMENT '选课表';

2. 插入测试数据#

-- 插入学生数据
INSERT INTO student(sid, sname, gender, class) VALUES
(1, '张三', '男', '计算机2101'),
(2, '李四', '男', '计算机2101'),
(3, '王芳', '女', '计算机2101'),
(4, '赵敏', '女', '软件工程2101'),
(5, '刘伟', '男', '软件工程2101'),
(6, '陈静', '女', '计算机2102'),
(7, '杨洋', '男', '计算机2102'),
(8, '周杰', '男', '软件工程2102'),
(9, '林琳', '女', '软件工程2102'),
(10, '钱七', '男', '信息安全2101');
-- 插入课程数据
INSERT INTO course(cid, cname, credit) VALUES
(101, '高等数学', 4),
(102, '大学英语', 3),
(103, '数据结构', 3),
(104, '操作系统', 3),
(105, '数据库原理', 3),
(106, '计算机网络', 3);
-- 插入选课数据
INSERT INTO sc(sid, cid, score) VALUES
(1, 101, 90),
(1, 102, 85),
(1, 103, 88),
(2, 101, 75),
(2, 103, 92),
(3, 101, 88),
(3, 102, 95),
(3, 104, 80),
(4, 102, 87),
(4, 105, 91),
(5, 103, 78),
(5, 105, 85),
(6, 101, 93),
(6, 106, 89),
(7, 102, 82),
(7, 103, 90),
(8, 104, 76),
(8, 105, 88),
(9, 101, 95),
(9, 106, 92),
(10, 103, 84),
(10, 104, 87),
(10, 105, 93);

3. 查询需求#

需求1:查询所有已选课的学生信息#

要求:显示学生姓名、班级、课程名称和成绩,只显示有成绩的记录。 结果字段:学生姓名、班级、课程名称、成绩 查询类型:三表内连接

select
s.sname as 学生姓名,
s.class as 班级,
c.cname as 课程名称,
sc.score as 成绩
from student s
join sc on s.sid = sc.sid
join course c on c.cid = sc.cid;

需求2:查询所有学生及其选课情况#

要求:显示所有学生信息,包含未选任何课程的学生,未选课的学生课程名称和成绩显示为NULL。 结果字段:学号、学生姓名、班级、课程名称、成绩 查询类型:左外连接

select
s.sid as 学号,
s.sname as 学生姓名,
s.class as 班级,
c.cname as 课程名称,
sc.score as 成绩
from student s
left join sc on s.sid = sc.sid
left join course c on c.cid = sc.cid;

需求3:统计各班级学生的平均成绩#

要求:按班级分组,计算每个班级的平均成绩,只显示平均成绩大于80分的班级。 结果字段:班级、平均成绩 查询类型:分组、聚合函数、HAVING过滤

select s.class as 班级,
c.cname as 课程名称,
round(avg(sc.score),1) as 平均成绩
from student s
join sc on s.sid = sc.sid
join course c on c.cid = sc.cid
group by 班级,课程名称
having 平均成绩>80;

需求4:查询选修了”数据结构”课程的学生#

要求:使用子查询方式,查询选修了”数据结构”课程的学生信息,显示学生姓名、性别、班级和成绩。 结果字段:学生姓名、性别、班级、成绩 查询类型:子查询

# 这个子查询没有用.
select 姓名,
性别,
班级,
成绩
from (select s.sname as 姓名,
s.gender as 性别,
s.class as 班级,
sc.score as 成绩
from student s
join sc on s.sid = sc.sid
join course c on c.cid = sc.cid
where cname = '数据结构') as a;

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
20260709MySQL作业题
https://kulve.tech/posts/heimamysql/20260709mysql作业题/
作者
Kulve
发布于
2026-07-09
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Kulve
Hello, I'm Kulve.
公告
欢迎来到我的博客!这是一则示例公告。正在建设与测试此网站。
分类
标签
最新动态
站点统计
文章
17
分类
10
标签
23
总字数
33,120
运行时长
0
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.15.2
文章许可
CC BY-NC-SA 4.0