MySQL进阶 -- 存储过程 和 触发器

news2024/11/16 18:02:54

目录

  • 存储过程
    • 介绍
    • 存储过程的基本语法
    • 变量
      • 系统变量
      • 用户自定义变量
      • 局部变量
    • if判断

存储过程

介绍

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,可以直接调用这些集合(存储过程),调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的

存储过程思想上很简单,就是数据库SQL语言层面的代码封装和重用

这里的p1,p2就是SQL语句的集合,想要调用这些SQL语句时直接调用集合即可
在这里插入图片描述

  • 存储过程的特点:
    1.封装,复用
    2.存储过程可以接收参数,也可以返回数据
    3.减少网络交互,效率提升

存储过程的基本语法

  • 创建一个存储过程
CREATE PROCEDURE 存储过程名称([参数列表])-- 参数可有可无
BEGIN
。。。
 -- 中间是SQL语句
 -- 所有的逻辑都在begin和end之间
END;

create procedure 存储过程名称([参数列表])
begin
。。。
 -- 中间是SQL语句
end;
  • 存储过程的调用
CALL 名称([参数]);-- 参数也是可有可无
  • 存储过程的查看
-- 查询指定数据库的存储过程及状态信息
SELECT *FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='xxx'; 
-- 查询某个存储过程的定义(查询创建存储过程的SQL语句)
SHOW CREATE PROCEDURE 存储过程名称;
  • 存储过程的删除
DROP PROCEDURE [IF EXISTS] 存储过程名称;

例子:

-- 存储过程的基本语法

--  创建
create procedure oneFunction()
begin
    select count(*)from student;
end;

-- 调用
call oneFunction();

-- 查看存储过程
select *from information_schema.ROUTINES where ROUTINE_SCHEMA='test';

show create procedure oneFunction;
-- 删除存储过程
drop procedure if exists oneFunction;

注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter指定SQL语句的结束符,否则就会报错

语法:delimiter 指定的结束符 例如:delimiter $$

变量

在MySQL中变量分为三类,系统变量,用户自定义变量,局部变量

系统变量

系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面,分为全局变量(GLOBAL),会话变量(SESSION)

全局变量是针对所有的会话有效的,在所有的控制台都是有效的

会话变量仅在当前会话内有效

  • 查看系统变量
-- 下面的session就是查看所有的会话全局变量,global就是查看全局变量
-- 不指定默认是session会话变量

-- 查看所有的系统变量
SHOW [SESSION | GLOBAL] VARIABLES; 
-- 可以通过like模糊匹配的方式查找变量  
SHOW [SESSION | GLOBAL] VARIABLES LIKE '......'; 
-- 查看指定变量的值
SELECT @@[SESSION | GLOBAL] 系统变量名;

show [session |global]varibles;
show [session |global]varibles like '......';
select @@[session | global]系统变量名;
  • 设置系统变量
-- 下面的session就是查看所有的会话全局变量,global就是查看全局变量

SET [SESSION |GLOBAL] 系统变量名=;

SET @@[SESSION | GLOBAL] 系统变量名=;

set [session |global] 系统变量名=;

set @@[session |global] 系统变量名=;

注意:全局变量设置后,所有的会话都会生效,当时当mysql服务器重启后,所有的全局变量都会回到初始值
如果想永久修改全局变量,就需要修改配置文件
在这里插入图片描述

例:

show session variables;

show session variables like 'auto%';

show global variables like 'auto%';

select @@global.autocommit;

select @@session.autocommit;
set session autocommit=0;
set global autocommit=0;
set session autocommit=1;

用户自定义变量

注意,两个@@指的是系统变量,一个@指的是系统自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候用‘@变量名’使用就可以,其作用域为当前连接(会话),也就是当前控制台。

  • 用户自定义变量的赋值
-- @var_name:变量名, expr:值 
SET @var_name=expr[, @var_name=expr]...;

-- 推荐使用这种方式赋值
SET @var_name:=expr[, @var_name:=expr]...; 


SELECT @var_name:=expr[,@var_name:=expr]...;

SELECT 字段名 INTO @var_name FROM 表名;
  • 用户自定义变量的使用
SELECT @var_name[,@var_name]...;

例如:

set @myname='欧肖';
set @myage:=18;
set @mygender='男',@myhobby='java';

select @mycolor:='red';
-- 将查询结果赋值给自定义变量
select count(*) into @mycount from student;

select @myage;
select @mycolor;
select @mycount;

注意:用户自定义变量不需要声明或初始化,只不过获取到的值为null

局部变量

局部变量是根据需要定义在局部生效的变量,访问之前,需要DECLARE声明,可用作存储过程内的局部变量和输入参数,局部变量的范围是在其存储过程声明的BEGIN。。。END块内。

  • 局部变量的声明
-- 这里的变量类型就是数据库字段类型
-- default后是初始值,可以不加
DECLARE 变量名 变量类型 [DEFAULT...];
  • 局部变量的赋值
SET 变量名=;
SET 变量名:=;
SELECT 字段名 INTO 变量名 FROM 表名...;

例如:

create procedure oneTest()
begin
    declare stu_count int default 0;
    select count(*) into stu_count from student;
    select stu_count;
end;

call oneTest();

if判断

语法:

IF 条件1 THEN
...
ELSEIF 条件2 THEN -- 可选
...
ELSE -- 可选
...
END IF;

跟之前的if语句类似

案例:
在这里插入图片描述

create procedure p1()
begin
    declare score int default 70;
    declare result varchar(10) ;
    if score >=85 then
        set result:='优秀';
        elseif score>=60 then
        set result:='及格';
        else
        set result:='不及格';
    end if;
    select result;

    end;
call p1();

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

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

相关文章

系列一、MongoDB简介特点应用场景

一、概述 1.1、官方 翻译:MongoDB是一个文档型数据库,旨在方便应用开发和扩展。 1.2、百度百科 1.3、总结 MongoDB 是一个非关系型文档数据库。 二、特点 面向集合存储,易存储对象类型的数据;支持查询以及动态查询&#xff1b…

在 Python 中实现最小堆

树是一种非线性数据结构,其中元素排列在多个级别。 堆是一种基于树的数据结构。 它是一棵完全二叉树,即每个父节点都有两个子节点。 堆实现不同的算法,对其他结构进行排序,对队列进行优先排序等。 堆有两种类型 - 最大和最小。 …

【计算机组成原理·笔记】总线控制

总线控制 总线上连接多个部件,为了解决: 什么时候由哪个部件发送信息如何给信息传送定时如何防止信息丢失如何避免多个部件同时发送如何规定接受信息的部件 等一些列问题,需要总线控制线进行统一管理,这就是总线控制&#xff0…

必须有公网IP吗?内网穿透如何实现外网访问

很多中小型公司或个人都有将自己内网的服务、应用,如远程桌面、网站、数据库、公司的管理系统、FTP、管家婆、监控系统等等,发布到外网,实现异地访问的需求。但往往面临一个普遍的问题,就是没有公网IP,即没有IP v4的公…

KEYSIGHT是德DSOX4034A 示波器 350 MHz

KEYSIGHT是德DSOX4034A 示波器 350 MHz,是德4000 X 系列拥有一系列引以为傲的配置,包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 是德DSO-X4034A 主要特…

scrcpy: 在电脑上使用Android手机

文章目录 1. 目的2. 配置2.0 配置思路2.1 安装 scrcpy 2.02.2 添加 udev 规则2.3 手机设置权限2.4 开启 scrcpy 1. 目的 打算在电脑上使用手机上的 App,如京东读书,或QQ。不用电脑版对应软件的原因是,电脑上需要重新登录,有些软件…

JSP SSM 学生综合测评管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP SSM 学生综合测评管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主…

零基础快速搭建私人影音媒体平台

目录 1. 前言 2. Jellyfin服务网站搭建 2.1. Jellyfin下载和安装 2.2. Jellyfin网页测试 3.本地网页发布 3.1 cpolar的安装和注册 3.2 Cpolar云端设置 3.3 Cpolar本地设置 4.公网访问测试 5. 结语 转载自cpolar极点云的文章:零基础搭建私人影音媒体平台【…

RabbitMQ集群架构模式

搭建Mirror镜像集群: 4369是erlang的发现端口 5672是rabbitmq的通信端口 15672是rabbitmq的可视化控制台的端口号 25672是erlang底层发送消息和分配消息的底层端口 firewall-cmd --zonepublic --add-port4369/tcp --permanent firewall-cmd --zonepublic --add-port…

Springboot+vue.js高校校园社交个人博客相册网站系统

基于java语言设计并实现了高校社交系统。该系统基于B/S即所谓浏览器/服务器模式,应用Springboot框架,选择MySQL作为后台数据库。系统主要包括用户、个人动态、个人相册、动态类型、留言板、交流论坛等功能模块。近几年来,由于计算机技术的快速…

chatgpt赋能python:Python列表中如何找出前三名成绩

Python列表中如何找出前三名成绩 在数据分析和编程中,Python语言被广泛使用。其中,列表是Python中最常用的数据类型之一。列表可以存储多个值,并且这些值可以是不同的数据类型。Python列表很强大,因为它提供了许多内置函数和方法…

划水2年半,薪资还没新人多,不要太真实...

上个月公司来了许多新面孔,其中一个是个00后,这位兄弟毕业后,在某软件公司干了一年,现在跳槽到我们公司薪资20K,已经超过公司很多老油条了。因为我和他年纪相差不大,所以和他聊得来,才知道&…

Educational Codeforces Round 149 (Rated for Div. 2)(A—D、F)

文章目录 A. Grasshopper on a Line1、问题2、分析3、代码 B. Comparison String1、问题2、分析3、代码 C. Best Binary String1、问题2、分析3、代码 D. Bracket Coloring1、问题2、分析3、代码 E. Playoff Fixing1、问题2、分析3、代码 F. Editorial for Two1、问题2、分析3、…

数据库期末复习(6)基于哈希和B+树的索引查询

免责声明 练习题没有答案 图片都是自己做的 仅供参考 可扩展哈希表和练习 笔记 数据库--- 索引结构 (2)--可扩展哈希表及增删查_旅僧的博客-CSDN博客 练习 首先默认 局部深度都是1 然后进行插入 之后分裂 按照课件上的操作进行。 线性哈希表

插入排序,选择算法与快速排序(c语言,Java语言)

插入排序 原理:从数组的第二个元素开始,将数组中的每一个元素按照(升序或者降序)规则插入到已排好序的数组中以达到排序的目的。 插入排序并不是将元素取出来,插入到合适位置,之后的元素的位置依次加一,而…

在职阿里8年,一个31岁女软件测试工程师的心声

简单的先说一下,坐标杭州,13届本科毕业,算上年前在阿里巴巴的面试,一共有面试了有6家公司(因为不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少) 其中成功的有4家&am…

【STL】stack、queue基本使用和模拟实现

目录 前言 stack 接口介绍 模拟实现 queue 接口介绍 模拟实现 没有迭代器 deque介绍 前言 stack 和 queue 本质上是一种容器配接器,就像我们平时充电时使用的电源适配器,能够将电压转换成设备能够接受的程度。 其通过封装特定容器作为其底层…

我的测试之路:从入坑测试到月薪15k...

“干过保险卖过房,做过销售做过网管”这是我毕业后前两年的真实写照,因为所学网络安全专业不好找工作,毕业之后为了生活只能将就的干着这种门槛低的工作。后来一次同学聚会被同学带下坑后,正式转行软件测试。 刚入坑的两年&#…

【自动化测试实战】从 0 到 1 搭建 Dubbo 接口自动化测试

前言 1、Dubbo 接口自动化测试框架实现逻辑 2、框架具体功能 3、关键实践 3.1 下载 provider 的 jar 包,并代理声明 zookeeper 设置 3.2 邮件发送功能 3.3 封装 Dubbo 接口信息类 3.4 利用 JMeter 调用 provider 服务,并断言,邮件报警…

音视频基础及海思sample_venc解读

1、sample的整体架构 (1)sample其实是很多个例程,所以有很多个main (2)每一个例程面向一个典型应用,common是通用性主体函数,我们只分析venc (3)基本的架构是:venc中的main调用venc中的功能函数,再调用common中的功…