mysql之存储(1)
一、存储过程介绍
1、什么是存储过程?
存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行。
2、存储过程的优点?
(1)存储过程创建后,就可以反复地调用和使用,不需要重新写复杂的语句
(2)创建,修改存储过程不会对数据有任何的影响
(3)存储过程可以通过输入参数返回输出值
(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性
(5)对于单个语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可以重复调用
(6)单个sql语句每一次执行都需要对数据进行编译,而存储过程被创建只需要编译一次,后续即可调用
(7)创建的存储过程,可以重复进行调用,可以减少数据库开发人员的工作量
(8)防止sql 注入
(9)造数据(重点)
3、mysql5.0版本之后就支持存储过程,存储过程是由sql语句和控制语句组成的
二、存储的格式
1、基本格式(不带参数):
delimiter // 分隔符
drop (删除) PROCEDURE (存储) if EXISTS(判断是否存在) cc1 存储;
create创建 PROCEDURE存储 cc1() 存储名称 不带;
BEGIN 开始
select * from emp ; 存储体1
select * from dept ;存储体2
END 结束存储
// 分割符
call cc1() 调用 存储名称
案例:
delimiter //
drop PROCEDURE if EXISTS cc1 ;
create PROCEDURE cc1()
BEGIN
select * from emp ;
select * from dept ;
END//
call cc1()
2、带传入参数(in)
格式:
delimiter //
drop PROCEDURE if EXISTS 存储名称;
create PROCEDURE 存储名称( in x int)
BEGIN
语句1
END//
call 存储名(实际参数)
案例:
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( in x int)
BEGIN
select * from emp where dept2=x;
END//
call cc2(105)
3、in输入值、out 返回值
select * from emp ;
desc emp ;
delimiter //
drop PROCEDURE if EXISTS cc2 ; 如果存在cc2 删除
create PROCEDURE cc2( in x int,out y int) 重建一个cc2(输入数值x,输出数值y)
BEGIN
select age into y from emp where dept2=x; 查看当dept2为x时emp中y的数值
END//
call cc2(105,@y) 输入dept2=105,输出变量值y
select @y 查看变量值y
4、inout 一个变量是输入值也是输出值
案例:
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( inout x int) 创建cc2表,输入数值x,输出数值x
BEGIN
set x=x+1;
END
//
set @x=1 设置变量值x为1
call cc2(@x) 运行储存
select @x 查看结果
5、设置变量方法:
set @ 变量名
赋值的方法:
(1)方式一
set @ 变量名:=值 设置一个变量值
select @变量名 显示所有数据
(2)方式二
通过查询结果为变量赋值:变量为一条件
select 字段 into 变量名 from 表名 where 条件
6、循环语句
while 循环语句:
格式
while 条件 do
sql语句
end while
7、造数据场景
(1)传入固定值 输入存储的为一固定数值
create table m1 (id int(10) PRIMARY key ,name varchar(20)); 创建一个只有id和name的m1表
delimiter //
drop PROCEDURE if EXISTS cc2 ; 存在cc2即删除
create PROCEDURE cc2( ) 创建cc2()
BEGIN
INSERT into m1(id) VALUES(2); 为m1表的id字段添加 id=2
SELECT * from m1; 查看m1表
END
//
call cc2() 运行存储
(2)出入变量值的数据
案例
delimiter //
drop table if EXISTS m1; 如果存在表m1,即删除
create table m1 (id int(10) PRIMARY key ,name varchar(20)); 新创一个m1表
drop PROCEDURE if EXISTS cc2 ; 如果存在cc2表删除
create PROCEDURE cc2(in x int ) 创建可输入数值x的cc2 储存
BEGIN
DECLARE i int DEFAULT 0 ; 声明变量0,i值从0开始
WHile (i<x) do 当i<x时运行
INSERT into m1(id) VALUES(i); 在m1表中 id一项新增id=i
set i=i+1; 接着输入i=i+1
end while; 结束while
SELECT * from m1; 查看m1表
END
//
call cc2(10) 输入x值为10运行储存
(3)先统计总数量,再插入传入的值
delimiter //
drop table if EXISTS m1;
create table m1 (id int(10) PRIMARY key ,name varchar(20));
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2(in x int )
BEGIN
DECLARE i int DEFAULT (select count(*) from m1) ; 输入的是m1表内所有值的个数
WHile (i<x) do
INSERT into m1(id) VALUES(i);
set i=i+1;
end while;
SELECT * from m1;
END
//
call cc2(10)
(4)每次删除表,再重新插入数据
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2(in x int )
BEGIN 每次开始时删除m1表,则不会有m1表已存在的报错
DECLARE i int DEFAULT 0 ;
drop table if EXISTS m1;
create table m1 (id int(10) PRIMARY key ,name varchar(20));
WHile (i<x) do
INSERT into m1(id) VALUES(i);
set i=i+1;
end while;
SELECT * from m1;
END
//
call cc2(3)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架