MySQL的语句查询——存储
一、存储过程介绍
1、什么是存储过程
存储过程是实现某个特点功能的sql语句的集合,编译后的存储过程会保存在数据中,通过存储过程的名称反复的调用执行。
2、存储过程的优点
(1)存储过程创建后,就可以反复的调用和使用,不需要重新写复杂的语句
(2)创建,修改存储过程不会对数据有任何的影响
(3)存储过程可以通过输入参数返回输出值
(4)通过存储过程中加入控制语句,可以加强sql语句的功能性和灵活性
(5)对于单个l语句增删改查,可以直接封装一个集合中,存储过程一旦创建就可以直接调用,且可可以重复调用
(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 ;
create PROCEDURE cc2( in x int,out y int)
begin
select age into y from emp where dept2=x;
END
//
call cc2(105,@y)
select @y
4、inout:一个变量既是输入值也是输出值
案例:delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( inout x int)
BEGIN
set x=x+1;
END//
set @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));
delimiter //
drop PROCEDURE if EXISTS cc2 ;
create PROCEDURE cc2( )
BEGIN
INSERT into m1(id) VALUES(2);
SELECT * from m1;
END
//
call cc2()
(2)出入变量值的数据
案例: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()
BEGIN
DECLARE i int DEFAULT 0 ;
WHile (i<10) do
INSERT into m1(id) VALUES(i);
set i=i+1;
end while;
SELECT * from m1;
END
//
call cc2()
(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) ;
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
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)
8、if语句
(1)if单分支
格式“:
if 条件 THEN
sql1
ELSE
sql2
end if; 结束if语句
案例:delimiter //
drop procedure if exists cc2;
create procedure cc2(in x int)
begin
if x>2 then
select * from emp;
else
select * from dept;
end if;
end
//
call cc2(5)
(2)if多分支
格式:
if 条件1 THEN
slq1
ELSE if 条件2 then
slq2
ELSE if 条件3 then
sql3
ELSE
sql4
end if;
END IF;
end if;
案例:delimiter //
drop procedure if exists cc2;
create procedure cc2(in x int)
begin
if x=2 then
select * from emp;
else if x=10 then
select *from dept;
else if x=100 then
select * from student;
else
select * from sc;
end if;
end if;
end if;
end
//
call cc2(100)
作业:
1、你会存储码?
2、存储的结构 ?
3、在工作中你们用存储做什么? 造数据
4、你会写存储吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构