• 多测师肖老师_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)

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

  • 相关阅读:
    Linux下解析域名命令-dig 命令使用详解
    重写、覆盖、重载、多态几个概念的区别分析
    介绍python中运算符优先级
    介绍Python中6个序列的内置类型
    Mysql(Mariadb)数据库主从复制
    winscp中使用sudo的方法
    git push跳过用户名和密码认证配置教程
    案例:通过shell脚本实现mysql数据备份与清理
    毕业季,我的Linux求职之路
    PHP和ajax详解
  • 原文地址:https://www.cnblogs.com/xiaolehua/p/15716474.html
Copyright © 2020-2023  润新知