首页 > 数据库 >pyqt+mysql实现学生学籍管理系统(带.sql和.ui文件)

pyqt+mysql实现学生学籍管理系统(带.sql和.ui文件)

时间:2025-01-14 22:57:40浏览次数:3  
标签:关系 sql pyqt 学生 课程 ui MajorID CourselD 查询

所有文件已经上传至https://github.com/shuimqy/Student-Information-Management-System-implemented-with-Qt.git

需要的话可自行下载,自己写的数据库大作业,尽量不要照搬提交。

如果对你有帮助的话,点个赞吧,有问题欢迎留言!

下面是我的涉及过程即设计报告。

需求分析

概念结构设计

逻辑结构设计

功能实现

遇到的主要问题及解决方法

总结

  • 需求分析

系统数据:

要有一定数量的学生、教师、课程、成绩等基本信息。

所以要在数据库建好后提前输入一些信息。

功能:

录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息

按学号、姓名、专业三种方式查询学生基本信息

录入一位学生一门课的成绩

查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩;查询他的必修课平均成绩、所有课程平均成绩(平均成绩应按学分加权)

查询一位学生被哪些教师教过课

查询快要被开除的学生(距被开除差3学分之内)

要实现这些功能,就要定义完整全面的数据库语义并实现,这将在概念结构设计中论述。

  • 概念结构设计

  1. 学校有若干专业,每个专业每年招若干个班,每个班有若干学生。已经有了4个基本表,但要实现这条语义,要建major(MajorID)表,主键为MajorID;class(ClassID,MajorID)表,主键为ClassID,外键为MajorID;`student-class`(StudentID,ClassID)表,主键约束为:(StudentID,ClassID),用于限制一个学生只能在加入一个班级,外键为StudentID,ClassID。
  2. 每个专业有自己的教学计划,规定了该专业相关课程的性质(必修或选修)以及授课学期。创建majorplan(MajorID,CourseID,Semester,quality),主键约束是(MajorID,CourseID),外键是MajorID、CourseID,Semester是学期,quality是课程性质。
  3. 一位教师可以给多个班带课,但不能给一个班带多门课。这是一对多关系,创建不能给一个班带多门课已在majorplan表中通过主键约束实现,创建`teacher-course`(TeacherID,CourseID)表,主键约束是(TeacherID,CourseID),因为一个老师可能教多门课,外键是TeacherID,CourseID,外键约束一般都与基本表关联。

majorplan 与 major:是一对多(1:n)关系。一个专业可以有多个专业计划,而一个专业计划只属于一个专业。

majorplan 与 course:是一对多(1:n)关系。一个专业计划可以包含多门课程,而一门课程可以属于多个专业计划。

course 与 teacher - course:是一对多(1:n)关系。一门课程可以由多个教师教授,而一个教师 - 课程关系只对应一门课程。

teacher - course 与 teacher:是多对一(n:1)关系。一个教师可以教授多门课程,而一个教师 - 课程关系只对应一个教师。

course 与 grade:是一对多(1:n)关系。一门课程可以有多个学生的成绩,而一个成绩只对应一门课程。

student 与 grade:是一对多(1:n)关系。一个学生可以有多个课程成绩,而一个成绩只对应一个学生。

student 与 student - class:是一对多(1:n)关系。一个学生只属于一个班级,而一个班级可以有多个学生。

student - class 与 class:是多对一(n:1)关系。一个班级可以有多个学生,而一个学生 - 班级关系只对应一个班级。

class 与 major:是多对一(n:1)关系。一个专业可以有多个班级,而一个班级只属于一个专业。

下面是根据语义设计出的E-R图:

  • 逻辑结构设计

根据E - R 图生成关系模型如下:

majorplan(专业计划)

关系模式:majorplan(MajorID, CourselD, Semester, quality)

主码:(MajorID, CourselD),因为这两个属性的组合能够唯一标识一个专业计划。

major(专业)

关系模式:major(MajorID)

主码:MajorID,专业编号可以唯一标识一个专业。

course(课程)

关系模式:course(CourselD, CourseName, Credits)

主码:CourselD,课程编号可以唯一标识一门课程。

teacher - course(教师 - 课程)

关系模式:teacher - course(TeacherID, CourselD)

主码:(TeacherID, CourselD),教师编号和课程编号的组合可以唯一标识一个教师教授某门课程的关系。

teacher(教师)

关系模式:teacher(TeacherID, TeacherName)

主码:TeacherID,教师编号可以唯一标识一个教师。

grade(成绩)

关系模式:grade(StudentID, CourselD, Score)

主码:(StudentID, CourselD),学生编号和课程编号的组合可以唯一标识一个学生在某门课程上的成绩。

student(学生)

关系模式:student(StudentID, StudentName, StudentGender, Birthday)

主码:StudentID,学生编号可以唯一标识一个学生。

student - class(学生 - 班级)

关系模式:student - class(StudentID, ClassID)

主码:(StudentID, ClassID),学生编号和班级编号的组合可以唯一标识一个学生属于某个班级的关系。

class(班级)

关系模式:class(ClassID, MajorID)

主码:ClassID,班级编号可以唯一标识一个班级。

外码设置:

在majorplan关系中:

MajorID是外码,参照major关系中的MajorID。

CourselD是外码,参照course关系中的CourselD。

在teacher - course关系中:

TeacherID是外码,参照teacher关系中的TeacherID。

CourselD是外码,参照course关系中的CourselD。

在grade关系中:

StudentID是外码,参照student关系中的StudentID。

CourselD是外码,参照course关系中的CourselD。

在student - class关系中:

StudentID是外码,参照student关系中的StudentID。

ClassID是外码,参照class关系中的ClassID。

在class关系中:

MajorID是外码,参照major关系中的MajorID。

  • 功能实现

在开始实现功能前,要先向数据库中录入一些数据,我在这里使用python的pandas库向数据库的表中添加数据,例如:

为了方便处理,教学计划表的数据只添加了一个学期的,每个专业一学期学4门课:

数据添加完成后,开始功能的实现:

1.录入一位学生,应包含学号、姓名、性别、出生年月、班级等信息

我做了ui界面来更好地说明这个功能的实现过程,下面是我的ui界面:

       

在这里我需要输入要录入的学生信息,之后点击信息录入,会执行下面的sql语句及代码:

第一条sql语句是向student表中添加信息,VALUES的值是ui界面中前4个edit框的文本内容。第二条sql语句是向`student-class`表中添加信息。

下面进行测试,ui输入如下:

点击执行,然后查看数据库表中的内容:

可以看到,两个表中数据均插入成功。

  1. 按学号、姓名、专业三种方式查询学生基本信息

Ui设计如下:

在左侧的三个edit框分别为查询学生信息的三种方式,点击查询后,结果将显示在右侧的table表中,sql语句及代码如下:

语句中的smv是我创建的视图,为了简化系统的设计,视图创建语句如下:

视图中的数据如下:

首先按学号查询结果如下:

按姓名查询结果如下:

按专业查询结果如下:

3.录入一位学生一门课的成绩

Ui设计如下:

因为学生专业不一样,其所学课程也不一样,输入学号后先点击查询课程,下方的课程ID框会更新选项,sql语句及代码如下:

第一个语句是查询学号对应专业下的下的课程ID,第二个语句是向grade表中插入成绩,向前面插入的学生李明添加成绩,ui输入如下:

点击录入,查看数据库表:

可以看到录入成功。

4.查询一位学生所修的课程、性质(必修或选修)、学期、学分及成绩;查询他的必修课平均成绩、所有课程平均成绩(平均成绩应按学分加权)

Ui设计如下:

Sql语句及代码如下:

newview是一个视图,创建语句如下:

数据如下:

这个视图在创建时还用到了另一个视图,创建语句如下:

可见这个视图只比grade表多了一列,这样做是为了避免在查询时的数据冗余,后面会具体说明。

平均分的计算代码如下:

下面进行测试,ui输入如下:

点击查询,结果如下:

5.查询一位学生被哪些教师教过课

这个功能其实已经在第四个功能中实现了。

  1. 查询快要被开除的学生

Ui设计入下:

sql语句和代码如下:

从视图中查询挂科学分大于2的学生ID,结果如下:

  • 遇到的主要问题及解决办法

在查询学生课程信息时,人工智能和软件工程专业的同学,CS3221025这门课会出现两次,原因是在构建试图时,使用的判别方法是grade表的CourseID相等,但是由于人工智能和软件工程这两个专业的专业计划中都有CS3221025这门课,所以会造成上面的冗余问题。

解决方法是创建一个新的视图包含grade的所有列,且多加一列major属性,这样在判断时多加一个条件即专业ID相同,即可解决冗余的问题。

  • 总结

在本实验中,我完成了数据库的构建以及前端界面的实现,收获颇多,对sql语句有了更深的了解,也明白了语义设计在数据库设计中的重要性。

标签:关系,sql,pyqt,学生,课程,ui,MajorID,CourselD,查询
From: https://blog.csdn.net/m0_74810549/article/details/145148738

相关文章

  • 【Java开发】Java、Maven、gradle、SQL、Redis常用命令大全:java程序员必备神器
    在Java开发的世界中,掌握Java、Maven、Gradle、SQL、Redis的常用命令是每个程序员的必修课。无论是构建项目、管理依赖,还是操作数据库,这些工具都能让你的开发效率提升一个档次!本文将为你整理一份超实用的命令清单,助你成为开发高手!一、Java:核心开发语言......
  • Autopy 是一款基于 Python 和 Rust 的强大 GUI 自动化库
    Autopy是一款基于Python和Rust的强大GUI自动化库,它为开发者提供了简便且高效的API来模拟鼠标和键盘的操作、在屏幕上查找颜色和位图以及显示警报。这些功能使得Autopy成为了一个跨平台的自动化工具,适用于MacOSX、Windows以及支持XTest扩展的X11系统。跨......
  • MySQL基础 数据库表的增删改
    Mysql数加科技整理一、原理定义概念定义数据库(Database)是按照数据结构来组织、存储和管理数据的建立在计算机存储设备上的仓库。数据库是长期储存在计算机内、有组织的、可共享的数据集合。分类:​ 非结构化数据:​ 数据相对来讲没有固定的特点,这种数据非常不便于检索......
  • 【花雕学编程】Arduino动手做(246)---ESP8266 NodeMCU V3 Web Server
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 【花雕学编程】Arduino动手做(246)---设置ESP8266 V3 通过串口输出软AP的IP、MAC和WiFi
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • MySQL基础函数使用
    DQL中的函数#官方函数链接https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format4.1 单行函数函数都是数据库提前给我们准备好的,所以我们可以直接调用,使用函数可以让指定的列计算出我们需要的数据单行函数:指的是操作一行数据返......
  • 用于与多个数据库聊天的智能 SQL 代理问答和 RAG 系统(4) —— 利用大型语言模型(LLM)生成
    实现一个与旅行相关的SQL数据库交互的工具,利用大型语言模型(LLM)生成和执行SQL查询,并通过语言模型处理查询结果生成最终答案。完整代码:fromlangchain_core.toolsimporttoolfromlangchain_community.utilitiesimportSQLDatabasefromlangchain.chainsimportcreate_......
  • 【转】SQL Server 时间日期 格式转换
    在SQLSERVER中,用CONVERT对日期作格式转换SELECTGETDATE()输出2025-07-0504:27:47 语句及查询结果:SelectCONVERT(varchar(100),GETDATE(),0):0516200610:57AMSelectCONVERT(varchar(100),GETDATE(),1):05/16/06SelectCONVERT(varchar(100),GETDATE()......
  • Mysql 高可用(MHA)-读写分离(Atlas)
    1.搭建主从复制(一主两从)1.1准备环境1主库:10.0.0.51/db012从库:10.0.0.52/db02,10.0.0.53/db031.2 清理环境1systemctlstopmysqld2rm-rf/data/mysql_3306/*3rm-rf/binlog/4mkdir/binlog/56创建相关目录与授权7主库操作:开启binlog和G......
  • 【转】[SQL Server] SSMS 中 SQL 语句的红色和蓝色关键字
     转自:Kimi.ai在SQLServerManagementStudio(SSMS)中,红色和蓝色关键字在SQL语句中的含义如下:蓝色关键字蓝色通常用于表示SQL语句中的关键字。这些关键字是SQL语言的核心部分,定义了SQL语句的功能和操作。常见的蓝色关键字包括:SELECTINSERTUPDATEDELETEFROMWHEREGROUPBY......