• 十六、变量详解


    前言:  

    代码中被[]包含的表示可选,|符号分开的表示可选其一。

    我们在使用mysql的过程中,变量也会经常用到,比如查询系统的配置,可以通过查看系统变量来了解,当我们需要修改系统的一些配置的时候,也可以通过修改系统变量的值来进行。

    我们需要做一些批处理脚本的时候,可以使用自定义变量,来做到数据的复用。

    本文内容

    • 详解系统变量的使用

    • 详解自定义变量的使用

    一、变量分类  

    • 系统变量

    • 自定义变量

    二、系统变量  

      概念:系统变量由系统定义的,不是用户定义的,属于mysql服务器层面的。  

      系统变量分类    

    • 全局变量

    • 会话变量  

      使用步骤    

        查看系统变量

        //1.查看系统所有变量
        show [global | session] variables;
        //查看全局变量
        show global variables;
        //查看会话变量
        show session variables;
        show variables;

        上面使用了show关键字  

        查看满足条件的系统变量

        通过like模糊匹配指定的变量

        //查看满足条件的系统变量(like模糊匹配)
        show [global|session] like '%变量名%';

        上面使用了show和like关键字。    

        查看指定的系统变量

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

        注意select@@关键字,global和session后面有个.符号。    

        赋值

        //方式1
        set [global|session] 系统变量名=值;

        //方式2
        set @@[global.|session.]系统变量名=值;
      

      注意:

        上面使用中介绍的,全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认为session级别。

        全局变量的使用中用到了@@关键字,后面会介绍自定义变量,自定义变量中使用了一个@符号,这点需要和全局变量区分一下。

    三、全局变量  

      作用域

        mysql服务器每次启动都会为所有的系统变量设置初始值。

        我们为系统变量赋值,针对所有会话(连接)有效,可以跨连接,但不能跨重启,重启之后,mysql服务器会再次为所有系统变量赋初始值。  

      示例

        /*查看所有全局变量*/
        show global variables;

        /*查看包含`tx`字符的变量*/
         show global variables like '%tx%';

        /*查看指定名称的系统变量的值,如查看事务默认自动提交设置*/
        select @@global.autocommit;
      

      为某个变量赋值

        /*为某个系统变量赋值*/
        set global autocommit=0;
        set @@global.autocommit=1;

    四、会话变量  

      作用域

        针对当前会话(连接)有效,不能跨连接。

        会话变量是在连接创建时由mysql自动给当前会话设置的变量。

      示例

        /*①查看所有会话变量*/
        show session variables;

        /*②查看满足条件的步伐会话变量*/
        /*查看包含`char`字符变量名的会话变量*/
        show session variables like '%char%';

        /*③查看指定的会话变量的值*/
        /*查看事务默认自动提交的设置*/
        select @@autocommit;
        select @@session.autocommit;
        /*查看事务隔离级别*/
        select @@tx_isolation;
        select @@session.tx_isolation;

        /*④为某个会话变量赋值*/
        set @@session.tx_isolation='read-uncommitted';
        set @@tx_isolation='read-committed';
        set session tx_isolation='read-committed';
        set tx_isolation='read-committed';

    五、自定义变量  

      概念

        变量由用户自定义的,而不是系统提供的。

      使用

       使用步骤:
        1. 声明
        2. 赋值
        3. 使用(查看、比较、运算)

      分类

    • 用户变量

    • 局部变量  

      用户变量    

      作用域

        针对当前会话(连接)有效,作用域同会话变量。

        用户变量可以在任何地方使用也就是既可以在begin end里面使用,也可以在他外面使用。  

      使用

        声明并初始化(要求声明时必须初始化)

        /*方式1*/
        set @变量名=值;
        /*方式2*/
        set @变量名:=值;
        /*方式3*/
        select @变量名:=值;

        注意:

          上面使用了@符合,而上面介绍全局变量使用了2个@符号,这点注意区分一下。

          set中=号前面冒号是可选的,select方式=前面必须有冒号    

        赋值(更新变量的值)

        /*方式1:这块和变量的声明一样*/
        set @变量名=值;
        set @变量名:=值;
        select @变量名:=值;

        /*方式2*/
        select 字段 into @变量名 from 表;
        

        使用

        select @变量名;  

      综合示例

        /*set方式创建变量并初始化*/
        set @username='***';
        /*select into方式创建变量*/
        select 'javacode2018' into @gzh;
        select count(*) into @empcount from employees;

        /*select :=方式创建变量*/
        select @first_name:='***',@email:='javacode2018@163.com';
        /*使用变量*/
        insert into employees (first_name,email) values (@first_name,@email);
      

      局部变量    

        作用域    

        declare用于定义局部变量变量,在存储过程和函数中通过declare定义变量在begin…end中,且在语句之前。并且可以通过重复定义多个变量

        declare变量的作用范围同编程里面类似,在这里一般是在对应的begin和end之间。在end之后这个变量就没有作用了,不能使用了。这个同编程一样。    

        使用      

          声明

          declare 变量名 变量类型;
          declare 变量名 变量类型 [default 默认值];    

          赋值

          /*方式1*/
          set 局部变量名=值;
          set 局部变量名:=值;
          select 局部变量名:=值;

          /*方式2*/
          select 字段 into 局部变量名 from 表;

          注意:局部变量前面没有@符号    

        使用(查看变量的值)

        select 局部变量名;    

        示例

          /*创建表test1*/
          drop table IF EXISTS test1;
          create table test1(a int PRIMARY KEY,b int);

          /*声明脚本的结束符为$$*/
          DELIMITER $$
          DROP PROCEDURE IF EXISTS proc1;
          CREATE PROCEDURE proc1()
          BEGIN
            /*声明了一个局部变量*/
            DECLARE v_a int;

            select ifnull(max(a),0)+1 into v_a from test1;
            select @v_b:=v_a*2;
            insert into test1(a,b) select v_a,@v_b;
          end $$

          /*声明脚本的结束符为;*/
          DELIMITER ;

          /*调用存储过程*/
          call proc1();
          /*查看结果*/
          select * from test1;
        

        delimiter关键字    

          我们写sql的时候,mysql怎么判断sql是否已经结束了,可以去执行了?

          需要一个结束符,当mysql看到这个结束符的时候,表示可以执行前面的语句了,mysql默认以分号为结束符。

          当我们创建存储过程或者自定义函数的时候,写了很大一片sql,里面包含了很多分号,整个创建语句是一个整体,需要一起执行,此时我们就不可用用分号作为结束符了。

          那么我们可以通过delimiter关键字来自定义结束符。

          用法:delimiter 分隔符

      

      用户变量和局部变量对比

      

    作用域定义位置语法
    用户变量 当前会话 会话的任何地方 @符号,不用指定类型
    局部变量 定义他的begin end之间 begin end中的第一句话 不加@符号,要指定类型

    六、总结

    • 本文对系统变量和自定义变量的使用做了详细的说明,知识点比较细,可以多看几遍,加深理解

    • 系统变量可以设置系统的一些配置信息,数据库重启之后会被还原

    • 会话变量可以设置当前会话的一些配置信息,对当前会话起效

    • declare创建的局部变量常用于存储过程和函数的创建中

    • 作用域:全局变量对整个系统有效、会话变量作用于当前会话、用户变量作用于当前会话、局部变量作用于begin end之间

    • 注意全局变量中用到了`@@`,用户变量变量用到了`@`,而局部变量没有这个符号

    • `delimiter`关键字用来声明脚本的结束符

          

        

  • 相关阅读:
    技术人员的找工之路(1
    技术人员的找工之路(3)
    Endian的由来
    android平台开发笔记1Spinner不能在sub activity中使用
    谈谈Groupon的成功
    线程安全的同步读写类的模板设计
    项目管理文件package.json
    10个每个开发人员都应该知道的强大JavaScript 解构技术
    绿色下载站上线了(MVC +Telerik开源控件)
    我开发的新浪微博应用“微词典”通过审核,欢迎朋友们试用,多多建议!
  • 原文地址:https://www.cnblogs.com/biao/p/11765764.html
Copyright © 2020-2023  润新知