9.变量、存储过程

变量

系统变量:
           全局变量
                         作用域:服务器每次启动将为所有的全局变量赋予初始值,针对于所有会话(连接)有效,但是不能跨重启
           会话变量
                         作用域:仅仅针对于当前会话(连接)有效

自定义变量:
      用户变量
                        作用域:针对于当前会话(连接)有效
                        应用在任何地方,也就是begin end 里面或者外面
           局部变量
                       作用域:仅仅在定义它的begin end 中有效
                       应用在begin end 中的第一句话

#一、系统变量
说明:变量由系统提供,不是用户定义,属于服务器层面
实用语法:
1.查看所有的关系变量
          show global variables;#全局变量
          show [session] variables;#会话变量

2.查看满足条件的部分变量
          show global |[session] variables like ‘%char%’;

3.查看某个指定的系统变量的值
          select @@global |[session].系统变量名;

4.为某个系统变量赋值
方式一:
           set @@global |[session] 系统变量名 = 值;
方式二:
            set global |[session] 系统变量名 = 值;

注意:
如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不加默认为session级别

#二、自定义变量
说明:变量使用户自定义的,不是由系统定义的;
使用步骤:
       声明
       赋值
      使用(查看、比较、运算等)

#1.用户变量
#①声明并初始化 赋值的操作符: =或 :=
        SET @用户变量名 = 值;
   或 SET @用户变量名:=值;
   或 SELECT @用户变量名:=值;

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

方式二:通过SELECT INTO
     SELECT 字段 INTO @变量名
     FROM 表;

#③使用(查看用户变量的值)
     SELECT @用户变量名;

#案例
       SET @count = 1;

       SELECT COUNT(*) INTO @count
       FROM employees;

      SELECT @count;

#2.局部变量
#①声明
        DECLARE 变量名 类型;
        DECLARE 变量名 类型 DEFAULT 值;
#②赋值
方式一:
        SET 局部变量名 = 值;
   或 SET 局部变量名:=值;
   或 SELECT @局部变量名:=值;

方式二:通过SELECT INTO
       SELECT 字段 INTO 局部变量名
        FROM 表;
#③使用
       SELECT 局部变量名;


#存储过程和函数
/*
存储过程和函数:类似于Java中的方法
好处:
1.提高代码的重要性
2.简化操作

存储过程:一组预先编译好的sql语句集合,理解成批处理语句
1.提高代码的重要性
2.简化操作
3.减少了编译次数并减少了和数据库服务器的连接次数,提高了效率
*/

#一、创建语法
     CREATE PROCEDURE 存储过程名(参数列表)
     BEGIN

    存储过程体(一组合法的SQL语句)

     END

注意:
1.参数列表包含三部分:
参数模式 参数名 参数类型
举例:
IN stuname VARCHAR(20)

参数模式
IN :该参数可以作为输入,也就是该参数需要调用方传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值

2.如果存储过程体仅仅只有一句话,BEGIN END 可以省略
   存储过程体中的每条SQL语句的结尾要求必须加分号。
   存储过程的结尾可以使用DELIMITER重新设置:DELIMITER 结束标记

#二、调用语法

CALL 存储过程名(实参列表);

#1.空参列表
#案例:插入到admin表中五条记录
命令提示符界面
mysql -uroot -p密码
DELIMITER $
CREATE PROCEDURE p1()
BEGIN
                INSERT INTO admin(username,`password`)
     VALUES('join1',0000),
        ('join2',0000),
        ('join3',0000),
        ('join4',0000),
        ('join5',0000);
END $

#调用
CALL p1()$

#2.创建带有in模式参数的存储过程
#案例1 :创建存储过程实现 根据女神名,查询对应的男神信息
CREATE PROCEDURE p2(IN beautyName VARCHAR(20))
BEGIN
               SELECT bo.*
    FROM boys bo
    RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
    WHERE b.name = beautyName;
END $

#调用
CALL p2('柳岩')$

#案例2:创建存储过程实现,用户是否成功登陆
CREATE PROCEDURE p3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
    DECLARE result INT DEFAULT 0;
    DECLARE COUNT(*) INTO result
    FROM admin
    WHERE admin.`username` = username
    AND admin.`password`=PASSWORD;

    SELECT result;

END $
#调用
CALL p3('张飞','8888') $

CREATE PROCEDURE p4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
    DECLARE result INT DEFAULT 0;
    DECLARE COUNT(*) INTO result
    FROM admin
    WHERE admin.`username` = username
    AND admin.`password`=PASSWORD;

    SELECT IF(result,'成功','失败');

END $

#3.创建带out模式的存储过程
#案例1:根据女生名,返回对应的男神名
CREATE PROCEDURE p5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
    SELECT bo.boyName INTO boyName
    FROM boys bo
    INNER JOIN beauty b
    ON bo.id = b.boyfriend_id
    WHERE b.name = beautyName;
END $
#调用
SET @bName $
CALL p5('小昭',@bName) $
SELECT @bName $

#案例2:根据女生名,返回对应的男神名及其魅力值
CREATE PROCEDURE p6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
    SELECT bo.boyName ,bo.userCP INTO boyName,userCP
    FROM boys bo
    INNER JOIN beauty b
    ON bo.id = b.boyfriend_id
    WHERE b.name = beautyName;
END $
#调用
SET @bName $
SET @usercp
CALL p6('小昭',@bName,@usercp) $
SELECT @bName @usercp $

#4.创建带有inout模式参数的存储过程
#案例1:传入a,b两个值,最终a,b都翻倍并返回
CREATE PROCEDURE p7(INOUT a INT,INOUT b INT)
BEGIN
    SET a = a*2;
    SET b = b*2;
END &

#调用
SET @m = 10 $
SET @n = 20 $
CALL p8(@m,@n) $
SELECT @m,@n

#二、删除存储过程
语法:DROP PROCEDURE 存储过程名
注意:每次删除存储过程仅仅一个

#三、查看存储过程的信息
SHOW CREATE PROCEDURE p1;

原文地址:https://www.cnblogs.com/sun1997/p/12595407.html