实验六 触发器与存储过程

实验六 触发器与存储过程

目录

  • 实验六 触发器与存储过程
  • 1、SQL触发器:删除学生数据
    • 题目
    • 代码
    • 题解
  • 2、SQL触发器:创建成绩表插入触发器
    • 题目
    • 代码
    • 题解
  • 3、 SQL存储过程:查询订单
    • 题目
    • 代码
    • 题解
  • 4、SQL存储过程:建立存储过程,查询课程的成绩表
    • 题目
    • 代码
    • 题解
  • 5、 SQL存储函数:查询学生的平均分
    • 题目
    • 代码
    • 题解

在这里插入图片描述

1、SQL触发器:删除学生数据

题目

#创建触发器,删除学生数据时,将删除的数据备份到数据表student_bf,以备误删除时进行数据恢复。

1、student(学生表):

SNO学号CHAR(7)

SNAME姓名CHAR(10)

SSEX性别CHAR(2)

SAGE年龄SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(课程表)

CNO课程号CHAR(10)

CNAME课程名VARCHAR(20)

CCREDIT学分SMALLINT

SEMSTER学期SMALLINT

PERIOD学时SMALLINT

3、sc(选课表)

SNO 学号CHAR(7)

CNO 课程号CHAR(10)

GRADE 成绩 SMALLINT

[注意:SQL表名请用小写]

代码

#创建触发器,删除学生数据时,将删除的数据备份到数据表student_bf,以备误删除时进行数据恢复。
delimiter $$ 
create trigger students
before delete on student
for each row begin
insert into student_bf 
select * 
from student
where sno=old.sno;
end $$


题解

这段 SQL 代码定义了一个名为 “students” 的触发器,它在从 “student” 表中删除一行之前被执行。触发器将为每个被删除的行执行一次。

触发器代码使用 “before delete” 事件,这意味着触发器将在将行从 “student” 表中删除提交到数据库之前执行。

“for each row” 子句指定触发器代码将为从 “student” 表中删除的每一行执行一次。

触发器代码以一个 “insert into” 语句开始,它将一行插入到 “student_bf” 表中。假设这个表已经存在于数据库中。

接下来的 “select” 语句选择了 “student” 表中所有列,其中 “sno” 列的值与 “old.sno” 对象的值匹配。“old” 关键字指的是从 “student” 表中被删除的行。

因此,触发器代码将正在从 “student” 表中删除的行的副本插入到 “student_bf” 表中。这允许数据库在需要时保留已删除行的记录以便以后恢复。

2、SQL触发器:创建成绩表插入触发器

题目

#创建触发器,插入学生成绩时,限制必须在0-100之间。如果不在0-100之间,设置为0.

1、student(学生表):

SNO学号CHAR(7)

SNAME姓名CHAR(10)

SSEX性别CHAR(2)

SAGE年龄SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(课程表)

CNO课程号CHAR(10)

CNAME课程名VARCHAR(20)

CCREDIT学分SMALLINT

SEMSTER学期SMALLINT

PERIOD学时SMALLINT

3、sc(选课表)

SNO 学号CHAR(7)

CNO 课程号CHAR(10)

GRADE 成绩 SMALLINT

[注意:SQL表名请用小写]

代码

#创建触发器,插入学生成绩时,限制必须在0-100之间。如果不在0-100之间,设置为0.
delimiter $$
create trigger xiaohui
before insert on sc 
for each row 
begin
if new.grade<0 or new.grade>100
then set new.grade=0;
end if;
end $$

题解

这段 SQL 代码定义了一个名为 “xiaohui” 的触发器,它在向 “sc” 表中插入一行之前被执行。触发器将为每个插入操作执行一次。

触发器代码使用 “before insert” 事件,这意味着触发器将在将行插入到 “sc” 表之前执行。

“for each row” 子句指定触发器代码将为每个插入的行执行一次。

触发器代码包含了一个条件语句,它检查将要插入的新行中的 “grade” 列的值是否小于 0 或大于 100。如果是,则将 “grade” 列的值设置为 0。

这样做的目的是确保 “sc” 表中的 “grade” 列的值始终在 0 到 100 的范围内,以避免出现无效的成绩。

需要注意的是,“new” 是一个隐含的对象,它指向触发器所关联的操作(例如,INSERT 操作)中正在被插入的行。在触发器中,“new” 对象包含了正在被插入的行的所有列的值。可以通过在触发器中引用 “new” 对象的列名来访问这些值,例如 “new.column_name”。

此触发器的目的是在插入新行之前检查 “grade” 列的值,并在需要时将其设置为 0。

3、 SQL存储过程:查询订单

题目

#创建存储过程:total_order(IN orderid INT , OUT totals NUMERIC(9,2), OUT cid INT)

要求:根据输入的订单编号(order_id),返回订单总金额(total_money),顾客编号(customer_id)。

订单表:orders如下:

在这里插入图片描述

代码

#创建存储过程:total_order(IN orderid INT , OUT totals NUMERIC(9,2), OUT cid INT)
create procedure total_order(
in orderid INT,out totals NUMERIC(9,2),out cid INT)
select total_money,customer_id into totals,cid
from orders
where orderid = order_id;

题解

这段 SQL 代码定义了一个名为 “total_order” 的存储过程,它有一个输入参数 “orderid” 和两个输出参数 “totals” 和 “cid”。

存储过程的目的是查询 “orders” 表中与输入参数 “orderid” 匹配的订单的总金额和客户 ID,并将这些值赋给输出参数 “totals” 和 “cid”。

在存储过程中,“in” 关键字指定了输入参数 “orderid” 的类型为整数。

“out” 关键字指定了输出参数 “totals” 和 “cid” 的类型分别为 NUMERIC(9,2) 和整数。

存储过程的主体部分是一个 “select” 语句,它从 “orders” 表中选取与输入参数 “orderid” 匹配的订单的总金额和客户 ID,并将这些值赋给输出参数 “totals” 和 “cid”。

需要注意的是,在存储过程中,“into” 关键字用于将查询结果赋给输出参数。

4、SQL存储过程:建立存储过程,查询课程的成绩表

题目

#建立存储过程show_grade:根据学号,课程名参数,返回学生的成绩。

学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:

1、student(学生表):

SNO学号CHAR(7)

SNAME姓名CHAR(10)

SSEX性别CHAR(2)

SAGE年龄SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(课程表)

CNO课程号CHAR(10)

CNAME课程名VARCHAR(20)

CCREDIT学分SMALLINT

SEMSTER学期SMALLINT

PERIOD学时SMALLINT

3、sc(选课表)

SNO 学号CHAR(7)

CNO 课程号CHAR(10)

GRADE 成绩 SMALLINT

[注意:SQL表名请用小写]

代码

#建立存储过程show_grade:根据学号,课程名参数,返回学生的成绩。
create procedure show_grade(
in s CHAR(20),
in c VARCHAR (20),
out g SMALLINT
)
select grade into g
from sc,course
where sc.cno = course.cno
and cname = c and sno = s;

题解

这段 SQL 代码定义了一个名为 “show_grade” 的存储过程,它有两个输入参数 “s” 和 “c”,一个输出参数 “g”。

存储过程的目的是查询与输入参数 “s” 和 “c” 匹配的学生的成绩,并将查询结果赋给输出参数 “g”。

在存储过程中,“in” 关键字指定了输入参数 “s” 和 “c” 的类型分别为 CHAR(20) 和 VARCHAR(20)。

“out” 关键字指定了输出参数 “g” 的类型为 SMALLINT。

存储过程的主体部分是一个 “select” 语句,它从 “sc” 表和 “course” 表中选取与输入参数 “s” 和 “c” 匹配的记录的 “grade” 列的值,并将这个值赋给输出参数 “g”。

需要注意的是,在 “select” 语句中,“and” 连接了 “sc” 表和 “course” 表,并使用了 “where” 子句来限制结果的范围。“sc.cno = course.cno” 确保了只有在 “sc” 表和 “course” 表中的 “cno” 列匹配时,才会返回结果。“cname = c and sno = s” 确保了只有在输入参数 “s” 和 “c” 与 “sc” 表和 “course” 表中的记录匹配时,才会返回结果。

5、 SQL存储函数:查询学生的平均分

题目

#建立存储函数show_grade:根据课程号,返回该课程的平均成绩(保留两位小数)。

学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:

1、student(学生表):

SNO学号CHAR(7)

SNAME姓名CHAR(10)

SSEX性别CHAR(2)

SAGE年龄SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(课程表)

CNO课程号CHAR(10)

CNAME课程名VARCHAR(20)

CCREDIT学分SMALLINT

SEMSTER学期SMALLINT

PERIOD学时SMALLINT

3、sc(选课表)

SNO 学号CHAR(7)

CNO 课程号CHAR(10)

GRADE 成绩 SMALLINT

[注意:SQL表名请用小写]

代码

delimiter $$
create function show_grade(ccno char(10))
returns decimal(10,2)              
begin
  return(select avg(grade) from sc
  where cno=ccno);
end $$


题解

这段 SQL 代码定义了一个名为 “show_grade” 的函数,它有一个输入参数 “ccno” 和一个返回值,返回值的类型为 DECIMAL(10,2)。

函数的目的是查询与输入参数 “ccno” 匹配的课程的平均成绩,并将结果作为函数的返回值。

在函数中,“in” 关键字指定了输入参数 “ccno” 的类型为 CHAR(10)。

“returns” 关键字指定了函数的返回值类型为 DECIMAL(10,2)。

函数的主体部分是一个 “select” 语句,它从 “sc” 表中选取与输入参数 “ccno” 匹配的记录的 “grade” 列的平均值,并将这个值作为函数的返回值。

需要注意的是,在 “select” 语句中,“where” 子句限制了结果的范围,只有在 “sc” 表中的 “cno” 列匹配输入参数 “ccno” 时,才会返回结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

浅析S32K324的时钟树

S32K3XX系列的时钟树梳理 如下图为S32K3XX系列的时钟树图&#xff1a; 一、时钟源 时钟源说明FIRC快速内部RC时钟源SIRC慢速内部RC时钟源FXOSC快速外部晶振时钟源SXOSC慢速外部晶振时钟源 S32K3系列的mcu有4个时钟源如上表。 二、FIRC&#xff08;快速内部RC时钟源&#…

【A200】 TX1核心 JetPack4.6.2版本如何修改DTB文件测试全部SPI

大家好&#xff0c;我是虎哥&#xff0c;很长时间没有发布新内容&#xff0c;主要是这段时间集中精力&#xff0c;研究DTB设备树的修改&#xff0c;以适配不同载板&#xff0c;同时也是专门做了一个TX1&TX2核心&#xff0c;双网口&#xff0c;可以使用SPI 扩展CAN接口的载板…

Actuators + jolokia

Actuators + jolokia Jolokia造成的XXE漏洞 首先我们查看我们当前环境http://x.x.x.x/jolokia/list地址,是否存在reloadByURL这个方法, 这个方法是造成RCE的关键。因为logback组件提供的reloadByURL操作使我们可以从外部URL重新加载日志配置 创建logback.xml和file.dtd文件…

【神经网络】tensorflow实验9--分类问题

1. 实验目的 ①掌握逻辑回归的基本原理&#xff0c;实现分类器&#xff0c;完成多分类任务&#xff1b; ②掌握逻辑回归中的平方损失函数、交叉熵损失函数以及平均交叉熵损失函数。 2. 实验内容 ①能够使用TensorFlow计算Sigmoid函数、准确率、交叉熵损失函数等&#xff0c…

tomcat集群下的session共享和负载均衡

环境 操作系统&#xff1a;windows tomcat1&#xff1a;Apache Tomcat/7.0.52&#xff08;8085&#xff09; tomcat2&#xff1a;Apache Tomcat/7.0.52&#xff08;8086&#xff09; jre&#xff1a;1.7.0_80 nginx&#xff1a;nginx-1.20.1&#xff08;8070&#xff09; redis…

人工智能洗稿-免费自媒体洗稿工具

文字洗稿 文字洗稿是指通过修改、重组、删除、替换等手段对文本进行优化、清理和调整&#xff0c;以达到改善文章质量、增加独特性和提高可读性的目的。文字洗稿是自媒体行业的一个重要需求&#xff0c;尤其是在批量撰写文章或需要大量修改文本的情况下。文字洗稿分为自动洗稿…

如何用ChatGPT搭建品牌文本体系?(品牌名+slogan+品牌故事)

该场景对应的关键词库&#xff08;26个&#xff09;&#xff1a; 品牌名、奶茶、中文名、情感联想度、饮料、价值观/理念、发音、slogan、产品功能导向、行业性质导向、经营理念导向、消费者观念导向、口语化、修辞手法、品牌故事、创始人初心品牌故事、里程碑事件故事、产品初…

Intellij中使用Spotless 格式化代码

Spotless简介 在一些大型项目或开源项目&#xff0c;由于开发人员太多&#xff0c;导致各个代码格式不统一。会让整体项目的代码可读性变差。统一代码格式使用maven中的Spotless插件就是不错的选择。 Spotless 是一个代码格式化工具&#xff0c;它有以下功能&#xff1a; 支…

第6章 静态代理

第6章 静态代理 把所有静态资源的访问改为访问nginx&#xff0c;而不是访问tomcat&#xff0c;这种方式叫静态代理。因为nginx更擅长于静态资源的处理&#xff0c;性能更好&#xff0c;效率更高。 ​ 所以在实际应用中&#xff0c;我们将静态资源比如图片、css、html、js等交…

helm和chart

Helm helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。 he…

keil移植linux(makefile)

文章目录 运行环境&#xff1a;1.1 freeRTOS_LED工程移植1)修改cubeMX配置2)setting设置3)launch设置4)修改makefile5)修改代码6)实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 stlink 9-24v可调电源 robomaster A 板 1.1 freeRTOS_L…

第二章——进程与线程(上)

上船不思岸上人&#xff0c;下船不提船上事 文章目录 2.1.1 进程的概念&#xff0c;组成&#xff0c;特征知识总览进程的概念进程的组成——PCB程序是如何运行的进程的组成进程的特征知识回顾 2.1.2 进程的状态与转换&#xff0c;进程的组织知识总览创建态&#xff0c;就绪态运…

yolov5 8系列 labelme数据标注 并生成训练数据集

yolov5 8系列 labelme数据标注 数据集生成终极教程 一.数据集准备二.转换为yolo 数据集 一.数据集准备 创建一个data 文件夹在data文件夹下创建一个images 文件夹将所有图片数据放入images文件夹下 使用labelme标注数据 python环境下使用 pip install labelme 安装labelme在c…

缓存击穿,穿透,雪崩

一、缓存击穿 单个热点key&#xff0c;在不停的扛着大并发&#xff0c;在这个key失效的瞬间&#xff0c;持续的大并发请求就会击破缓存&#xff0c;直接请求到数据库 解决方案 使用互斥锁&#xff08;Mutex Key&#xff09;&#xff0c;只让一个线程构建缓存&#xff0c;其他…

Golang中的运算符

目录 运算符 算术运算符 代码案例&#xff1a; 关系运算符 代码案例&#xff1a; 逻辑运算符 代码案例&#xff1a; 位运算符 代码案例&#xff1a; 赋值运算符 代码案例&#xff1a; 其他运算符 运算符 算术运算符 Go语言中的算术运算符包括加、减、乘、除和取模…

4.2和4.3、MAC地址、IP地址、端口

计算机网络等相关知识可以去小林coding进行巩固&#xff08;点击前往&#xff09; 4.2和4.3、MAC地址、IP地址、端口 1.MAC地址的简介2.IP地址①IP地址简介②IP地址编址方式③A类IP地址④B类IP地址⑤C类IP地址⑥D类IP地址⑧子网掩码 3.端口①简介②端口类型 1.MAC地址的简介 …

Mac电脑配置李沐深度学习环境[pytorch版本]使用vscode

文章目录 第一步 M1芯片安装Pytorch环境安装Miniforge创建虚拟环境安装Pytorch 第二步 下载李沐Jupyter文件第三步 配置vscode参考 第一步 M1芯片安装Pytorch环境 安装Miniforge Mac打开终端&#xff08;Mac电脑如何启动终端&#xff1f;打开启动台&#xff0c;搜索终端即可&…

Python 中 随机数 random库 学习与使用

python中的随机数应用大体包含&#xff0c;随机整数、随机浮点数 和 获取随机数序列三类。 一. 随机整数 1.1 随机整数&#xff0c;包含上下限&#xff08;闭区间&#xff09; randint(a, b)&#xff1a;随机选取 [a, b] 之间的一个整数&#xff0c;随机整数包含a 和 b&#…

Windows编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源

Windows资源是一种二进制数据&#xff0c;由链接器链接进程序成为程序的一部分&#xff0c;通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的&#xff0c;也可以是用户自定义的。在本篇文章中为大家讲解菜单资源&#xff0c;上下文菜单&#…

PMP证书“扫盲”时间2023年考证人快看过来

二&#xff0c;PMP报考指南 学历与工作经验要求&#xff1a; 本科及以上学历&#xff0c;三年或以上的项目管理工作经验&#xff1b; 专科及以上学历&#xff0c;五年或以上的项目管理工作经验。 项目管理培训&#xff1a;35小时以上的项目管理教育/培训。 备注&#xff1…