数据库(SQL)

目录

1 触发器

1.1 触发器简介

1.2 触发器的创建

语法

说明

1.3 示例

2 存储过程

2.1 什么是存储过程(函数)

2.1.1 存储过程和存储函数的区别

2.2 优势

2.3 应用场景

2.4 存储过程的创建和使用

说明

各参数类型所实现的存储过程

无参数无返回的存储过程

有参数无返回的存储过程

无参数有返回的存储过程

有参数有返回的存储过程

INOUT 

3 存储函数

3.1 存储函数的概念

3.2 创建和使用 

基本语法

参数说明

调用存储函数

语法结构如下

3.3 示例

3.4 删除

4 游标

优点

原理

4.1 如何声明游标

4.2 打开游标

4.3 使用游标

4.4 关闭

语法和格式

4.5 游标的应用


1 触发器

1.1 触发器简介

        触发器是一种比较特殊的存储过程,它的执行不是由程序调用,也不是手工调用,而是通过事件来进行触发

        比如说:对一张表进行(增、删、改),去激活它的执行

        触发器经常应用在加强数据完整性、和业务规则中

        如:

                当一个学生表中添加了一个学生信息的时候,那么对应的学生数目肯定会有所改变。像这样的情况,我们就可以针对学生表创建一个触发器:以确保每次增加一个学生记录的时候,就执行一次关于学生总数的计算操作,从而确保学生总数与记录数的一致性

1.2 触发器的创建

语法

CREATE TRIGGER 触发器名称 BEFORE|AFTER 触发事件ON 表名 FOR EACH ROWBEGIN触发器程序体;END

说明

<触发器名称>参考索引名名称 || 表命名
BEFORE|AFTER触发器时机
INSERT DELETE UPDATE

触发的事件

ON 表名在那张表上建立触发器
FOR EACH ROW 触发器执行间隔策略———子句通知触发器,每隔一行执行一次动作,并不是对整个表执行
触发器程序体要触发的SQL语句

1.3 示例

#当前有两张表 student   student_count 
#每当学生表中有记录增加(减少)时那么学生行数的这个表,需要进行最新的行数统计
1.创建表
CREATE TABLE student(id int auto_increment primary key not null,name varchar(40)
);CREATE TABLE student_count(totle int
);
#添加一条学生信息
INSERT INTO student (name) VALUES('jack_1');
INSERT INTO student_count VALUES(1);
#后面student表的添加语句与前面的一致
#而student_count语句全都会变为UPDATE格式
#故创建触发器:
CREATE TRIGGER student_insert_trigger AFTER INSERTON student FOR EACH ROWBEGINUPDATE student_count SET totle = totle+1;END;	
#查看触发器是否已存在SHOW TRIGGERS;
#我们插入若干条数据进行测试
INSERT INTO student (name) VALUES('jack_2'),('jack_3'),('jack_4'),('jack_5'),('jack_6'),('jack_7'),('jack_8'),('jack_9'),('jack_10');
#套用语法完成删除的触发器
CREATE TRIGGER student_delete_trigger AFTER DELETEON student FOR EACH ROWBEGINUPDATE student_count SET totle = totle-1;END;
#示例2:职员表 (工号,姓名,性别,年龄)  <===>  工资表 (工资编号,姓名,工资5000)    
对职工进行添加时 工资表中也要体现当前职工的信息 
对职工进行修改时 工资表中也要一并修改当前职工的信息 
对职工进行解聘时 工资表中也要一并删除当前员工的工资信息
#创建职工表
CREATE TABLE tab1(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),sex ENUM('m','f'),age INT
);
#创建工资表
CREATE TABLE tab2(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(20),salary DOUBLE(10,2)
);
#创建触发器1  INSERT  对职工进行添加时 工资表中也要体现当前职工的信息
CREATE TRIGGER tab1_insert_trigger AFTER INSERT ON tab1FOR EACH ROWBEGININSERT INTO tab2 VALUES (NULL,new.name,5000);END;测试用户新增  
INSERT INTO tab1 VALUES (1,'AA','f',18);
新增完成后我们检查tab2会发现有变化#创建触发器2  UPDATE  对职工进行修改时 工资表中也要刷新当前职工的信息
CREATE TRIGGER tab1_update_triggerAFTER UPDATE ON tab1FOR EACH ROWBEGINUPDATE tab2 SET name = new.name WHERE name = old.name;END;测试用户修改
UPDATE tab1 SET name = 'FF' WHERE name = 'BB';
修改完成后我们检查tab2会发现有变化#创建触发器3  DELETE 对职工进行删除时 工资表中也要刷新当前职工信息
CREATE TRIGGER tab1_delete_triggerAFTER DELETE ON tab1FOR EACH ROWBEGINDELETE FROM tab2 WHERE name = old.name;END;

2 存储过程

2.1 什么是存储过程(函数)

        存储过程是,事先经过了编译并以对象的形式存储在数据库中的一段SQL语句的集合

        调用存储过程可以简化应用开发人员的很多工作,减少了数据在数据库和应用服务器之间的传输,对于提高数据的处理能力具有很强的好处

2.1.1 存储过程和存储函数的区别

存储过程可以不设返回值,而存储函数必须要设置返回值
存储过程的参数 IN OUT INOUT 类型,而存储函数的参数只能是 IN

2.2 优势

        存储过程只在创建时编译一次,而常规的SQL命令每执行一次就会编译一次,所以它能够提高执行效率

        简化复杂操作,支持封装

        复用性极强

        安全性高,可指定其使用权

2.3 应用场景

        在并发量较小的情况下,很少使用。在并发量较高的情况下,多采用存储过程或存储函数

2.4 存储过程的创建和使用

CREATE PROCEDURE 函数名(形式参数列表)BEGIN函数体END;

说明

参数列表类型    [IN OUT INOUT] 参数名 类型
IN 输入参数
OUT 输出参数
INOUT 该参数在调用方法时充当了实参变量,在方法调用完毕返回结果时又充当了接受返回值的变量CALL函数名(实际参数列表)

各参数类型所实现的存储过程

无参数无返回的存储过程
#查询当前学生人数
CREATE PROCEDURE p1()BEGINSELECT COUNT(*) FROM student;END;	
有参数无返回的存储过程
#创建一张测试表
CREATE TABLE t1(id int,name varchar(50)
);CREATE PROCEDURE autoinsert(IN num INT)BEGINDECLARE i INT DEFAULT 1;          WHILE(i<=num)DOINSERT INTO t1 VALUES(i,md5(i));SET i = i+1;END WHILE;END;	
无参数有返回的存储过程
#查询当前学生人数
CREATE PROCEDURE p2(OUT num INT)BEGINSELECT COUNT(*) INTO num FROM student;END;
有参数有返回的存储过程
#统计指定班级编号的学生人数
CREATE PROCEDURE p3(IN num1 INT,OUT num2 INT)BEGIN SELECT COUNT(*) INTO num2 FROM student WHERE student.GradeID = num1;END;
INOUT 
CREATE PROCEDURE p4(INOUT num INT)BEGIN IF(num IS NOT NULL) thenSET num = num+1;ELSESELECT 100 INTO NUM;END IF;	END;   
CREATE PROCEDURE p5(INOUT num INT)BEGIN SELECT COUNT(*) INTO num FROM student WHERE student.GradeID = num;END;

3 存储函数


3.1 存储函数的概念

        MySQL存储函数(自定义函数),函数一般用于计算机和返回一个值,可以将经常需要使用的计算或功能写成一个函数。函数的存储过程类似

3.2 创建和使用 

        在MySQL中创建存储函数使用的关键字是  CREATE FUNCTION 

基本语法

CREATE FUNCTION 函数名([参数名 参数类型,参数名 参数类型 ....])RETURNS type[characterintic ...]BEGINroutine_bodyEND;

参数说明

RETURNS type返回值的类型
characteristic指定存储函数的特性
routine_bodySQL代码内容

调用存储函数

        在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法基本相同

        用户自定义的存储函数与MySQL内部函数性质相同

        区别在于,存储函数是用户自定义的;而内部函数是由MySQL自带

语法结构如下
SELECT NOW();SELECT 函数名(实际参数列表)

3.3 示例

注意:

        MySQL开启 bin-log 后,调用存储过程或者函数以及触发器时,会出现错误号为 1418 的错误

解决方法:

        信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求:在客户端上执行 SET GLOBAL log_bin_trust_function_creators = 1;

#无参数有返回值
#统计 student 表中行数
CREATE FUNCTION myf1() RETURNS INT
BEGINDECLARE num INT DEFAULT 0; SELECT COUNT(*) INTO num FROM student;RETURN num;
END;	
#有参数有返回值
#根据学生姓名查询学生学号
CREATE FUNCTION myf2(stuName VARCHAR(20)) RETURNS INT
BEGINDECLARE num INT; SELECT id INTO num FROM student WHERE name = stuName;RETURN num;
END;

3.4 删除

DROP FUNCTION myf2;

4 游标

        游标实际上是一种能够从包括多条数据记录的结构集中每次提取一条记录的机制(遍历)

使用游标(cursor)的一个主要原因就是把集合操作转换成单个记录处理方式
游标充当指针的作用
尽管游标能遍历结果中的所有行,但是他一次只能指向一行
使用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,而且结果往往是一个含有多个记录的集合
游标机制允许用户逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录

优点

允许程序对由查询语句 select 返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作
提供对基于游标位置的表中的行进行删除和更新的能力
游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来

原理

        游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理

4.1 如何声明游标

DECLARE cursor_name CURSOR FOR select_statement (table)

4.2 打开游标

        声明游标后,想从游标中提前数据,必须打开游标 OPEN

OPEN cursor_name;

注意:

        当我们执行了打开游标的操作后,游标并不是指向第一条记录,而是指向第一条记录的前边

        在程序内,一个游标可以打开多次,用户打开游标后,其他用户或程序可能正在更新数据,所以有时候可能导致用户每次打开游标时,显示的结果不同

4.3 使用游标

        当用户顺利打开游标后,可以使用  FETCH...INTO  语句进行数据的读取

# 这条语句用户指定的打开游标并读取下一行,且前进游标指针。
FETCH cursor_name INTO value1[,value2.....]

4.4 关闭

        游标使用完毕后,要及时的关闭,在MySQL中,使用 CLOSE 关键字关闭游标

语法和格式

CLOSE cursor_name;

        CLOSE 用于释放游标所有的内部资源和内存,因此每个游标在不需要的时候,就要及时的关闭

        关闭的游标 如果没有重新打开,那么不能进行第二次的使用,但是已经声明过的游标不需要再次声明了,用 OPEN 语句打开就行

        如果忘记关闭,MySQL将会到达 END 语句时自动关闭。游标关闭后,就不能使用 FETCH 去进行游标的遍历了

4.5 游标的应用

示例:

        编写两个表  sys_user 和 user 表,编写其存储过程。当两个表id值一样的时候,将 user 表内的name 字段值同步成 sys_user 表的 name 字段值

#1创建sys_user表并注入一些数据
CREATE TABLE sys_user(id INT(11) NOT NULL AUTO_INCREMENT,username VARCHAR(200) NOT NULL,PRIMARY KEY(id)
)ENGINE=InnoDB AUTO_INCREMENT = 4 DEFAULT CHARSET = utf8;INSERT INTO sys_user (username) VALUES ('AA'),('BB'),('CC'),('DD'),('EE'),('FF'),('GG');CREATE TABLE user(id INT(11) DEFAULT NULL,name VARCHAR(200) DEFAULT NULL
)ENGINE=InnoDB DEFAULT CHARSET = utf8;INSERT INTO user VALUES (1,'OO'),(2,'PP'),(3,'QQ'),(4,'RR'),(5,'SS'),(6,'TT'),(7,'UU');

创建存储过程 user_test,并创建游标 cur_test

CREATE PROCEDURE user_test()
BEGIN-- 定义变量DECLARE sys_user_id BIGINT;DECLARE sys_user_name VARCHAR(11);DECLARE done INT;-- 创建游标,并存储数据DECLARE cur_test CURSOR FOR SELECT id AS user_id,user_name AS sys_user_name  FROM `sys_user`;-- 游标中的内容执行完后将 done 设置为 1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;-- 打开游标OPEN cur_test;-- 执行循环posLoop:LOOP-- 判断是否结束循环IF done=1 THENLEAVE posLoop;END IF;-- 取游标中的值FETCH cur_test INTO sys_user_id,sys_user_name;-- 执行更新操作UPDATE `user` SET NAME=sys_user_name WHERE id=sys_user_id;END LOOP posLoop;-- 释放游标 CLOSE cur_test; 
END

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

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

相关文章

[cmake]CMake Error: Could not create named generator Visual Studio 16 2019解决方法

配置flycv时&#xff0c;cmake以下代码会报错第二行的错误&#xff0c;网上解决方法为第三行代码 cmake .. -G "Visual Studio 16 2019 Win64" CMake Error: Could not create named generator Visual Studio 16 2019 cmake .. -G "Visual Studio 16 2019"…

【MBtiles数据格式说明】GeoServer改造Springboot番外系列一

一、MBTiles数据格式 MBTiles格式是指由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用、管理和分享的规范&#xff0c;是一种用于即时使用和高效传输的规范。MBTiles既可以用作栅格输入数据存储&#xff0c;也可以用作WMSGetMap输出格式。规范有1.0&#xf…

C++类和对象:多态应用实例

利用多态实现计算机组转流程&#xff1a; polymorphic -> 多态 基础零件&#xff08;抽象类&#xff09;&#xff1a; class CPU { public:virtual void calculate() 0; }; class VideoCard { public:virtual void display() 0; }; class Memory { public:virtual void…

每日算法打卡:动态求连续区间和 day 31

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码树状数组线段树 原题链接 1264. 动态求连续区间和 题目难度&#xff1a;简单 题目来源&#xff1a;《信息学奥赛一本通》 题目描述 给定 n 个数组成的一个数…

rp-bf:一款Windows下辅助进行ROP gadgets搜索的Rust库

关于rp-bf rp-bf是一款Windows下辅助进行ROP gadgets搜索的Rust库&#xff0c;该工具可以通过模拟Windows用户模式下的崩溃转储来爆破枚举ROP gadgets。 在很多系统安全测试场景中&#xff0c;研究人员成功劫持控制流后&#xff0c;通常需要将堆栈数据转移到他们所能够控制的…

第一批 Apple Vision Pro 开箱和佩戴体验新鲜出炉!!!

注: 本文转自微信公众号 BravoAI (专注AI资讯和技术分享), 原文网址:第一批 Apple Vision Pro 开箱和佩戴体验新鲜出炉!!!, 扫码关注公众号 编者按: 整个AR/VR行业都在等AVP, 期待它能带来ChatGPT般的冲击 AVP(Apple Vision Pro) 是苹果公司研发的第一款"空间计算 (Spa…

VOD-SLAM 复现 AirDos 复现

VOD-SLAM 复现 参考&#xff1a;https://www.mianshigee.com/project/halajun-VDO_SLAM/ 下载&#xff1a; git clone https://github.com/halajun/VDO_SLAM.git VDO-SLAMCSparse 库安装 sudo apt-get install libsuitesparse-dev解决&#xff1a;fatal error: opencv2/xfea…

基础小白快速入门python------Python程序设计结构,循环

循环在计算机中&#xff0c;是一个非常重要的概念&#xff0c;是某一块儿代码的不断重复运行&#xff0c;是一种逻辑思维 在编程中的体现&#xff0c;运用数学思维加代码结合加数据&#xff0c;就构成了一个循环。 在Python中&#xff0c;循环主要分为三大类 for循环 while循…

Revit中使用依赖注入

依赖注入的技术已经很成熟&#xff0c;本文主要是说明一下Revit中的适用版本与介绍相关的开源项目。 版本问题 版本 目前的依赖注入包无法支持Revit 2020 以下的版本&#xff0c;原因是因为包中的依赖项与Revit本身的依赖项不一致导致的&#xff0c;所以说如果使用Revit DI…

力扣hot100 括号生成 递归回溯 超简洁版

Problem: 22. 括号生成 Code 使用 static 会被复用 class Solution {List<String> ans new ArrayList<>();public List<String> generateParenthesis(int n){dfs(n, n, "");return ans;}/*** param l 左括号待补个数* param r 右括号待补个数*…

nodejs+vue+ElementUi电商购物个性化商城推荐系统gqfe

电本电商个性化推荐系统是为了提高用户查阅信息的效率和管理人员管理信息的工作效率&#xff0c;可以快速存储大量数据&#xff0c;还有信息检索功能&#xff0c;这大大的满足了用户和管理员这二者的需求。操作简单易懂&#xff0c;合理分析各个模块的功能&#xff0c;尽可能优…

ansible 常用命令 基本说明 个人备忘

linux下设置一台机器的名称为ansible hostnamectl set-hostname ansible //设置一台机器的名称为master-01 hostnamectl set-hostname master-01 hostnamectl set-hostname master-02 hostnamectl set-hostname node01 hostnamectl set-hostname node02 hostnamectl set-…

flutter 设置图片与文字的基线对齐

如题&#xff1a;如何实现图片和文字的基线对齐 众所周知&#xff0c;文字含有上下填充&#xff0c;这个填充是框架所给予的。 背景 在开发中&#xff0c;我当时遇到比较简单的布局&#xff0c;首先是左边图标右边文字&#xff0c;如下图所示&#xff0c; 很自然的就想到用R…

linux 使用命令创建mysql账户

目录 前言创建步骤 前言 mysql默认有一个root用户&#xff0c;这个账户权限太大了&#xff0c;用起来不太安全&#xff0c;我们通常是重新那家一个账户用于一般的数据库操作&#xff0c;下面介绍如何通过命令创建一个mysql账户。 创建步骤 登录mysql mysql -u root -p输入roo…

Unity3D正则表达式的使用

系列文章目录 unity工具 文章目录 系列文章目录前言一、匹配正整数的使用方法1-1、代码如下1-2、结果如下 二、匹配大写字母2-1、代码如下1-2、结果如下 三、Regex类3-1、Match&#xff08;&#xff09;3-2、Matches()3-3、IsMatch&#xff08;&#xff09; 四、定义正则表达式…

非内积级联学习

1.首页推荐非内积召回现状 非内积召回源是目前首页推荐最重要的召回源之一。同时非内积相比于向量化召回最终仅将user和item匹配程度表征为embeding内积&#xff0c;非内积召回仅保留item embedding&#xff0c;不构造user显式表征&#xff0c;而是通过一个打分网络计算用户-商…

CSS中的transition属性

CSS中的transition属性可以让你在一定的时间间隔内平滑地改变一个元素从一个样式到另一个样式。这个属性主要应用于以下几种CSS属性&#xff1a; 宽度&#xff08;width&#xff09;高度&#xff08;height&#xff09;背景颜色&#xff08;background-color&#xff09;颜色&…

Vue禁止指定vue页面缩放适配移动端

index.html中 head标签中设置meta元数据 <meta name"viewport" content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,user-scalable0">这段代码是HTML中用于设置移动设备视口的meta标签。让我们逐步解释&#xff1a; widthde…

Log4j2-24-log4j2 相同的日志打印 2 次

现象 相同的日志打印了两次&#xff0c;且因为日志的配置不同&#xff0c;导致脱敏的情况不一致。 代码与配置 代码 package com.ryo.log4j2.cfg.additivity;import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;public class SimpleDemo…

12.MySql服务

目录 1. 什么是数据库 1.1. 数据&#xff1a; 1.2. 数据库&#xff1a; 2. mysql概述 3. 版本及下载 4. yum仓库安装 4.1. 添加yum源 4.2. 安装 5. 本地RPM包安装 5.1. 使用迅雷下载集合包 5.2. 上传数据 5.3. 安装 6. 生产环境中使用通用二进制包安装 6.1. 作用…