MySQL学习记录 (五) ----- 存储函数、存储过程和触发器
相关文章:
- 《MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令》
- 《MySQL学习记录 (二) ----- SQL数据查询语句(DQL)》
- 《MySQL学习记录 (三) ----- SQL数据定义语句(DDL)》
- 《MySQL学习记录 (四) ----- SQL数据管理语句(DML)》
- 《MySQL学习记录 (五) ----- 存储函数、存储过程和触发器》
变量
变量分为两类 ,分别是 系统变量 和 自定义变量 。
系统变量:由系统提供 ,不是用户定义 ,属于服务器层面 ,根据系统变量的作用域不同又可以将其分为以下两类。
- 全局变量
- 会话变量
使用语法:
- 查看全局系统变量:
show global variables
- 查看会话系统变量:
show session variables
- 查看会话系统变量:
show variables;
- 查看满足条件的部分系统变量:
show global | session variables like '%char%'
- 查看指定的某个系统变量的值:
select @@global.系统变量名;
select @@session.系统变量名;
- 为某个系统变量赋值
set global | session 系统变量名 = 值;
set @@global | session.系统变量名 = 值;
注意:如果是全局级别需要加上 global
,如果是会话级别则需要加上 session
或者缺省
自定义变量:是由用户自定义的 ,使用更加灵活 ,根据作用域的不同又可以分为以下两类。
- 用户变量
- 局部变量
自定义变量的使用步骤:
- 声明
- 赋值
- 使用 (查看、比较、运算等)
用户变量
作用域:存放的位置可以是 begin end
的里面也可以是外面 ,可以理解为 C++ 中的全局变量
- 声明并初始化
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
- 赋值 (更新用户变量的值)
set @用户变量名=值;
set @用户变量名:=值;
select @用户变量名:=值;
select 字段 into @用户变量名 from 表;
(将查询结果的一个值赋值给变量) - 查看用户变量的值
select @用户变量名;
局部变量
作用域:仅仅在定义它的 begin end
中有效
应用在 begin end
中的第一句话!!
- 声明
declare 局部变量名 类型;
declare 局部变量名 类型 default 值;
- 赋值
set 局部变量名=值;
set 局部变量名:=值;
select @局部变量名:=值;
select 字段 into 局部变量名 from 表;
(将查询结果的一个值赋值给变量) - 使用
select 局部变量名
-- 案例:声明两个变量并赋初始值,求和,并打印-- 1. 用户变量
set @m = 1;
set @n = 2;
set @sum = @m + @n;
select @sum;-- 2. 局部变量
begindeclare a int default 1;declare b int default 2;declare sum int;set sum = a + b;select sum;
end
存储过程和函数
存储过程和函数类似于 Java / C++ … 等编程语言中的方法 / 函数 ,优势就是提高代码的重用性,简化操作。
存储过程
一组预先编译好的 SQL 语句的集合 ,提高了代码重用性 ,简化操作 ,减少了编译次数并且减少了和数据库服务器连接次数 ,提高了效率。
创建语法
create procedure 存储过程名(参数列表)
begin-- 存储过程体(一组合法的 SQL 语句)
end
参数列表包含三部分:参数模式 参数名 参数类型 ,形如 in stuname varchar(5)
,另外参数列表也可以空参列表。
关于参数模式:
in
修饰的参数可以作为输入 ,也就是说该参数需要调用方传入值。out
修饰的参数可以作为输出 ,也就是该参数可以作为返回值。inout
修饰的参数即可以作为输入也可以作为输出。
关于 begin end
- 如果存储过程体中只有一句 SQL 语句 ,则
begin end
可以省略。 - 存储过程体中的每条 SQL 语句的结尾必须加上分号。
- 存储过程的结尾可以使用
delimiter
重新设置 ,如delimiter $
调用语法
call 存储过程名(实参列表);
-- 案例:创建一个存储过程,作用是插入五条记录到admin表中
delimiter $
create procedure myp1()
begininsert into admin(`username`, `password`) VALUES ('k909397116', 23102mn2),('q230291', 231n2), ('o21023111', 123003),('mn2s321', 292091),('t9923102', 02123s2);
end $-- 调用存储过程
call myp1()$
-- 案例:创建一个存储过程,作用是根据职工号查询职工信息
delimiter $
create procedure myp2(in empno varchar(5))
beginselect z.*from 职工 zwhere z.职工号 = empno;
end $-- 调用存储过程
call myp2('E1')$
-- 案例:创建存储过程,作用是判断用户输入的用户名和密码是否正确
delimiter $
create procedure myp3(in username varchar(20), in password varchar(20))
begin-- 声明并初始化 result 变量用于保存查询的结果declare result varchar(20) default '';-- 查询符合条件的记录条数,并赋值给 result 变量select COUNT(*) into resultfrom adminwhere admin.username = usernameand admin.password = password;-- 打印结果select if(result > 0, '成功', '失败');
end $-- 调用存储过程
call myp3('k909397116', 12345)$
-- 案例:创建存储过程,作用是根据职工号返回该职工所在仓库的城市
delimiter $
create procedure myp4(in empno varchar(5), out city varchar(5))
begin
select distinct c.城市 into city
from 职工 z, 仓库 c
where z.仓库号 = c.仓库号 and
empno = z.职工号;
end $
-- 声明一个用户变量
-- 调用存储过程,将 city 的返回值返回给用户变量
call myp4('E3', @cityName)$
-- 打印用户变量
select @cityName $
-- 案例:创建存储过程,作用是根据职工号返回该职工所在仓库的所有信息
待补充
函数
待补充.
触发器
一、定义
触发器(trigger),事先为某张表绑定好一段代码,当表中当某些内容发生改变的时候(增删改),系统会自动触发代码。
二、触发器特性
- 事件类型:insert、delete、update
- 触发时间:before、after
- 触发对象:表中的每一条记录
注意:一张表中只能拥有一种触发时间的一种类型的触发器,最多 6 个触发器
三、创建触发器
-- 临时修改语句结束符
delimiter $
create TRIGGER 触发器名字 触发时间 时间类型
on 表名 FOR EACH row
begin
-- 里面就是触发器内容,每行内容必须用分号 ; 结束end $-- 将临时语句结束符恢复
delimiter ;
案例:
delimiter $
-- 触发器:订单生成时,商品库存对应减少
create trigger after_order after insert
on my_order for each row
beginupdate my_goods
set inv = inv - new.g_number
where id = new.id;end $
delimiter $
-- 为供应商表建立触发器,禁止删除目前有订购单的供应商
create trigger ban_delete after delete on `供应商` for each row
beginif old.`供应商号` in (select `供应商号` from `订购单` where `供应商号` is not null)then rollback;end if;
end $
四、查看触发器
- 查看所有触发器或模式匹配
语法:show triggers [like 'pattern']
- 查看触发器创建语句
语法:show create trigger after order
注意:所有触发器都会保存在一个系统表中,information_schema.triggers
五、触发器记录
不管触发器去是否触发,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后新的状态给分别保留下来,供触发器使用:其中,操作前的当前状态保存到 old
中,操作之后的可能形态保存给 new
,old
表示的是旧记录,new
代表的是新记录,删除的时候是没有 new
的,因为删除之后状态为空,插入的时候是没有 old
的,因为插入之前状态为空。
old
和 new
代表的是记录本身,任何一条记录除了有数据,还有字段本身
使用方式:old.字段名
/ new.字段名
MySQL学习记录 (五) ----- 存储函数、存储过程和触发器相关推荐
- PL/SQL轻量版(四)——存储函数/存储过程与触发器
概述 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块,均存储在数 ...
- MySQL学习记录 (三) ----- SQL数据定义语句(DDL)
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- MySQL学习记录 (四) ----- SQL数据管理语句(DML)
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- MySQL学习记录 (二) ----- SQL数据查询语句(DQL)
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令
相关文章: <MySQL学习记录 (一) ----- 有关数据库的基本概念和MySQL常用命令> <MySQL学习记录 (二) ----- SQL数据查询语句(DQL)> &l ...
- MySQL学习笔记(2)——存储过程与存储函数
MySQL学习笔记(2)--存储过程与存储函数 文章目录 MySQL学习笔记(2)--存储过程与存储函数 一.存储过程 1.概念:预先编译好的sql语句的集合,理解成批处理语句 2.好处: 3.语法: ...
- Mysql学习记录(6)
Mysql学习记录(1) Mysql学习记录(2) Mysql学习记录(3) Mysql学习记录(4) Mysql学习记录(5) Day06 12.变量 12.1系统变量 12.1.1全局变量 12. ...
- Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)
Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...
- MySQL学习记录04where条件子句、联表查询、子查询
文章目录 MySQL学习记录04where条件子句.联表查询.子查询 4.1DQL 4.2指定查询字段 4.3where条件子句 4.4联表查询 4.5分页和排序 4.6子查询 MySQL学习记录04 ...
最新文章
- 这些技术人棒棒哒!BingoDay2017获奖名单新鲜出炉~~~
- 骑行广州大学城 外环十大校门
- 简单的鼠标可拖动div 兼容IE/FF
- 前端性能优化—js代码打包
- Android——四大组件、六大布局、五大存储
- 刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...
- java获取前端json数据_java如何获取前端ajax传来的json对象
- 程序员常用网站收藏[定期更新]——csdn博客
- python与C#的互相调用
- Ubuntu在线体验
- 加密解密你了解多少?
- [转帖]SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
- C语言数字3转变字符 3 程序,C语言重点知识点
- pcsx2 linux双显卡,PC模拟PS2游戏模拟器PCSX2使用教程
- DevOps案例研究|中华有为-解构华为软开云DevOps实践
- hdu 1864 最大报销额
- android ftp播放器,超强本地播放器一款支持samba、FTP/Windows共享服务-简单不折腾...
- 输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。
- Android11.0(R) MTK 预置可卸载app恢复出厂不恢复(仿RK方案)
- Windows应急响应