学生信息管理系统

DDL和DML

-- 创建学生表
CREATE TABLE students (student_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,gender VARCHAR(10)
);-- 创建课程表
CREATE TABLE courses (course_id INT PRIMARY KEY AUTO_INCREMENT,course_name VARCHAR(50)
);-- 创建教师表
CREATE TABLE teachers (teacher_id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),department VARCHAR(50)
);-- 创建成绩表
CREATE TABLE grades (grade_id INT PRIMARY KEY AUTO_INCREMENT,student_id INT,course_id INT,grade DECIMAL(5, 2),FOREIGN KEY (student_id) REFERENCES students(student_id),FOREIGN KEY (course_id) REFERENCES courses(course_id)
);-- 创建授课表
CREATE TABLE teachings (teaching_id INT PRIMARY KEY AUTO_INCREMENT,teacher_id INT,course_id INT,FOREIGN KEY (teacher_id) REFERENCES teachers(teacher_id),FOREIGN KEY (course_id) REFERENCES courses(course_id)
);-- 插入学生数据
INSERT INTO students (name, age, gender)
VALUES ('张三', 18, '男'),('李四', 19, '女'),('王五', 20, '男');-- 插入课程数据
INSERT INTO courses (course_name)
VALUES ('数学'),('英语'),('物理');-- 插入教师数据
INSERT INTO teachers (name, department)
VALUES ('赵老师', '数学系'),('钱老师', '英语系'),('孙老师', '物理系');-- 插入成绩数据
INSERT INTO grades (student_id, course_id, grade)
VALUES (1, 1, 85.5),(1, 2, 78.0),(2, 1, 90.0),(2, 2, 88.5),(3, 1, 75.0),(3, 3, 80.0);-- 插入授课数据
INSERT INTO teachings (teacher_id, course_id)
VALUES (1, 1),(2, 2),(3, 3);

触发器

1.当插入学生记录时,自动将其年龄字段的值限制在19岁至30岁之间

-- 当插入新学生记录时,自动将其年龄字段的值限制在19至30岁之间。
delimiter$$-- 修改分隔符从;改为$$这样在触发器中;就不会阻断程序了
CREATE TRIGGER validate_age_insert-- 创建触发器
BEFORE INSERT ON students 
FOR EACH ROW-- 每行都要触发这个触发器
begin-- 开始触发器if new.age < 19 or new.age > 30 THENSIGNAL SQLSTATE '45000' SET message_text='年龄必须在 19 至 30 岁之间';END IF;
END;-- 由于我已将;改为$$所以这里的分号就不会代表结束
$$-- 结束了
delimiter;-- 最后再讲分隔符改回;

2. 当删除学生记录时,同时删除其在成绩表中的相关记录

-- 当删除学生记录时,同时删除其在成绩表中的相关记录
delimiter$$
-- 修改分隔符从;改为$$这样在触发器中;就不会阻断程序了
CREATE TRIGGER delete_student_scores -- 创建触发器
BEFORE DELETE ON students 
FOR EACH ROW-- 每行都要触发这个触发器
begin-- 开始触发器DELETE FROM grades WHERE student_id = OLD.student_id;-- delete from 表名{where 条件}
END;-- 由于我已将;改为$$所以这里的分号就不会代表结束
$$-- 结束了
delimiter;-- 最后再讲分隔符改回;

3.当教师id发生变更时,显示报错

-- 当教师id发生变更时,显示报错
delimiter$$
CREATE TRIGGER check_teacher_id_change
BEFORE UPDATE ON teachers  
FOR EACH ROW
beginIF (OLD.teacher_id!= NEW.teacher_id) THEN SIGNAL SQLSTATE '45000' SET message_text='教师 ID 不允许变更!';END IF;
END;
$$
delimiter;

简单查询

1.查询学生信息,仅显示学生的姓名与年龄,用中文显示列名。

#查询学生信息,仅显示学生的姓名与年龄,用中文显示列名。
select studentname as'姓名',age'年龄' from students;

2.根据课程进行模糊查询,模糊查询需要可以走索引,需要给出explain语句。

# 根据课程进行模糊查询,模糊查询需要可以走索引,需要给出explain语句。
EXPLAIN SELECT * FROM courses WHERE course_name LIKE '数%';

3.统计学生成绩信息,查询所有学生成绩的科目总分,并将科目总分进行倒序排列。

# 统计学生成绩信息,查询所有学生成绩的科目总分,并将科目总分进行倒序排列。
select student_id as '学生id',sum(grade) as '科目总分' 
from grades 
group by student_id
order by sum(grade) desc;

多表联合查询

1.查询学生的基本信息,成绩信息

#查询学生的基本信息,成绩信息
SELECT u.student_id,u.studentname,u.age, ug.grade_id,ug.grade from students u
join grades ug on u.student_id=ug.student_id;

2.查询学生成绩中成绩最高的科目

#查询学生成绩中成绩最高的科目
select course_name'成绩最高的科目'from grades g INNER JOIN courses pn on g.course_id=pn.course_id where grade=(
select grade from grades GROUP BY grade ORDER BY max(grade) desc limit 1);

3.查询成绩总分最高的学生,并查询学生的全部信息与各科成绩。

#查询成绩总分最高的学生,并查询学生的全部信息与各科成绩。
select * 
from students 
JOIN
grades gs
on students.student_id=gs.student_id
WHERE
gs.student_id=(SELECT student_id from grades GROUP BY student_id ORDER BY sum(grade) desc LIMIT 1);

存储过程

#一条添加语句的存储过程,要求传入的3个参数分别为studentName,age,gender,其它数据随机,输入的数据不允许为空,且studentName的名称不允许以张李开头。
DELIMITER $$
-- 创建名为 insert_student 的存储过程
CREATE PROCEDURE insert_student(IN studentName VARCHAR(50),-- 输入参数:学生姓名IN age INT,-- 输入参数:学生年龄IN gender ENUM('男', '女')-- 输入参数:学生性别
)
BEGIN-- 如果 studentName、age、gender为空IF studentName IS NULL OR age IS NULL OR gender IS NULL THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '输入的数据不允许为空';-- 则输出的数据-- 如果学生名字以张李开头ELSEIF LEFT(studentName, 1) IN ('张', '李') THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '学生姓名不允许以张李开头';-- 则输出的数据ELSE-- 插入学生信息到 students 表中,其他字段随机生成INSERT INTO students (student_name, age, gender)VALUES (studentName, age, gender);END IF;
END $$DELIMITER ;call insert_student('张三',18,'男');-- 输入的参数

ER图

模型图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/363022.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML静态网页成品作业(HTML+CSS+JS)——家乡莆田介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有5个页面。 二、作品…

C语言基础笔记(全)

一、数据类型 数据的输入输出 1.数据类型 常量变量 1.1 数据类型 1.2 常量 程序运行中值不发生变化的量&#xff0c;常量又可分为整型、实型(也称浮点型)、字符型和字符串型 1.3 变量 变量代表内存中具有特定属性的存储单元&#xff0c;用来存放数据&#xff0c;即变量的值&a…

【Echarts】散点图 制作 气泡 类型图表

目录 需求主要代码效果展示注 需求 需参照设计图画出对应图表 主要代码 /**** 数据 ****/ this.dataList [...Array(8).keys()].map((item) > {return {ywlxmc: 业务类型 (item 1),sl: item > 4 ? 50 : 70} })/**** 气泡样式 ****/ const styleList [{offset: [56…

MySQL实训

项目名称与项目简介 股票交易系统是一个综合性的金融服务平台&#xff0c;它提供了股票买卖、交易查询、用户管理、股票信息管理以及资金账户管理等功能。系统旨在为用户提供一个安全、高效、便捷的股票交易环境&#xff0c;让用户能够实时掌握市场动态&#xff0c;做出合理的…

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中&#xff0c;社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而&#xff0c;随着技术的迅猛发展和用户需求的不断变化&#xff0c;Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界&#xff0c;分析数字社交的发展…

用英文介绍美国总统Trump: Donald J. Trump Twice Impeached (2017 – 2021)

Donald J. Trump: Twice Impeached (2017 – 2021) Link: https://www.youtube.com/watch?vJ7RC2DKf6rs&listPLybg94GvOJ9E-ZM1U6PAjgPUmz-V4-Yja&index45 Summary Summary of Donald Trump’s Rise and Presidency Donald John Trump, originally from Queens, Ne…

【MTK平台】如何学习Bluedroid A2DP Code

一 Bluedroid A2DP架构图 备注: vendor/mediatek/proprietary/packages/modules/Bluetooth/system/audio_a2dp_hw/src 目录下编译生成audio.a2dp.default.so,主要实现a2dp做为设备的功能 二 A2DP File Hierarchy ModuleFileDescriptionAudio HAL (hardware/libhardware/…

Arcgis 计算经纬度坐标并补齐6位小数

工作中我们经常需要在Arcgis中计算点的经纬度或者线的起点、终点坐标&#xff0c;为确保数据的准确性&#xff0c;我们必须保留6位小数&#xff0c;但我们在默认计算的时候偶尔会遇到算出来的经纬度坐标小数位不足6位&#xff0c;那我们应该如何补齐呢&#xff0c;这里我将方法…

智芯开发板----环境配置

一、软件准备 Keil IDE/ IAR IdeSupport_Install_Package已经上传到资源中自行下载即可。 二、IAR环境配置 1.首先将IdeSupport_Install_Package内的IAR文件复制到你的IAR安装路径中如图所示&#xff1a; 2.按如图所示的路径进行复制即可 3.以记事本的方式打开这个xml文件…

RK3588 Android13 TvSetting 中性能浮窗RAM显示bug

前言 电视产品,客户发现在设备偏好设置->高级设置->性能浮窗菜单里显示的 RAM 大小是错误的, 要求改成正确的,并且屏幕密度修改后,这个浮窗显示不全,也需要一起处理。 效果图 TvSetting 部分修改文件清单 bug 原因在于 Formatter.formatFileSize 这个 API,我们…

聚观早报 | iPhone 16核心硬件曝光;三星Galaxy全球新品发布会

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月28日消息 iPhone 16核心硬件曝光 三星Galaxy全球新品发布会 苹果正多方下注布局AI商店 黄仁勋2024年薪酬3400…

OpenHarmony开发实战:HDF驱动开发流程

概述 HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架&#xff0c;为驱动开发者提供驱动框架能力&#xff0c;包括驱动加载、驱动服务管理、驱动消息机制和配置管理。并以组件化驱动模型作为核心设计思路&#xff0c;让驱动开发和部署更加规范&#xff0c;旨在…

构建个人文件上传服务:Python Flask实现上传和下载完整指南

介绍 在本教程中&#xff0c;我们将学习如何使用Python Flask框架将文件上传到服务器&#xff0c;并使用SQLite数据库来跟踪上传的文件。我们将提供后端代码和一个示例项目的Git链接&#xff0c;以便您可以轻松地跟随本教程。 准备工作 首先&#xff0c;您需要安装Python和F…

Java基础知识-线程

Java基础知识-线程 1、在 Java 中要想实现多线程代码有几种手段&#xff1f; 1. 一种是继承 Thread 类 2. 另一种就是实现 Runnable 接口 3. 最后一种就是实现 Callable 接口 4. 第四种也是实现 callable 接口&#xff0c;只不过有返回值而已 2、Thread 类中的 start() 和 …

Python 面试【★★★】

阐述以下方法 classmethod, staticmethod, property&#xff1f; 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;

手机远程控制另一台手机的全新使用教程(安卓版)

看完这篇文章&#xff0c;你可以了解到安卓手机如何远程控制安卓手机&#xff0c;以及苹果手机如何远程控制安卓手机。 如果想要用安卓手机远程管控苹果手机&#xff0c;或者苹果手机远程管控另一台苹果手机&#xff0c;请点击查看视频《手机远程管控另一台手机的全新使用教程…

springcloud第4季 分布式事务seata作用服务搭建1

一 seata作用 1.1 seata简介 1.seata是一款解决分布式事务的解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 1.2 seata的术语 一个中心&#xff1a;全局事务id&#xff0c;xid&#xff0c;在调用服务链路的上下文中进行传播。TC(Transa…

使用API有效率地管理Dynadot域名,为文件夹中的域名设置域名转发

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

VUE大屏的开发过程(纯前端)

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;工作多年做过各类项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何想要讨论和学习的问题可联系我&#xff1a;1…

基于Redis和openresty实现高并发缓存架构

目录 概述缓存架构设计实践代码路由业务封装redis 效果 概述 本文是对项目中 QPS 高并发相关问题的一种解决方案&#xff0c;利用 Nginx 与 Redis 的高并发、超低延迟响应&#xff0c;结合 Canal 进行实现。 openrestry官网 当程序需要提供较高的并发访问时&#xff0c;往往需…