实验六 触发器与存储过程

news2024/9/23 1:31:14

实验六 触发器与存储过程

目录

  • 实验六 触发器与存储过程
  • 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” 时,才会返回结果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32设备驱动-Si4703调频收音机模块驱动

Si4703调频收音机模块驱动 文章目录 Si4703调频收音机模块驱动1、Si4703介绍2、硬件准备3、软件准备4、驱动实现1、Si4703介绍 Si4702/03 FM 无线电接收器系列通过小尺寸和电路板面积、最少的组件数量、灵活的可编程性以及卓越的、经过验证的性能,增加了向移动设备添加 FM 无…

4。计算机组成原理(5)总线和I/O

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 总线概述 总线是一组能实现多个部件间信息传输的线路 按功能分类 1&#xff09;片内总线&#xff08;片…

【iOS】多线程以及GCD和NSOperation

iOS多线程 线程基础进程与线程NSThread类 GCD认识GCD任务队列队列与任务结合线程间通信队列组dispatch group延迟执行操作 NSOperation简介基本使用NSOperation、NSOperationQueue 常用属性和方法归纳NSOperation 常用属性和方法NSOperationQueue 常用属性和方法 小结 线程基础…

网易Android framework开发岗面试经历分享(附面试题汇总+案例解析)

背景 今年可以说是非常难&#xff0c;部门被拆&#xff0c;很多同事都被变相裁员了&#xff0c;虽然说去其他部门工作可以给我们的放宽一点要求&#xff0c;但我还是想在Android开的岗位上发展&#xff0c;所以也提出了离职&#xff1b;离职后的两个月中&#xff0c;投了一些A…

类ChatGPT逐行代码解读(1/2):从零实现Transformer、ChatGLM-6B

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

tensorflow GPU训练环境布置

tensorflow GPU训练环境布置 一、显卡驱动安装1.1 如何处理**Failed to initialize NVML: Driver/library version mismatch的问题**1.2 卸载旧的版本1.3 驱动安装 1.3.1 利用apt 安装1.3.2 手动安装 二、安装CUDA2.1 确定CUDA版本2.2 下载文件1. 找匹配版本2. 选合适的平台 2…

微服务---Redis实用篇-黑马头条项目-商户查询缓存功能(缓存穿透,缓存雪崩,缓存击穿问题及解决思路)

1、商户查询缓存 1.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…

libcad.so Crack,转换为多种文件格式

libcad.so Crack,转换为多种文件格式 支持所有流行的2D和3D CAD格式。 高速准确的可视化。 轻松访问CAD实体属性&#xff0c;包括坐标、文本、图层等。 转换为多种文件格式。 从DWG和DXF文件生成G代码。 Unicode支持。 libcad.so是一个用于Linux的库。它可以将CAD功能添加到不同…

【笔试强训选择题】Day11.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

MyBatis--原生的 API--注解的方式和MyBatis--mybatis-config.xml-配置文件详解

目录 原生的 API&注解的方式 MyBatis-原生的 API 调用 为了大家的观看我把基于xml的配置和类也展示了如果你想要详细的观看可以看 连接这个博客 创建Monster 创建MonsterMapper接口 创建MonsterMapper.xml 配置mybits的xml 创建MyBatisUtils 原生的 API 快速入门-代…

《计算机网络—自顶向下方法》 第二章Wireshark实验:DNS协议分析

域名系统 DNS(Domain Name System) 是互联网使用的命名系统&#xff0c;用于把便于大家使用的机器名字转换为 IP 地址。许多应用层软件经常直接使用 DNS&#xff0c;但计算机的用户只是间接而不是直接使用域名系统。 互联网采用层次结构的命名树作为主机的名字&#xff0c;并使…

Pytorch高级训练框架Ignite详细介绍与常用模版

引言 Ignite是Pytorch配套的高级框架&#xff0c;我们可以借其构筑一套标准化的训练流程&#xff0c;规范训练器在每个循环、轮次中的行为。本文将不再赘述Ignite的具体细节或者API&#xff0c;详见官方教程和其他博文。本文将分析Ignite的运行机制、如何将Pytorch训练代码转为…

Kubectl-AI: 一款 OpenAI GPT 自动生成应用 K8s yaml神器

首页: 官网 下载安装 wget https://github.com/sozercan/kubectl-ai/releases/download/v0.0.10/kubectl-ai_linux_amd64.tar.gz tar xvf kubectl-ai_linux_amd64.tar.gz -C /usr/local/bin/kubectl-ai需要OpenAI API密钥或Azure OpenAI服务 API密钥和端点以及有效的Kubernet…

系统移植——linux内核移植——分析内核编译过程

uImage镜像文件 1.进入linux内核源码目录 ubuntuubuntu:~$ cd FSMP1A/linux-stm32mp-5.10.61-stm32mp-r2-r0/linux-5.10.61/ 打开Makefile文件 vi Makefile 搜索include 因为 $(SRCARCH)->arm 所以上述指令为 arch/arm/Makefile 2.进入linux内核源码目录下,arch/arm目录下…

Windows 11 本地部署 Stable Diffusion web UI

Windows 11 本地部署 Stable Diffusion web UI 0. 什么是 Stable Diffusion1. 什么是 Stable Diffusion web UI2. Github 地址3. 安装 CUDA Toolkit 11.84. 安装 cuDNN v8.9.1 for CUDA 11.x5. 配置环境变量6. 安装 Python 3.10.67. 安装 Stable Diffusion web UI8. 启动 Stabl…

吊打面试官的Java项目经验一:物流系统

引言&#xff1a; java面试一般分为两部分&#xff0c;技术面试和项目面试&#xff0c;相信大多数小伙伴们都刷过很多技术性的面试题&#xff0c;连博主本人也刷过很多无聊的面试题&#xff0c;但是对于项目经验的面试&#xff0c;可能很多刚入行小伙伴属于一个空白期&#xff…

【软考|软件设计师】编辑距离算法

目录 编辑距离算法&#xff1a; 步骤&#xff1a; 实例&#xff1a; 题&#xff1a; 完整代码如下&#xff1a; 调试&#xff1a; 代码解析&#xff1a; 具体过程参考&#xff1a; 编辑距离算法&#xff1a; 是一种计算两个自符串之间差异程度的方法&#xff0c;它通过…

现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群

最近遇到的疑难现场问题层出不穷&#xff0c;本次遭遇的挑战是在4台windows Server 服务器上部署Kafka集群。这是一种比较少见的操作&#xff0c;原因是有些依赖的驱动对虚拟化支持不好&#xff0c;只能运行在实体win机上。 原有的上层业务是由B团队开发运维&#xff0c;现在B…

今年的博客数量上两百了

今年的博客数量上两百了 不知不觉在 C S D N CSDN CSDN中写了那么多篇文章。与 C S D N CSDN CSDN相伴的生活中&#xff0c;我过得很充实。

并发编程10:Java对象内存布局和对象头

文章目录 10.1 面试题10.2 Object object new Object()谈谈你对这句话的理解&#xff1f;10.3 对象在堆内存中布局10.3.1 权威定义----周志明老师JVM10.3.2 对象在堆内存中的存储布局 10.4 再说对象头的MarkWord10.5 聊聊Object obj new Object()10.5.1 运行结果展示10.5.2 压…