存儲過程
====================
1、什么存儲過程?
存儲過程就是實現某個特定功能的sql語句的集合,編譯后的存儲過程會保存在數據庫中,通過存儲過程的名稱可以反復的調用執行。
2、存儲過程的優點?
(1)存儲創建后,可以反復的調用和使用,不需要重新寫復雜的sql語句
(2)創建,修改存儲過程不會對數據有任何的影響zhi
(3)存儲過程可以通過輸入參數返回輸入值
(4)通過存儲過程中加入控制語句,可以加強sql語句的功能和靈活性
(5)防止sql注入
(6)造數據(重點)
3、存儲引擎版本?
在mysql5.0之后支持存儲過程
=======================================
實戰:
(1)
delimiter // #分隔符
create (創建) procedure (存儲) hz1() 存儲名 #創建一個存儲,
BEGIN #開始
select * from emp ; #SQL 存儲體
SELECT * from dept;
end #結束
// #分隔符
call hz15() 調用存儲 存儲名
=======================================
1、查看單個存儲過程的詳情
格式:show create procedure 存儲名稱
案例:show create procedure hz1
2、查看所有已經建好的存儲過程
格式:show procedure status ;
案例:show procedure status ;
3、查詢數據庫中創建了哪些存存過程
格式:show procedure status where db="庫名"
案例:show procedure status where db="abc"
4、刪除一個存儲過程
格式:drop procedure 存儲名稱
案例:drop procedure hz2;
=======================================
(1)無參數的存儲過程
案例:
delimiter // #分隔符
create procedure wcs() #創建一個存儲,
BEGIN #開始
select * from emp ; #SQL 存儲體
end #結束
// #分隔符
call wcs()
多行注釋:ctrl+/ 取消多行注釋 shift+ctrl+/
----------------------------------------------------------
(2)in 輸入參數
delimiter // #分隔符
create procedure cs_in(in x int(10)) #創建一個存儲, in是輸入參數要接字符類型
BEGIN #開始
select * from emp where deptno=x; #SQL 存儲體
end #結束
// #分隔符
call cs_in(30)
----------------------------------------------------------
(3)out 輸出參數
out 字符類型(字符長度)
delimiter // #分隔符
create procedure cs_out(out y char(10)) #創建一個存儲,
BEGIN #開始
select ename into y from emp where empno=7521; #SQL 存儲體
end #結束
// #分隔符
call cs_out(@y) #
select @y
----------------------------------------------------------
in 輸入 out輸出
select *from emp ;
delimiter // #分隔符
create procedure cs_in_out(in x int(10),out y char(10)) #創建一個存儲,
BEGIN #開始
select ename into y from emp where empno=x; #SQL 存儲體
end #結束
// #分隔符
call cs_in_out(7521,@y) #
select @y
----------------------------------------------------------
inout 輸入輸出 是同一個變量
delimiter // #分隔符
create procedure cs_inout(inout n int(10)) #創建一個存儲,
BEGIN #開始
set n:=n+n;
end #結束
// #分隔符
set @n=2
call cs_inout(@n)
select @n
----------------------------------------------------------
用戶變量:定義語法:
(1)set @ 變量名 :=值 或 set @變量名=值; # 設置變量
select @變量名:=值 #查詢所有的變量
(2) 通過查詢結果為變量賦值
select 字段名 |表達式 into 變量 from 表名 where 條件
select @變量名:=值 #查詢所有的變量
---------------------------------------------------------
while 條件 do
執行語句
end while
msyql中循環語句的三種格式:
WHILE……DO……END WHILE (講)
REPEAT……UNTIL END REPEAT
LOOP……END LOOP
---------------------------------------------------------
聲明變量 :
案例1:DECLARE i int DEFAULT 0 ;
案例2:DECLARE i int DEFAULT (select count(sid)from emp ) ;
----------------------------------------------------------
造數:
(1) 造的數據是指定在存儲中
delimiter //
drop procedure if exists zs; #加強健壯性 ,判斷是否存在這個存儲
drop table if EXISTS ss;
CREATE procedure zs()
BEGIN
DECLARE i int DEFAULT 0 ; #變量名稱i 字符類型int 默認值0
create table ss(id int(10) PRIMARY key , incoming int(10));
while (i<100) DO
INSERT into ss VALUES (i,i+1);
set i=i+1;
end WHILE;
select * from ss;
END
//
call zs()
(2)插入的數據可以靈活指定具體的數據
delimiter //
drop procedure if exists zs; #加強健壯性 ,判斷是否存在這個存儲
CREATE procedure zs(in x int(10))
BEGIN
DECLARE i int DEFAULT 0 ; #變量名稱i 字符類型int 默認值0
drop table if EXISTS ss;
create table ss(id int(10) PRIMARY key , incoming int(10));
while (i<x) DO
INSERT into ss VALUES (i,i+1);
set i=i+1;
end WHILE;
select * from ss;
END
//
call zs(50)
面試題:
1、你會存儲嗎?
2、存儲的結構?
3、存儲你用干什么? 造數
4、具體怎么去造數
----------------------------------------------------------
if 語句
(1)if 單分支
if 條件 then
執行sql1
else
執行sql2
end if
案例:
delimiter //
drop procedure if exists if_fz; #加強健壯性 ,判斷是否存在這個存儲
CREATE procedure if_fz(in x int(10))
BEGIN
if x>10 THEN
select * from dept;
ELSE
select * from emp;
end if;
END
//
call if_fz(1)
注意點:一個if 對應一個end if
----------------------------------------------------------
if多分支
if 條件1 then
sql語句1
else if 條件2 then
sql語句2
else if 條件3 then
sql語句3
else
執行語句4
end if;
end if;
end if;
案例:
delimiter //
drop procedure if exists if_fz; #加強健壯性 ,判斷是否存在這個存儲
CREATE procedure if_fz(in x int(10))
BEGIN
if x>10 and x<100 THEN
select * from dept;
ELSE if x>100 then
select * from emp;
else if x<10 then
select * from student;
ELSE
select * from dept,emp where dept.deptno=emp.deptno;
end if;
end IF;
end if;
END
//
call if_fz(10)
----------------------------------------------------------
create table student2(
id int primary key ,
name char(20),
sex char(10),
age int(3),
mobile char(20),
class char(10),
english int(10),
chinese int(10),
math int(10)
)engine=innodb default charset=utf8;
insert into student2 values
(1,'小紅','女',23,'13813828824','1719',77,88,98),
(2,'小明','男',23,'13713713711','1720',56,66,55),
(3,'小李','男',23,'15915913911','1719',78,64,87),
(4,'小張','男',23,'15915913912','1720',77,76,77),
(5,'小白','女',24,'15915913913','1719',90,89,98),
(6,'小陳','女',19,'15915913914','1719',84,100,81),
(7,'小錢','女',20,'15915913915',null,45,99,93);
練習題:
delimiter //
drop procedure if exists if_lx;
create procedure if_lx(in x int(10) )
begin
declare i int default(select count(*) from student);
if x>0 and x<=i THEN
select sum(chinese+english+math) from student GROUP BY class ;
else if x>i then
select count(*) from student ;
ELSE
select * from student ;
end IF ;
end IF;
end
//
call if_lx(-1)
----------------------------------------------------------