• 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;

  • 相关阅读:
    批量更新sql |批量update sql
    智力测试题3
    【管理心得之二十一】管得少就是管得好
    查看sqlserver被锁的表以及如何解锁
    AD域相关的属性和C#操作AD域
    毕业5年小结一下
    WPF版公司的自动签到程序
    用友畅捷通高级前端笔试题(一)凭借回忆写出
    .NET中制做对象的副本(三)通过序列化和反序列化为复杂对象制作副本
    .NET中制做对象的副本(二)继承对象之间的数据拷贝
  • 原文地址:https://www.cnblogs.com/sun1997/p/12595407.html
Copyright © 2020-2023  润新知