【SQL】sql从0到1——第【8】章: 变量、存储过程、函数

第八章 变量、存储过程、函数

      • 一、变量分类
      • 二、系统变量
      • 三、自定义变量
      • 四、存储过程和函数
        • 1.存储过程
        • 2.函数

一、变量分类

  系统变量:全局变量、会话变量
  自定义变量:用户变量、局部变量

二、系统变量

 变量由系统提供,不是用户定义,属于服务器层面
 使用的语法:
  1.查看所有的系统变量
    Show global/session variables;

  2.查看满足条件的部分系统变量
   Show global/session variables like ‘%char%’;

  3.查看指定的某个系统变量的值
   Select @@global/session.系统变量名

  4.为某个系统变量赋值
   Set global/session系统变量=值;
   或
   Set @@global/session.系统变量=值;

  5.会话变量
   作用域:仅仅针对当前会话(连接)有效

   ①查看所有的会话变量
    Show session variables;
   ②查看部分会话变量
   Show session variables like ‘%char%’;
  ③查看指定的某个会话变量的值
   Select @@ session.会话变量名
  ④为某个会话变量赋值
   Set session会话变量=值;
   或
   Set @@ session.会话变量=值;

三、自定义变量

 变量是用户自定义的,不是由系统的

 1.用户变量
  1)作用域:针对于当前会话(连接)有效,同于会话变量的作用域。
  2)使用步骤:

    ①声明并初始化
     Set @用户变量名=值;
     或
     Set @用户变量名:=值;
     或
     Select @用户变量名:=值;

    ②赋值(更新用户变量的值)
     方式一:
        Set @用户变量名=值;
        或
        Set @用户变量名:=值;
        或
        Select @用户变量名:=值;

     方式二:select into
         Select 字段 into 变量名
         From 表;
 2.局部变量

  1)作用域:仅仅在定义它的begin-end 中有效
        必须应用在begin-end中的第一句话
  2)使用步骤:
   ①声明
    Declare 变量名 类型 default 值;
   ②赋值
    方式一:
       Set @局部变量名=值;
       或
       Set @局部变量名:=值;
       或
       Select @局部变量名:=值;
    方式二:select into
        Select 字段 into 局部变量名
        From 表;
   ③使用
      Select 局部变量名;

 3.对比用户变量和局部变量
   作用域:用户变量:当前会话;局部变量:begin-end中
   定义和使用的位置:用户变量:会话中任何地方;局部变量:只能在begin-end中,且必须第一句话
   语法:用户变量:必须加@符号,不用限定类型;局部变量:一般不用加@符号,需要限定类型

四、存储过程和函数

1.存储过程

 一组预先编译好的SQL语句的集合,可理解成批处理语句

 1)存储过程创建
  Create procedure 存储过程名(参数列表)
  Begin
    存储过程体(一组合法的SQL语句)
  End
 注意:
   ①参数列表包含三部分:参数模式 、参数名、参数类型
   例:in stuname varchar(20);
   参数模式: in(该参数可以作为输入,该参数需要调用方传入值)
        out(该参数可以作为输出,也就是该参数可以作为返回值)
        inout(该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值)
   ②如果存储过程体中仅仅只有一句话,begin end 可以省略
   ③存储过程体中的每条SQL语句的结尾必须加分号,存储过程的结尾可以使用delimiter重新设置。其语法为:Delimiter 结束标记

 2)存储过程调用

  Call 存储过程名(实参列表);
  ①空参列表
   例:
     Delimiter $
     Create procedure m1()
     Begin
     Insert into stu(username,id)
     Values (‘小李’,’001’),( ‘小方’,’002’)
     End $ ;

     Call m1() $ ;

  ②创建带in模式参数的存储过程
   例:创建存储过程实现:根据女神名,查询对应的男神信息
     Create procedure m2(in beautyname varchar(20))
     Begin
     Select bo.*
     From boys as bo
     Right join beauty b on bo.id=b.boyfriend_id
     Where b.name=beautyname;
     End $ ;

     Call m2(‘小红’) $ ;

     创建存储过程实现:用户是否登陆成功
     Create procedure m3(in username varchar(20),in password varchar(20))
     Begin
      Declare result int default 0; #声明并初始化
     Select count(*) into result #赋值
     From admin
     Where admin.username=username
     And admin.password =password;
     Select if (result>0,’成功’,’失败’);#使用
     End $ ;

     Call m3(‘小红’,‘666666’) $ ;
  ③创建带out模式的存储过程
   例:创建存储过程实现:根据女神名,查询对应的男神信息
     Create procedure m4(in beautyname varchar(20),out boyname varchar(20))
      Begin
      Select bo.boyname into boyname
      From boys as bo
      inner join beauty b on bo.id=b.boyfriend_id
      Where b.name=beautyname;
      End $ ;

      Call m4(‘小红’,@bname) $ ;
      Select @bname $;

  ④创建带inout模式的存储过程
   例:传入a和b两个值,最终a和b都翻倍并返回
      Create procedure m5(inout a int,inout b int)
      Begin
        Set a=a2;
        Set b=b
2;
      End $ ;
        其调用过程首先要传入值
      Set @m=1$
      Set @n=10$
      Call m5(@m,@ n) $ ;
      Select @m,@n $;
 3)存储过程删除
  Drop procedure存储过程名
  一次只能删除一个存储过程,不支持一次删除多个
 4)存储过程查看
  Show create procedure 存储过程;

2.函数

 其含义和存储过程相同,函数和存储的区别在于:
  存储过程可以有0个返回,也可以有多个返回,适合做批量插入、批量更新
  函数有且仅有一个返回,适合做处理数据后返回一个结果。

 1)函数创建
   Create function 函数名(参数列表)returns 返回类型
   Begin
   函数体
   End
 注意:参数列表的两部分为参数名和参数类型;
    函数体里必须有return语句
    当函数体中仅有一句话时,begin end可省略
    使用delimiter 语句设置结束标记

 2)函数调用
   Select 函数名(参数列表)

   例:
     Create function myf1() returns int
     Begin
     Declare c int default 0; #定义变量
     Select count(*) into c #赋值
     From employees;
     Returns c;
     End $
     Select myf1()$;

 3)函数查看
   Show create function 函数名;

 4)函数删除
   Drop function函数名

你可能感兴趣的:(SQL,sql,数据库,mysql)