数据库基础知识---------------------------(2)

MYSQL的存储过程

就是数据库 SQL 语言层面的代码封装与重用

  • 语法格式

delimiter 自定义结束符号

create procedure 存储名({in,out,inout} 参数名,数据类型...)

begin

        sql 语句

end 自定义结束符

delimiter;

  • 变量定义
  • 局部变量  用户自定义 仅在begin / end 块中有效

当将查询结果赋值给变量时,该查询语句的返回结果只能是单行单列或单行多列

delimiter $$
create procedure proc03()
begindeclare my_ename varchar(20) [default 'Peter'] ;--   定义局部变量set @var_name = 'ZS';--  用户变量(会话变量)不用提前声明 使用即声明select ename into my_ename from emp where empno=1001;--  用select into 为变量赋值select my_ename;
end $$
delimiter ;
-- 调用存储过程
call proc03();
select @var_name;  --  可以看到结果
  • 系统变量
    • 会话变量
      • 会话变量在每次建立一个新的连接的时候,由MYSQL来初始化。MYSQL会将当前所有全局变量的值复制一份来作为会话变量。
      • 由系统提供,当前会话(连接)有效 
      • 语法:
        @@session.var_name
    • 全局变量
      • 由系统提供,在整个数据库有效。 
      • 语法:
        @@global.var_name

全局变量与会话变量的区别就在于,对全局变量的修改会影响到整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)

  • 存储过程传参
  • in:表示传入的参数,可以是数值或者变量。

即使传入变量也不会更改变量的值,可以内部更改,仅仅作用在函数范围内

  • out:表示从存储过程内部传值给调用者
# 案例:
-- 封装有参数的存储过程,传入员工编号,返回员工名字和薪资
delimiter $$
create procedure proc04(in in_empno int ,out out_ename varchar(50) ,out out_sal decimal(7,2))
beginselect ename,sal into out_ename,out_sal from emp where empno = in_empno;
end $$delimiter ;call proc04(1001, @o_dname,@o_sal);
select @o_dname,@o_sal;
  • inout:表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值
案例:
-- 传入员工名,拼接部门号,传入薪资,求出年薪
delimiter $$
create procedure proc10(inout inout_ename varchar(50),inout inout_sal int)
beginselect  concat(deptno,"_",inout_ename) into inout_ename from emp where ename = inout_ename;set inout_sal = inout_sal * 12;  
end $$
delimiter ;
set @inout_ename = '关羽';
set @inout_sal = 3000;
call proc10(@inout_ename, @inout_sal) ;
select @inout_ename ;
select @inout_sal ;

in 输入参数,参数要传到存储过程的过程里面去,
在存储过程中修改该参数的值不能被返回

out 输出参数:该值可在存储过程内部被改变,并向外输出

inout 输入输出参数,既能输入一个值又能传出来一个值

  • 流程控制
  • if 判断

语法:
if search_condition_1 then statement_list_1
    [elseif search_condition_2 then statement_list_2] ...
    [else statement_list_n]
end if

-- 输入员工的名字,判断工资的情况。
delimiter $$
create procedure proc12_if(in in_ename varchar(50))
begindeclare result varchar(20);declare var_sal decimal(7,2);select sal into  var_sal from emp where ename = in_ename;if var_sal < 10000 then set result = '试用薪资';elseif var_sal < 30000then set result = '转正薪资';else set result = '元老薪资';end if;select result;
end$$
delimiter ;
call proc12_if('庞统');
  • case 判断

语法格式一:
case case_value
    when when_value then statement_list
    [when when_value then statement_list] ...
    [else statement_list]
end case

delimiter $$
create procedure proc14_case(in pay_type int)
begincase pay_typewhen  1   then select '微信支付' ;when  2 then select '支付宝支付' ;when  3 then select '银行卡支付';else select '其他方式支付';end case ;
end $$
delimiter ;call proc14_case(2);

语法格式二:
case
    when search_condition then statement_list
    [when search_condition then statement_list] ...
    [else statement_list]
end case
  

 delimiter  $$
create procedure proc_15_case(in score int)
begincasewhen score < 60  then  select '不及格';when score < 80    then   select '及格' ;when score < 90  then select '良好';when score <= 100 then  select '优秀';else select '成绩错误';end case;
end $$
delimiter  ;call proc_15_case(88);
  • while 循环

[label:]while 循环条件 do
    循环体;
end while[ label];

-- -------存储过程-while + leave
truncate table user;
delimiter $$
create procedure proc16_while2(in insertcount int)
begindeclare i int default 1;label:while i<=insertcount doinsert into user(uid,username,`password`) values(i,concat('user-',i),'123456');if i=5 then leave label;end if;set i=i+1;end while label;
end $$
delimiter ;call proc16_while2(10);-- ---------------------------------------------------------------------------------------- -------存储过程-while+iterate
truncate table user;
delimiter $$
create procedure proc16_while3(in insertcount int)
begindeclare i int default 1;label:while i<=insertcount doset i=i+1;if i=5 then iterate label;end if;insert into user(uid,username,`password`) values(i,concat('user-',i),'123456');end while label;
end $$
delimiter ;
call proc16_while3(10);

leave 类似于 break,跳出,结束当前所在的循环
iterate类似于 continue,继续,结束本次循环,继续下一次

  • repeat循环

[label:]repeat 
 循环体;
until 条件表达式
end repeat [label]

truncate table user;
delimiter $$
create procedure proc18_repeat(in insertCount int)
begindeclare i int default 1;label:repeatinsert into user(uid, username, password) values(i,concat('user-',i),'123456');set i = i + 1;until  i  > insertCountend repeat label;select '循环结束';
end $$
delimiter ;call proc18_repeat(100);
  • loop循环

[label:] loop
  循环体;
  if 条件表达式 then 
     leave [label]; 
  end if;
end loop;
  

 truncate table user;
delimiter $$
create procedure proc19_loop(in insertCount int) 
begindeclare i int default 1;label:loopinsert into user(uid, username, password) values(i,concat('user-',i),'123456');set i = i + 1;if i > 5 then leave label;end if;end loop label;select '循环结束';
end $$
delimiter ;call proc19_loop(10);

  • 游标

用来存储查询结果集的数据类型,在存储过程中可以使用光标对结果集进行循环的处理

-- 声明语法
declare cursor_name cursor for select_statement
-- 打开语法
open cursor_name
-- 取值语法
fetch cursor_name into var_name [, var_name] ...
-- 关闭语法
close cursor_name

delimiter $$
create procedure proc20_cursor(in in_dname varchar(50))
begin-- 定义局部变量declare var_empno varchar(50);declare var_ename varchar(50);declare var_sal  decimal(7,2);-- 声明游标declare my_cursor cursor forselect empno , ename, sal from  dept a ,emp bwhere a.deptno = b.deptno and a.dname = in_dname;-- 打开游标open my_cursor;-- 通过游标获取每一行数据label:loopfetch my_cursor into var_empno, var_ename, var_sal;select var_empno, var_ename, var_sal;end loop label;-- 关闭游标close my_cursor;
end-- 调用存储过程call proc20_cursor('销售部');

  • 异常处理--handler句柄

格式:
DECLARE handler_action HANDLER
    FOR condition_value [, condition_value] ...
    statement
 
handler_action: {
    CONTINUE
  | EXIT
  | UNDO
}
 
condition_value: {
    mysql_error_code
  | condition_name
  | SQLWARNING
  | NOT FOUND
  | SQLEXCEPTION

drop procedure if exists proc21_cursor_handler;
-- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资 ,将查询的结果集添加游标
delimiter $$
create procedure proc20_cursor(in in_dname varchar(50))
begin-- 定义局部变量declare var_empno int;declare var_ename varchar(50);declare var_sal decimal(7,2);declare flag int default 1; -- 声明游标declare my_cursor cursor forselect empno,ename,salfrom dept a, emp bwhere a.deptno = b.deptno and a.dname = in_dname;-- 定义句柄,当数据未发现时将标记位设置为0declare continue handler for NOT FOUND set flag = 0;   -- 打开游标open my_cursor;-- 通过游标获取值label:loopfetch my_cursor into var_empno, var_ename,var_sal;-- 判断标志位if flag = 1 thenselect var_empno, var_ename,var_sal;elseleave label;end if;end loop label;-- 关闭游标close my_cursor;
end $$;delimiter ;
call proc21_cursor_handler('销售部');

在语法中,变量声明、游标声明、handler声明是必须按照先后顺序书写的,否则创建存储过程出错。

MYSQL引擎

MySQL的核心就是存储引擎

  • MyISAM引擎使用B+Tree
    • 拥有较高的插入,查询速度,但不支持事务
  • InnoDB引擎使用B+Tree
    •     事务型速记的首选引擎,支持ACID事务,支持行级锁定,MySQL5.5成为默认数据库引擎
  • Memory: 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在MYSQL重新启动是会丢失。

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

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

相关文章

apach httpd多后缀解析漏洞

漏洞详情&#xff1a; httpd支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。 那么&#xff0c;在有多个后缀的情况下&#xff0c;只要一个文件含有.php后缀的文件即将被识别成PHP文件&#xff0c;没必要是最后一个后缀。 利用这个特性&#xff0c;可以绕过…

Linux硬连接、软连接和复制的区别

‌硬连接、软连接和复制在Linux系统中的主要区别体现在以下三点&#xff1a; 文件链接的方式文件独立性文件系统的操作上。‌ 一、硬连接 1. 硬连接是通过ln命令创建的&#xff0c;它为文件创建别名&#xff0c;与源文件共享同一inode号码&#xff0c;因此硬连接和源文件实际…

Mint Expedition Season 3 拉开帷幕:登顶高峰的时刻到了

自 7 月 15 日 Mint Expedition 启动以来&#xff0c;Mint&#xff0c;一条专注于 NFT 行业的以太坊 Layer 2&#xff0c;日常交易量和交易额都出现了爆发式增长。这一成功离不开 Mint 社区的合作&#xff0c;包括 Minters、Web3 去中心化应用程序的开发者&#xff0c;以及大量…

02 ETH

以太坊与比特币有什么不同&#xff1f; 以太坊立足比特币创新之上&#xff0c;于 2015 年启动&#xff0c;两者之间有一些显著不同。 比特币就仅仅是比特币&#xff1b;以太坊包括以太币&#xff0c;以太币才是和比特币对等的存在。以太坊是可编程的&#xff0c;所以你可以在…

示例:WPF中Grid显示网格线的几种方式

一、目的&#xff1a;介绍一下WPF中Grid显示网格线的几种方式 二、几种方式 1、重写OnRender绘制网格线&#xff08;推荐&#xff09; 效果如下&#xff1a; 实现方式如下&#xff1a; public class LineGrid : Grid{protected override void OnRender(DrawingContext dc){Pen…

SQL 多表联查

目录 1. 内联接&#xff08;INNER JOIN&#xff09; 2. 左外联接&#xff08;LEFT JOIN&#xff09; 3. 右外联接&#xff08;RIGHT JOIN&#xff09; 4. 全外联接&#xff08;FULL JOIN&#xff09; 5. 交叉联接&#xff08;CROSS JOIN&#xff09; 6. 自联接&#xff0…

MATLAB系列07:稀疏矩阵、单元阵列和结构

MATLAB系列07&#xff1a;稀疏矩阵、单元阵列和结构 7. 稀疏矩阵、单元阵列和结构7.1 稀疏矩阵7.1.1 sparse数据类型7.1.1.1 产生稀疏矩阵7.1.1.2 稀疏矩阵的运算 7.2 单元阵列(cell array)7.2.1 创建单元阵列7.2.1.1 用赋值语句创建单元阵列7.2.1.2 用cell函数创建单元阵列 7.…

Day02Day03

1. 为什么拦截器不会去拦截/admin/login上&#xff0c;是因为在SpringMvc中清除了这种可能。 2.使用自己定义注解&#xff0c;实现AOP&#xff08;insert ,update&#xff09; 3.使用update最好使用动态语句&#xff0c;可以使用多次 4.使用阿里云的OSS存储。用common类 5.在写…

【BoF】《Bag of Freebies for Training Object Detection Neural Networks》

arXiv-2019 https://github.com/dmlc/gluon-cv 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Visually Coherent Image Mixup for Object Detection4.2 Classification Head Label Smoothing4.3 Data Preprocessing4.4 Traini…

[Redis][Redis简介]详细讲解

目录 1.认识 Redis2.Redis 特性1.速度快2.基于键值对的数据结构的服务器3.丰富的功能4.简单稳定5.客户端语言多6.高扩展性7.持久化(Persistence)8.主从复制9.⾼可⽤和分布式 3.Redis 使用场景1.数据库2.Cache3.消息队列 4.注意 1.认识 Redis Redis是⼀种基于键值对(Key-Value)…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析&#xff0c;发现了一些规律&#xff1a; 1)固定的类名令牌为模型的优化提供了强正则化&#xff0c;减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…

ARM总复习

1.计算机的组成 输入设备 输出设备 存储设备 运算器 控制器、总线 2.指令和指令集 2.1 机器指令 机器指令又叫机器码&#xff0c;在运算器内部存在各种运算电路&#xff0c;当处理器从内存中获取一条机器指令&#xff0c;就可以按照指令让运算器内部的指定的运算电路进行运…

百度智能云SSL证书安装指南

第一步&#xff1a;准备SSL证书 在华测ctimall&#xff08;https://www.ctimall.com/ssl&#xff09;申请SSL证书后&#xff0c;您会收到一个包含多种证书格式的压缩文件。请解压此文件&#xff0c;并找到Nginx目录中的证书文件&#xff0c;因为这是百度智能云中需要用到的证书…

Hadoop的一些高频面试题 --- hdfs、mapreduce以及yarn的面试题

文章目录 一、HDFS1、Hadoop的三大组成部分2、本地模式和伪分布模式的区别是什么3、什么是HDFS4、如何单独启动namenode5、hdfs的写入流程6、hdfs的读取流程7、hdfs为什么不能存储小文件8、secondaryNameNode的运行原理9、hadoop集群启动后离开安全模式的条件10、hdfs集群的开机…

九章云极DataCanvas公司荣获2024年服贸会“科技创新服务示范案例”

9月15日&#xff0c;2024年中国国际服务贸易交易会&#xff08;服贸会&#xff09;示范案例交流会暨颁奖典礼在北京国家会议中心举行&#xff0c;九章云极DataCanvas 公司自研的DataCanvas Alaya NeW智算操作系统凭借卓越的AI创新实力、前瞻性的市场布局以及突破性的技术革新成…

pc端的屏保实现

背景 偶然间&#xff0c;在使用一款google插件的时候&#xff0c;发现它有一个小功能&#xff0c;只要我停留在它的页面不操作10分钟以上&#xff0c;就会自动给我打开一个屏保界面&#xff0c;这样的 目的 这种华而不实的功能&#xff0c;正好适合个人博客&#xff0c;所以…

Prometheus监控k8s环境构建

传统架构中比较流行的监控工具有 Zabbix、Nagios 等&#xff0c;这些监控工具对于 Kubernetes 这类云平台的监控不是很友好&#xff0c;特别是当 Kubernetes 集群中有了成千上万的容器后更是如此&#xff0c;本章节学习下一代的云原生监控平台---Prometheus。 一、基于kuberne…

医学数据分析实训 项目七 集成学习--空气质量指标--天气质量分析和预测

项目七&#xff1a;集成学习 实践目的 理解集成学习算法原理&#xff1b;熟悉并掌握常用集成学习算法的使用方法&#xff1b;熟悉模型性能评估的方法&#xff1b;掌握模型优化的方法。 实践平台 操作系统&#xff1a;Windows7及以上Python版本&#xff1a;3.8.x及以上集成开…

LineageOS连接网络提示IP配置失败

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ IP配置失败 连接所有网络都提示IP配置失败&#xff0c;通过配置静态IP也连不上网络&#xff0c;感觉就是WIFI模块不能用了。 使用 Magisk root 后就这样了&am…

LeetCode004-两个有序数组的中位数-最优算法代码讲解

最有帮助的视频讲解 【LeetCode004-两个有序数组的中位数-最优算法代码讲解】 https://www.bilibili.com/video/BV1H5411c7oC/?share_sourcecopy_web&vd_sourceafbacdc02063c57e7a2ef256a4db9d2a 时间复杂度 O ( l o g ( m i n ( m , n ) ) ) O(log(min(m,n))) O(log(min(…