Jw
首页
技术
英语
首页
技术
英语
  • MySQL

    • MySQL 基础
    • 环境变量配置(PATH)
    • SQL 语法与分类
    • MySQL 数据类型
    • SQL - DDL 数据定义语言
    • SQL - DML 数据操作语言
    • SQL - DQL 数据查询语言
    • SQL - DCL 数据控制语言
    • MySQL 函数
    • SQL 约束
    • SQL 外键约束
    • 多表关系
    • 多表查询(连接查询)
    • 隐式内连接 vs 显式内连接
    • 子查询
    • 多表查询案例
    • 事务
    • 并发事务问题与隔离级别
    • MySQL 体系结构与存储引擎
    • 索引概述
    • 索引结构
    • 索引分类
    • 索引语法
    • SQL 性能分析
    • 索引使用
    • 索引设计原则
    • SQL 优化 - 插入数据与主键优化
    • SQL 优化 - order by 与 group by
    • SQL 优化 - limit / count / update
    • 视图
    • 存储过程
    • 存储过程 - 变量
    • 存储过程 - 流程控制、游标与条件处理
    • 存储函数
    • 触发器
    • 锁概述与全局锁
    • 表级锁
    • 行级锁
    • InnoDB 逻辑存储结构
    • InnoDB 架构
    • 事务原理(redo / undo log)
    • MVCC
    • MySQL 系统数据库
    • MySQL 常用工具
    • 数据备份与导入导出
    • 错误日志与二进制日志
    • 查询日志与慢查询日志
    • 主从复制 - 概述与原理
    • 主从复制 - 搭建
    • Mycat 配置
    • Mycat 垂直拆分与水平拆分
    • Mycat 分片规则
    • Mycat 管理与监控
    • Mycat 读写分离 - 一主一从
    • Mycat 读写分离 - 双主双从

存储过程 - 变量

MySQL 中的变量分三类:系统变量(服务器级)、用户变量(连接级)、局部变量(BEGIN ... END 块内),三者的定义者、作用域和声明方式各不相同。

一、对比

类型定义者作用域是否需要声明写法
系统变量MySQL 服务器全局(GLOBAL)或会话(SESSION)否,由服务器提供@@变量名
用户变量用户当前连接否,直接用@变量名
局部变量用户其所在的 BEGIN ... END 块是,DECLARE变量名(无 @)

二、系统变量

系统变量由 MySQL 服务器提供,不是用户定义的,分为 全局变量(GLOBAL) 和 会话变量(SESSION)。

查看

SHOW [SESSION | GLOBAL] VARIABLES;                  -- 查看所有系统变量
SHOW [SESSION | GLOBAL] VARIABLES LIKE '……';        -- 模糊匹配查找变量
SELECT @@[SESSION | GLOBAL].系统变量名;              -- 查看指定变量的值

设置

SET [SESSION | GLOBAL] 系统变量名 = 值;
SET @@[SESSION | GLOBAL].系统变量名 = 值;
  • 没有指定 SESSION / GLOBAL 时,默认是 SESSION(会话变量)。
  • 通过 SET GLOBAL 设置的全局参数,MySQL 服务重启后失效;要永久生效,需写入配置文件(如 /etc/my.cnf)。
SHOW SESSION VARIABLES LIKE 'auto%';
SHOW GLOBAL VARIABLES LIKE 'auto%';
SELECT @@autocommit;
SELECT @@GLOBAL.autocommit;

SET SESSION autocommit = 0;   -- 仅当前会话关闭自动提交
SET GLOBAL autocommit = 1;    -- 全局开启自动提交(重启失效)

三、用户变量

用户根据需要自定义的变量,无需提前声明或初始化,直接用 @变量名 使用,作用域为当前连接。未赋值时取值为 NULL。

赋值

SET @var_name = expr [, @var_name = expr] ...;
SET @var_name := expr [, @var_name := expr] ...;
SELECT @var_name := expr [, @var_name := expr] ...;
SELECT 字段名 INTO @var_name FROM 表名;
SET @myname = 'itcast';
SET @myage := 10;
SET @mygender := '男', @myhobby := 'java';
SELECT @mycolor := 'red';
SELECT COUNT(*) INTO @mycount FROM tb_user;

-- 使用
SELECT @myname, @myage, @mygender, @myhobby, @mycolor, @mycount;
SELECT @abc;                  -- 未赋值 → NULL

易错:SELECT 里的 = 是比较运算,赋值必须用 :=;SET 里 = 和 := 都可以。

四、局部变量

局部变量是根据需要定义的、只在 BEGIN ... END 块内生效的变量,访问前必须 DECLARE 声明,可用于存储过程 / 函数内部,也可用作输入参数。

声明

DECLARE 变量名 变量类型 [DEFAULT ...];

变量类型就是数据库字段类型,如 INT、BIGINT、CHAR、VARCHAR、DATE、TIME 等。

赋值

SET 变量名 = 值;
SET 变量名 := 值;
SELECT 字段名 INTO 变量名 FROM 表名 ...;
CREATE PROCEDURE p2()
BEGIN
    DECLARE stu_count INT DEFAULT 0;
    SELECT COUNT(*) INTO stu_count FROM tb_user;
    SELECT stu_count;
END;

CALL p2();

局部变量只能在声明它的 BEGIN ... END 中使用,块外访问会报错。DECLARE 必须写在块的开头,先于其他可执行语句。

速查

-- 系统变量:查看 / 设置(默认 SESSION;GLOBAL 重启后失效)
SHOW SESSION VARIABLES LIKE 'auto%';     -- 模糊查找
SELECT @@GLOBAL.autocommit;              -- 查看全局值
SET SESSION autocommit = 0;              -- 设置会话值

-- 用户变量:无需声明,= 或 := 赋值,SELECT 里只能用 :=
SET @myname := 'itcast';
SELECT COUNT(*) INTO @mycount FROM tb_user;
SELECT @myname, @mycount;                -- 未赋值的变量为 NULL

-- 局部变量:必须 DECLARE,只在 BEGIN ... END 内有效
CREATE PROCEDURE p2()
BEGIN
    DECLARE stu_count INT DEFAULT 0;
    SELECT COUNT(*) INTO stu_count FROM tb_user;
    SELECT stu_count;
END;
CALL p2();
类型一句话
系统变量 @@服务器配置,默认会话级
用户变量 @连接内有效,直接用
局部变量DECLARE 声明,块内有效

相关

  • 存储过程:创建、调用、参数(IN / OUT / INOUT)
  • 存储过程:流程控制、游标与条件处理:局部变量配合 IF / 循环使用
  • 事务:autocommit 与事务的关系
最近更新: 2026/10/13 22:04
Contributors: liujw
Prev
存储过程
Next
存储过程 - 流程控制、游标与条件处理