多測師肖老師_mysql之存儲過程(11.1)


存儲過程

====================

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)

----------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM