• MySql基础篇——变量、流程控制与游标


    一、变量

    在mysql数据库中,变量分为系统变量以及用户自定义变量。

    1、系统变量

    1.1 介绍

    系统变量由系统定义,属于服务器层面。启动mysql服务,生成mysql服务实例期间,mysql将为mysql服务器内存中的系统变量赋值。这些系统变量要么时编译mysql时参数的默认值,那么是配置文件中的参数值。可以通过网址https://dev.mysql.com/doc/refman/8.0/server-system-variables.html查看mysql文档的系统变量。

    1.2 分类

    系统变量分为全局系统变量(需要添加global关键字)和会话系统变量(需要添加session关键字)。
    全局系统变量又叫全局变量,会话系统变量又叫local变量。如果不写,默认会话级别。
    静态变量(在mysql服务实例运行期间不能使用set动态修改)属于特殊的全局变量。

    • 全局变量针对所有会话有效,但不能跨重启。
    • 会话系统变量仅针对当前会话有效,不会影响其他会话。
    • 有些变量只能是全局的,例如max_connections用于限制服务器最大连接数;有些写哦那个变量既可以是全局又可以是会话,例如character_set_client用于设置客户端的字符集;有些系统变量只能是当前会话,例如pseudo_thread_id用于标记当前会话的mysql连接id。

    1.3 查看系统变量

    show global variables; // 查看全局系统变量
    show session variables; // 查看会话系统变量
    show variables; // 默认查询会话系统变量
    show variables like '' // 查看部分系统变量
    
    • 1
    • 2
    • 3
    • 4

    在mysql中系统变量以@@开头,其中@@global用来标记全局系统变量,@@session用来标记会话系统变量,@@首先标记会话系统变量,如果会话变量不存在则标记全局变量。

    select @@global.变量名;
    select @@session.变量名;
    select @@变量名;
    
    • 1
    • 2
    • 3

    1.4 修改系统变量

    方式1:修改mysql的配置文件
    方式2:在服务运行期间,使用set命令重新设置系统变量的值

    set @@global.变量名 = 变量值
    或者
    set global 变量名 = 变量值
    
    • 1
    • 2
    • 3

    2、用户变量

    2.1 分类

    用户变量是用户自己定义的,根据作用范围不同,又分为会话用户变量和局部变量。

    • 会话用户变量: 作用域和会话变量一样,只对当前连接会话有效。用@表示
    • 局部变量:只在begin和end语句块中有效,局部变量只能在存储过程和函数中使用。

    2.2 使用

    定义会话用户变量

    方式一:set中使用 = 或 :=
    set @用户变量 =;
    set @用户变量 :=;
    
    方式二:select中使用 :=into关键字
    select @用户变量 := 表达式 from ...
    select 表达式 into @用户变量 from ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    查看会话用户变量

    select @变量名
    
    • 1

    定义局部变量
    局部变量必须使用declare声明,必须在begin…end中,必须在首行的位置。

    declare 变量名 类型[default]; // 如果没有default子句,初始值为null
    
    • 1

    3、定义条件与处理程序

    定义条件是实现定义程序执行过程中可能遇到的问题,处理程序定义了在遇到问题时应当采取的处理方式。保证存储过程和函数在遇到警告或错误时能继续执行。
    当存储过程中执行sql语句报错时,mysql数据库会抛出错误,并退出当前sql逻辑,不再向下执行。

    3.1 定义条件

    定义条件就是给mysql中的错误命名,有助于错误更清晰。它将一个错误名字和指定的错误条件关联起来,这个名字可以再随后定义处理程序的declare handler语句中。

    declare 错误名 condition for 错误码(或错误条件)
    
    • 1

    3.2 错误码说明

    • mysql_error_code是数值类型错误代码。
    • sqlstate_value是长度为5的字符串类型错误代码。

    例如ERROR 1418(HY000)中,1414是mysql_error_code,HY000是sqlstate_value。

    3.3 定义处理程序

    可以为sql执行过程中发生的某种类型的错误定义特殊的处理程序。定义处理程序时,使用declare语句的语法如下:

    declare 处理方式 handler for 错误类型 处理语句
    
    • 1

    在这里插入图片描述

    4、mysql8.0新特性—全局变量的持久化

    在mysql数据库中,全局变量可以通过set global语句来设置。但是数据库重启后,服务器又会从mysql配置文件中读取变量的默认值。mysql8.0版本新增了set persist命令。

    set persist max_connections = 1000;
    
    • 1

    mysql会将该命令的配置保存到数据目录下的mysqld-auto.cnf文件中,下次启动会读取该文件,用其中的配置来覆盖默认的配置文件。


    二、流程控制

    1. 介绍

    解决复杂问题不可能只通过一个sql语句完成,我们需要执行多个sql操作。流程控制语句的作用就是控制存储过程中sql语句的执行顺序。
    流程分为三大类:

    • 顺序结构:程序从上往下依次执行
    • 分支结构:程序按条件进行选择执行,从两条或多条路径中选择一条执行。
    • 循环结构:程序满足一定条件下,重复执行一组语句。

    针对mysql流程控制语句主要有3类:

    • 条件判断语句:if和case
    • 循环语句:loop、while和repeat语句
    • 跳转语句:iterate和leave语句

    2.分支结构

    if语句

    if 表达式1 then 操作1
    [elseif 表达式2 then 操作2]
    [else 操作n]
    end if
    
    • 1
    • 2
    • 3
    • 4

    case语句

    case 表达式
    when1 then 结果1(如果是语句,需要加分号)
    when2 then 结果2(如果是语句,需要加分号)
    ...
    else 结果n或语句n
    end [case] (如果是在begin end中需要加上case,如果放在select后面不需要)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    case 
    when 条件1 then 结果1(如果是语句,需要加分号)
    when 条件2 then 结果2(如果是语句,需要加分号)
    ...
    else 结果n或语句n
    end [case] (如果是在begin end中需要加上case,如果放在select后面不需要)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.循环结构

    loop循环语句用来重复执行某些语句。loop内的语句一直重复执行直到循环被退出(遇到leave子句),跳出循环。

    [loop_label:] Loop
    	循环执行的语句
    end loop [loop_label]
    
    • 1
    • 2
    • 3
    [while_label:] while 循环条件 do
    	循环执行的语句
    end while [while_label]
    
    • 1
    • 2
    • 3
    [repeat_label:] repeat
    	循环执行的语句;
    until 循环语句结束条件表达式 end repeat [repeat_label]
    
    • 1
    • 2
    • 3

    loop一般用于实现简单”死循环“;while先判断后执行;repeat先执行后判断,无条件至少执行一次;

    leave 标记名 可以跳出循环或者跳出程序体,相当于break;
    iterate 标记名 跳过当前循环,相当于continue;


    三、游标

    游标可以在结果集中像指针一样,向前定位一条记录,向后一条记录或者随意定位一条记录。

    1. 声明游标

    在mysql中,使用declare关键字来声明游标,其语法基本形式如下:

    declare cursor_name CURSOR FOR select_statement;
    
    • 1

    这个语法适用于mysql,sqlserver,db2和mariaDB。如果是用Oracle或者postgresql,需要写成:

    declare cursor_name CURSOR IS select_statement;
    
    • 1

    2.打开游标

    打开游标的时候select语句的查询结果集就会送到游标的工作区,为后面游标的逐条读取结果集中的记录做准备。

    open cursor_name;
    
    • 1

    3.使用游标

    语法如下:

    FETCH cursor_name into 变量名,...
    
    • 1

    注意,游标的查询结果集中的字段数,必须跟into后面的变量数一致。变量必须在声明游标前就定义好。
    游标用完后必须关闭游标,应为游标会占用系统资源。如果不及时关闭,游标会一直保存到存储过程结束,影响系统运行的效率。关闭之后,就不能检索查询结果中的数据行,如果需要检索只能再次打开游标。

    close cursor_name
    
    • 1

    游标一般在循环体中使用,应为每调一次fetch都会将光标指向下一条记录。

    4.例子

    在这里插入图片描述

  • 相关阅读:
    AUC的理解
    【408数据结构与算法】—栈的抽象数据类型定义(十)
    深入理解Linux网络总结
    leetcode 53. 最大子数组和(简单dp)
    Spring MVC BeanNameViewResolver原理解析
    异步编程生产实践
    PyQt5快速开发与实战 4.9 对话框类控件
    Graphviz安装教程
    第五章 Ambari二次开发之自定义Flink服务概述
    java小游戏-java小游戏-大鱼吃小鱼
  • 原文地址:https://blog.csdn.net/qq_51114283/article/details/125544670