15. Mysql 变量的使用

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 15. Mysql 变量的使用

变量的概述

MySQL支持不同类型的变量,包括自定义变量、系统变量和局部变量。自定义变量是在会话中定义的变量,用于存储临时数据。系统变量MySQL服务器提供的全局变量,用于控制服务器的行为。局部变量是存储过程或函数中使用的变量,它们的作用范围仅限于该存储过程或函数。

变量常用于存储和操作数据,执行复杂的计算和逻辑操作,控制查询的执行流程,以及传递数据和结果等。

自定义变量

自定义变量是用户根据所需而自建的变量,该变量特别有用,常用语固定的查询中,只要传入该变量就能得到所需要的结果。为了编码规范,自定义变量以一个“@” 开头。


用户定义变量的作用范围是会话级别。这意味着当一个会话结束时,变量的值将被清除。如果需要在不同的会话中使用变量,则需要使用全局变量。

用户定义变量可以存储不同类型的数据,包括整数、浮点数、字符串等。变量的数据类型是根据赋给变量的值自动确定的。

示例

简单变量赋值

# 定义变量
set @a = 1;
set @b := 2;
set @c := @a + @b;
# 查询变量
select @a,@b,@c,@c+3;
+------+------+------+------+
| @a   | @b   | @c   | @c+3 |
+------+------+------+------+
|    1 |    2 |    3 |    6 |
+------+------+------+------+
# 更新之前变量值,常用于循环中
set @a = @a + 1;

变量实现排名

select student_id,
       subject,
       score,
       `row_number`
from (select a.student_id,
             a.subject,
             a.score,
             if(@pre_subject = a.subject,   -- 排序后,判断上一行的学科是否等于当前行
        @row_num := @row_num + 1,   -- 是,返回@row_num+1,并且再次赋值给该变量@row_num
        @row_num := 1) `row_number`,-- 否,重置@row_num变量为1
             @pre_subject := a.subject      -- 将当前行的学科赋值给@pre_subject
      from student_subject_scroe as a,
           (select @pre_subject := null, @row_num := 0) b -- 临时表b,定义初始变量
      order by subject, score desc  -- 根据学科,分数降序排
) as c;

上面是变量实现排名的一种情况,如果想了解更多可以查看:Mysql 常见排名实现

系统变量

系统变量定义了当前MySQL服务实例的属性、特征,可以简单理解成是系统定义好的变量。这些系统变量的值要么是编译MySQL时参数的默认值,要么是配置文件(例如my.ini等)中的参数值。

按作用域分类,系统变量可以分为全局变量(需要添加 global 关键字)以及会话变量(需要添加 session 关键字),简单理解就是会话变量仅在当前会话生效,而全局变量则一直生效。

查看系统变量

# 查看所有全局变量
show global variables;
# 查看所有会话变量
show session variables;
show variables;
# 查看条件下的系统变量。
show global variables like '%version%';
# 查看条件下的会话变量
show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
# 查看指定变量
select @@max_connections;
+-------------------+
| @@max_connections |
+-------------------+
|               151 |
+-------------------+
select @@global.time_zone,@@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

系统变量赋值

全局变量的赋值:set global 变量名 = 值;

会话变量的赋值:set 变量名 = 值; 或者set @@变量名 = 值。

@@首先标记会话变量,如果会话变量不存在,则标记全局变量。

示例

设置时区:设置为北京时间,也就是我们所在的东8区。

# 方法一:刷新后能用,服务器重启会丢失
set global time_zone = ‘+8:00’;
set time_zone = ‘+8:00’;
flush privileges;
# 方法二:修改配置文件 /etc/my.cnf
[mysqld]
default-time_zone = '+8:00'

设置连接次数

set global max_connections = 161;
set max_connections = 161;
set @@global.max_connections = 161;

以上是常见的两个系统变量修改,如果遇到其他变量要修改,方法也是类似。

局部变量

在存储过程或函数中,可以使用DECLARE语句定义局部变量。局部变量只在存储过程或函数的作用域内有效。可以使用局部变量进行计算、逻辑判断和存储数据等操作。

示例:

简单的存储过程

create procedure myprocedure()
begin
    declare a int;
    declare b int default 0;
    declare c varchar(255);
    set a = 10;
    select a,b,c;
    -- 其他逻辑操作
end;

带有逻辑判断的存储过程

create procedure myprocedure()
begin
    declare a int;
    set a = 10;
    if a > 5 then
        -- 执行某些操作
    end if;
    -- 其他逻辑操作
end;

总结

通过常见的几种变量介绍,可以发现变量不仅可以用来存储临时数据,还可以控制服务器行为,进一步提供高级的数据处理和计算能力,而且在控制着查询的执行流程和动态查询中非常实用,比如定义时间变量,写好执行sql脚本或者存储过程,通过创建事件定时任务或者python每日定时执行,即可实现动态数据库操作。

参考资料

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
1月前
|
存储 自然语言处理 关系型数据库
MySQL 自定义变量并声明字符编码
MySQL 自定义变量并声明字符编码
78 1
|
3月前
|
存储 关系型数据库 MySQL
mysql 使用变量存储中间结果的写法
mysql 使用变量存储中间结果的写法
|
1月前
|
关系型数据库 MySQL 数据处理
企业级应用 mysql 日期函数变量,干货已整理
本文详细介绍了如何在MySQL8.0中使用DATE_FORMAT函数进行日期格式的转换,包括当日、昨日及不同时间段的数据获取,并提供了实际的ETL应用场景和注意事项,有助于提升数据处理的灵活性和一致性。
41 0
|
6月前
|
存储 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】变量
【MySQL进阶之路 | 基础篇】变量
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)
MySQL数据库——存储过程-变量(系统变量、用户定义变量、局部变量)
349 0
|
5月前
|
存储 关系型数据库 MySQL
Mysql存储过程查询结果赋值到变量
Mysql存储过程查询结果赋值到变量
151 0
|
6月前
|
关系型数据库 MySQL
mysql 动态变量,可以在线修改
7.1.9.2 Dynamic System Variables
46 0
|
关系型数据库 MySQL
|
11月前
|
存储 SQL 关系型数据库
MySQL基础-变量/流程控制/游标/触发器
MySQL基础-变量/流程控制/游标/触发器