MySQL 数据库操作练习:学生信息管理系统实例
本文围绕学生信息管理系统,基于 student 和 score 表展开 MySQL 实操。先介绍表结构设计,包含学生表(存基础信息)与成绩表(录成绩数据 ),并完成数据插入。接着通过 15 类典型查询示例,涵盖基础查询、分页、条件筛选、分组统计、连接查询等,从多维度演示 MySQL 常用操作,助读者掌握数据库查询核心技能,适配学习与实践场景,为处理数据查询需求提供实操参考 。
MySQL 数据库操作练习:学生信息管理系统实例
在数据库学习过程中,通过实际案例练习 SQL 语句的使用是掌握技能的关键。本文基于学生信息管理系统的场景,通过具体的表结构设计和 SQL 查询示例,展示 MySQL 的常用操作,适合初学者参考学习。
一、数据库表结构设计
本次案例中涉及两个核心表:student(学生表)和score(成绩表),表结构设计如下:
1. 学生表(student)
包含学生的基本信息,字段设计如下:
create table student(
id int(10) not null unique primary key, -- 学生ID(主键)
name varchar(20) not null, -- 姓名
sex varchar(4), -- 性别
birth year, -- 出生年份
department varchar(20), -- 所属院系
address varchar(50) -- 家庭地址
);
2. 成绩表(score)
记录学生的课程成绩信息,字段设计如下:
create table score(
id int(10) not null unique primary key auto_increment, -- 成绩记录ID(自增主键)
stu_id int(10) not null, -- 关联学生ID(外键关联student表的id)
c_name varchar(20), -- 课程名称
grade int(10) -- 成绩
);
二、初始化数据
为了进行后续查询练习,我们需要向表中插入测试数据:
1. 插入学生数据
insert student values(901,'张三丰','男',2002,'计算机系','北京市海淀区');
insert student values(902,'周全有','男',2000,'中文系','北京市昌平区');
insert student values(903,'张思维','女',2003,'中文系','湖南省永州市');
insert student values(904,'李广昌','男',1999,'英语系','辽宁省皋新市');
insert student values(905,'王翰','男',2004,'英语系','福建省厦门市');
insert student values(906,'王心凌','女',1998,'计算机系','湖南省衡阳市');
2. 插入成绩数据
insert into score values(null,901,'计算机',98);
insert into score values(null,901,'英语',80);
insert into score values(null,902,'计算机',65);
insert into score values(null,902,'中文',88);
insert into score values(null,903,'中文',95);
insert into score values(null,904,'计算机',70);
insert into score values(null,904,'英语',92);
insert into score values(null,905,'英语',94);
insert into score values(null,906,'计算机',49);
insert into score values(null,906,'英语',83);
三、常用 SQL 查询示例
1. 分别查询student表和score表的所有记录
select * from student;
+-----+-----------+------+-------+--------------+--------------------+
| id | name | sex | birth | department | address |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张三丰 | 男 | 2002 | 计算机系 | 北京市海淀区 |
| 902 | 周全有 | 男 | 2000 | 中文系 | 北京市昌平区 |
| 903 | 张思维 | 女 | 2003 | 中文系 | 湖南省永州市 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 |
| 905 | 王翰 | 男 | 2004 | 英语系 | 福建省厦门市 |
| 906 | 王心凌 | 女 | 1998 | 计算机系 | 湖南省衡阳市 |
+-----+-----------+------+-------+--------------+--------------------+
6 rows in set (0.01 sec)
select * from score;
+----+--------+-----------+-------+
| id | stu_id | c_name | grade |
+----+--------+-----------+-------+
| 1 | 901 | 计算机 | 98 |
| 2 | 901 | 英语 | 80 |
| 3 | 902 | 计算机 | 65 |
| 4 | 902 | 中文 | 88 |
| 5 | 903 | 中文 | 95 |
| 6 | 904 | 计算机 | 70 |
| 7 | 904 | 英语 | 92 |
| 8 | 905 | 英语 | 94 |
| 9 | 906 | 计算机 | 49 |
| 10 | 906 | 英语 | 83 |
+----+--------+-----------+-------+
10 rows in set (0.00 sec)
查询结果会返回所有学生的完整信息,包括 ID、姓名、性别、出生年份、院系和地址。
2. 查询student表的第2条到5条记录
select * from student limit 1,4;
+-----+-----------+------+-------+------------+--------------------+
| id | name | sex | birth | department | address |
+-----+-----------+------+-------+------------+--------------------+
| 902 | 周全有 | 男 | 2000 | 中文系 | 北京市昌平区 |
| 903 | 张思维 | 女 | 2003 | 中文系 | 湖南省永州市 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 |
| 905 | 王翰 | 男 | 2004 | 英语系 | 福建省厦门市 |
+-----+-----------+------+-------+------------+--------------------+
4 rows in set (0.00 sec)
LIMIT 语法说明:LIMIT 偏移量, 行数
- 偏移量为 1:表示从第 2 条记录开始(索引从 0 开始)
- 行数为 4:表示查询 4 条记录
- 结果返回 id 为 902、903、904、905 的 4 条学生信息
3. 从student表中查询计算机系和英语系的学生的信息
select * from student where department = '计算机系' or department ='英语系';
+-----+-----------+------+-------+--------------+--------------------+
| id | name | sex | birth | department | address |
+-----+-----------+------+-------+--------------+--------------------+
| 901 | 张三丰 | 男 | 2002 | 计算机系 | 北京市海淀区 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 |
| 905 | 王翰 | 男 | 2004 | 英语系 | 福建省厦门市 |
| 906 | 王心凌 | 女 | 1998 | 计算机系 | 湖南省衡阳市 |
+-----+-----------+------+-------+--------------+--------------------+
4 rows in set (0.00 sec)
该查询会返回所有属于计算机系或英语系的学生信息。
4.从student表中查询计算机系和英语系的学生的信息
select * from student where (2025-birth)<22;
+-----+--------+------+-------+------------+--------------------+
| id | name | sex | birth | department | address |
+-----+--------+------+-------+------------+--------------------+
| 905 | 王翰 | 男 | 2004 | 英语系 | 福建省厦门市 |
+-----+--------+------+-------+------------+--------------------+
1 row in set (0.00 sec)
通过出生年份计算年龄(假设当前年份为 2025),筛选出年龄小于 22 岁的学生。
5. 按院系统计学生人数
select department,count(*) from student group by department;
+--------------+----------+
| department | count(*) |
+--------------+----------+
| 计算机系 | 2 |
| 中文系 | 2 |
| 英语系 | 2 |
+--------------+----------+
3 rows in set (0.00 sec)
使用GROUP BY对院系进行分组,结合count(*)函数统计每个院系的学生数量。
6. 查询各课程的最高分
select c_name,max(grade) from score group by c_name;
+-----------+------------+
| c_name | max(grade) |
+-----------+------------+
| 计算机 | 98 |
| 英语 | 94 |
| 中文 | 95 |
+-----------+------------+
3 rows in set (0.00 sec)
通过max(grade)函数查询每门课程的最高分数,按课程名称分组。
7. 查询特定学生的成绩
select name,c_name,grade from student s join score c on s.id=c.stu_id where name='李广昌';
+-----------+-----------+-------+
| name | c_name | grade |
+-----------+-----------+-------+
| 李广昌 | 计算机 | 70 |
| 李广昌 | 英语 | 92 |
+-----------+-----------+-------+
2 rows in set (0.00 sec)
使用JOIN连接学生表和成绩表,查询指定学生(李广昌)的所有课程成绩。
8. 左连接查询学生及成绩
select s.*,c.grade from student s left join score c on s.id=c.stu_id;
+-----+-----------+------+-------+--------------+--------------------+-------+
| id | name | sex | birth | department | address | grade |
+-----+-----------+------+-------+--------------+--------------------+-------+
| 901 | 张三丰 | 男 | 2002 | 计算机系 | 北京市海淀区 | 80 |
| 901 | 张三丰 | 男 | 2002 | 计算机系 | 北京市海淀区 | 98 |
| 902 | 周全有 | 男 | 2000 | 中文系 | 北京市昌平区 | 88 |
| 902 | 周全有 | 男 | 2000 | 中文系 | 北京市昌平区 | 65 |
| 903 | 张思维 | 女 | 2003 | 中文系 | 湖南省永州市 | 95 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 | 92 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 | 70 |
| 905 | 王翰 | 男 | 2004 | 英语系 | 福建省厦门市 | 94 |
| 906 | 王心凌 | 女 | 1998 | 计算机系 | 湖南省衡阳市 | 83 |
| 906 | 王心凌 | 女 | 1998 | 计算机系 | 湖南省衡阳市 | 49 |
+-----+-----------+------+-------+--------------+--------------------+-------+
10 rows in set (0.00 sec)
左连接确保所有学生信息都被列出,即使该学生没有成绩记录(本案例中所有学生都有成绩)。
9. 统计学生的总成绩
select name,sum(grade) from student s left join score c on s.id=c.stu_id group by name;
+-----------+------------+
| name | sum(grade) |
+-----------+------------+
| 张三丰 | 178 |
| 周全有 | 153 |
| 张思维 | 95 |
| 李广昌 | 162 |
| 王翰 | 94 |
| 王心凌 | 132 |
+-----------+------------+
6 rows in set (0.00 sec)
通过sum(grade)函数计算每个学生的总成绩,按姓名分组。
10. 计算各课程的平均分
select c_name,avg(grade) from score group by c_name;
+-----------+------------+
| c_name | avg(grade) |
+-----------+------------+
| 计算机 | 70.5000 |
| 英语 | 87.2500 |
| 中文 | 91.5000 |
+-----------+------------+
3 rows in set (0.01 sec)
使用avg(grade)函数计算每门课程的平均分数。
11. 查询成绩低于 95 分的记录
select s.*,grade,c_name from student s left join score c on s.id=c.stu_id where grade <95;
+-----+-----------+------+-------+--------------+--------------------+-------+-----------+
| id | name | sex | birth | department | address | grade | c_name |
+-----+-----------+------+-------+--------------+--------------------+-------+-----------+
| 901 | 张三丰 | 男 | 2002 | 计算机系 | 北京市海淀区 | 80 | 英语 |
| 902 | 周全有 | 男 | 2000 | 中文系 | 北京市昌平区 | 65 | 计算机 |
| 902 | 周全有 | 男 | 2000 | 中文系 | 北京市昌平区 | 88 | 中文 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 | 70 | 计算机 |
| 904 | 李广昌 | 男 | 1999 | 英语系 | 辽宁省皋新市 | 92 | 英语 |
| 905 | 王翰 | 男 | 2004 | 英语系 | 福建省厦门市 | 94 | 英语 |
| 906 | 王心凌 | 女 | 1998 | 计算机系 | 湖南省衡阳市 | 49 | 计算机 |
| 906 | 王心凌 | 女 | 1998 | 计算机系 | 湖南省衡阳市 | 83 | 英语 |
+-----+-----------+------+-------+--------------+--------------------+-------+-----------+
8 rows in set (0.00 sec)
筛选出所有成绩低于 95 分的学生及对应课程信息。
12. 按成绩降序排列
select name,grade from student s join score c on s.id=c.stu_id order by grade desc;
+-----------+-------+
| name | grade |
+-----------+-------+
| 张三丰 | 98 |
| 张思维 | 95 |
| 王翰 | 94 |
| 李广昌 | 92 |
| 周全有 | 88 |
| 王心凌 | 83 |
| 张三丰 | 80 |
| 李广昌 | 70 |
| 周全有 | 65 |
| 王心凌 | 49 |
+-----------+-------+
10 rows in set (0.00 sec)
使用order by grade desc将查询结果按成绩从高到低排序。
13. 合并查询学生 ID
select id from student union select stu_id id from score;
+-----+
| id |
+-----+
| 901 |
| 902 |
| 903 |
| 904 |
| 905 |
| 906 |
+-----+
6 rows in set (0.01 sec)
使用union合并学生表的 id 和成绩表的 stu_id,自动去除重复值。
14. 查询姓张或姓王的学生成绩
select name,department,c_name,grade from student s join score c on s.id=c.stu_id where naame like '张%' or name like '王%';
+-----------+--------------+-----------+-------+
| name | department | c_name | grade |
+-----------+--------------+-----------+-------+
| 张三丰 | 计算机系 | 计算机 | 98 |
| 张三丰 | 计算机系 | 英语 | 80 |
| 张思维 | 中文系 | 中文 | 95 |
| 王翰 | 英语系 | 英语 | 94 |
| 王心凌 | 计算机系 | 计算机 | 49 |
| 王心凌 | 计算机系 | 英语 | 83 |
+-----------+--------------+-----------+-------+
6 rows in set (0.00 sec)
使用like模糊查询匹配姓氏为 “张” 或 “王” 的学生信息及成绩。
15. 查询籍贯为湖南的学生信息
select name,(2025 - birth) 年龄,department,c_name,grade from student s join score c on s.id=c.stu_id where address like '湖%';
+-----------+--------+--------------+-----------+-------+
| name | 年龄 | department | c_name | grade |
+-----------+--------+--------------+-----------+-------+
| 张思维 | 22 | 中文系 | 中文 | 95 |
| 王心凌 | 27 | 计算机系 | 计算机 | 49 |
| 王心凌 | 27 | 计算机系 | 英语 | 83 |
+-----------+--------+--------------+-----------+-------+
3 rows in set (0.01 sec)
筛选出地址以 “湖” 开头(湖南省)的学生,并计算其年龄。
四、总结
本文通过学生信息管理系统的实例,展示了 MySQL 的常用查询操作,包括基础查询、条件查询、连接查询、分组统计、排序和分页等。这些操作是数据库开发中的基础技能,掌握这些技能可以帮助我们灵活处理各种数据查询需求。在实际应用中,还需要根据具体业务场景进行 SQL 语句的优化和扩展。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)