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 语句的优化和扩展。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐