存储过程

一、存储的介绍

(1)什么是存储过程?

h存储过程是实现某个特定功能的sql 语句的集合,编译 后的存储过程会保存 在数据库中,通过存储过程的名称可以反复的调用执行。

(2)存储过程的优点?

1、存储创建后,就可以反复非调用和使用,不需要重新写复杂的sql语句

2、创建、修改存储过程不会对数据有任何的影响

3、存储过程可以通过参数和返回值  

4、存储过程可以通过加入控制语句,加强sql语句的功能性和灵活性

5、对于的那个的增删改查语句,可以直接封装在一个函数体当中,或者封装在一个集合当中,存储过程一旦创建就可以直接调用,而且可以重复调用

6、单个sql语句每次执行都要数据库进行编译,而存储过程创建只需要编译一次,后续就可调用

7、创建存储过程,可以重复进行调用,可以减少开发人员的工作量

8、防止sql注入

9、造数据

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

二、存储的基本格式:

delimiter //  #分隔符/定格符
create   procedure   存储名称(  in或out 或 inout)
BEGIN  #开始
              执行语句块1

            执2语句块1
end            #结束
//             #分隔符

先执行创建存储,在调用使用call

call   存储名()   调用存储

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

基本使用的语句:

(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="hz10" ;

(4)删除存储

格式:drop  procedure   存储名称 ;

drop  procedure hz2 ;

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

存储过程的编写

(1)无参数的存储过程

格式:
delimiter //
create   procedure  存储名称()
BEGIN
           语句;
END
//call  存储名称()      #调用存储过程例:

案例:delimiter //
create   procedure  aa()
BEGIN
  select  *  from emp;
END
//
call aa()

(2)in  输入参数的存储

格式:

delimiter //
create   procedure    存储名称( in x int)
BEGIN
  select  *  from 表名  where 字段名=x;
END
//
call      存储过程名(103)

 

案例:

delimiter //
create   procedure  bb( in x int)
BEGIN
  select  *  from emp  where dept2=x;
END
//
call bb(103)

 

(3)out  输出参数

格式:

delimiter //
create   procedure  ee( out y int )
BEGIN
  select  sid into y from emp  where name="sunbao";
END
//
call ee(@y)
select @y

 

(4)in ,out

案例
delimiter //
create   procedure  ff( out y int ,in  x int)
BEGIN
  select  age into y from emp  where sid=x;
END
//
call ff(@y,1789)
select @y

(5)inout  输入和输出

delimiter //
create   procedure  hh( inout  n int)
BEGIN
  set  n:=n+1;
END
//

set @n=2
call hh(@n)
select @n

 

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

1、用户变量  定义语法:

set    @变量名 

赋值的语法:

(1)set  @ 变量名  :=值

(2)set  @ 变量名 =值

(3)select  @变量名:=值 ;

方法二:通过查询结果为变量赋值

select    字段| 表达式   into   变量名    from  表名   where  条件

 

2、声明变量

declare   i  int  default  0       #declare  声明变量    ,i i 变量    数据类型  int       默认值

declare  i  int  default   (  select      count (id)  from   abc  ) ; #声名一个变量, i变量 ,int数据类型  条件

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

(1)第一种造数:( 在存储外先建表,在造数据,写死的数据)

delimiter //
DROP PROCEDURE  if  exists hh ; #增强存储的健壮性,判断存在删除
create   procedure  hh()
BEGIN

  declare  i  int  default  0 ; #声名一个变量, i变量 ,int数据类型  条件
  while (i<10) DO
     INSERT  into  abc VALUES (i);
     set i=i+1;
  end WHILE ;
  select * from  abc ;

END

call hh()

(2)第二种造数:( 在存储外先建表,在造数据,根据输入的数据造数)

delimiter //
DROP PROCEDURE  if  exists hh ; #增强存储的健壮性,判断存在删除
create   procedure  hh(in  x int)
BEGIN

  declare  i  int  default  0 ; #声名一个变量, i变量 ,int数据类型  条件
  while (i<x) DO
     INSERT  into  abc VALUES (i);
     set i=i+1;
  end WHILE ;
  select * from  abc ;

END

call hh(1000)

第三种造数:( 在储存中造表,在造数据,根据输入的数据造数)

drop table abc ;
create  table  abc (id  int(10)) ;

delimiter //
DROP  table if  EXISTS  abc;
DROP PROCEDURE  if  exists hh ; #增强存储的健壮性,判断存在删除
create   procedure  hh(in  x int)
BEGIN
  declare  i  int  default  0 ; #声名一个变量, i变量 ,int数据类型  条件
  DROP  table if  EXISTS  abc;
  create  table  abc (id  int(10)) ;
  while (i<x) DO
     INSERT  into  abc VALUES (i);
     set i=i+1;
  end WHILE ;
  select * from  abc ;

END
//

call hh(100)

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

循环语句:

数据库中有三种:

while ......条件...do  ....执行语句块....end  while

loop........end  loop

repeat ........until   end  repeat

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

if判断语句

if语句的单分支:

if  条件   then 

         执行sql1

else

   执行sql2

end  if ;

案例:

delimiter //
drop  procedure if EXISTS hz5 ;
CREATE  PROCEDURE   hz5(in a  int)
BEGIN
   if  a>10 THEN
    select  * from   emp ;
   ELSE
    select  *  FROM    dept ;
   end IF;
END
//

call  hz5(9)

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

if判断语句

if语句的多分支:

if  条件 1  then 

         执行sql1

else if   条件2

   执行sql2

else  if  条件3

   执行sql语句3

else 

 执行语句4

end  if ;

end if ;

end  if ;

案例:

delimiter //
drop  procedure if EXISTS hz5 ;
CREATE  PROCEDURE   hz5(in a  int)
BEGIN
   if  a>100 THEN
    select  * from   emp ;
   ELSE  IF  a<100 and a>50  then
    select  * from   ss ;
   ELSE  if  a<50  and  a>10 then 
     select  * from   cc ;
   ELSE 
    select  *  FROM    dept ;
end IF; 
end if;
end if;
  
END
//
call  hz5(4)

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

练习if语句;

练习题:

drop table if exists student;
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);


面试题:根据student学生表去写

第一题:


1.当传入的参数(大于0)小于等于表里面数据的条数时,则根据分组显示班级的总成绩
2.当传入的参数大于表里面数据的条数时,则统计表里面的数据有多少条
3.当传入其他,则查询表里面的所有数据

第二题:

1.当传入的参数(大于0)小于等于表里面数据的条数时,则根据分组显示班级的总成绩
2.当传入的参数大于表里面数据的条数时,则往最高id上插入一条数据;并显示所有的数据
3.当传入其他,则统计表男女人数

 

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

第一题:

方法一:

delimiter //
DROP procedure  if EXISTS mst;
create PROCEDURE mst(in a INT)

BEGIN
  if a>0  and a<=(select  count(id) from student2)   then
    select sum(english),sum(chinese),sum(math) from student2 group by class;
  ELSE IF  a>(select  count(id) from student2) then
  select count(id) from student2;
  else 
     select *from student2;
  end if;
  end if;
 

END
//
call mst(-1)

方法二:

delimiter //
DROP  PROCEDURE  if exists  aa ;
CREATE PROCEDURE aa(in a int)
BEGIN
  declare i int default (select count(1) from student2);
  IF a>0 AND a<=i THEN
  select class,sum(english+chinese+math) FROM student2 GROUP BY class;
  ELSE IF a>i THEN
  SELECT count(id) FROM student2;
    ELSE 
    select * FROM student2;
end IF;
end IF;
END
//

call  aa(3)

第二题:

delimiter //
DROP  PROCEDURE  if exists  aa ;
CREATE PROCEDURE aa(in a int)
BEGIN
  declare i int default (select count(1) from student2);
  IF a>0 AND a<=i THEN
  select class,sum(english+chinese+math) FROM student2 GROUP BY class;
  ELSE if a>i THEN
  INSERT  into  student2(id)   VALUES (i+1);
  select * FROM student2;
  ELSE
    select * FROM student2 group  by  sex;
end IF;
end IF;
END
//

call  aa(15)

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

面试题: 

1、你会存储吗? 会

2、存储的结构是什么? 

3、你在工作中用存储作甚 ?造数

4、造数的存储过程具体实现方法?(重点记下)