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、你会写存储吗?

posted @   uai  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示