本地变量(Local Variables)

  • 本地变量只能在其所在的函数或存储过程内使用,外部无法访问。
  • 声明方式如下:
    DECLARE MyVariable1 INT DEFAULT 1;
    

会话变量(Session Variables)

  • 声明方式:使用 := 赋值操作符来设置会话变量。例如:

    SELECT @test := 2;
    SELECT @test + 1;  -- 返回 3
    
  • 设置多个变量

    SET @startdate = 'some_start_date', @enddate = 'some_end_date';
    
  • 从表中获取数据并存储到变量

    SET @id = 0, @name = '';
    SELECT id, name INTO @id, @name FROM table1 LIMIT 1;
    SELECT @id, @name;
    
  • 使用变量进行统计

    SELECT @numzero := COUNT(*) FROM table1 WHERE field = 0; 
    SELECT @numdistinct := COUNT(DISTINCT field) FROM table1 WHERE field <> 0;
    SELECT @numzero, @numdistinct;
    

注意事项

  1. 会话变量的生命周期与当前线程相同,仅在当前会话中有效。
  2. 如果没有记录返回,用户变量不会被设置。
  3. 在字段列表中设置的用户变量不能用作条件。

全局变量(Global Variables)

  • 全局变量对所有用户可见,可用于修改 MySQL 的配置。
  • 根据需求,可以选择临时(会话级别)或永久(全局级别)修改。

示例

  1. 永久修改(全局级别)

    SET @@global.max_connections = 1000;
    SHOW GLOBAL VARIABLES LIKE 'max_connections';
    
  2. 临时修改(会话级别)

    SET @@session.wait_timeout = 120;
    SHOW SESSION VARIABLES LIKE 'wait_timeout';
    

注意事项

  • 全局变量的修改会影响整个服务器,通常需要管理员权限。
  • 永久修改后,需要确保配置文件同步更新以避免 MySQL 重启后失效。

在 MySQL 中,:== 都用于赋值,但它们的用途和语境不同,具体区别如下:


1. := 用于变量赋值

:= 是专门用于 用户变量 的赋值操作符。它多用于 SET 语句或 SELECT 语句中,明确表示将右侧的值赋给左侧的用户变量。

用法示例

-- 在 SELECT 语句中赋值
SELECT @var := 10;

-- 使用 SET 语句赋值
SET @var := 20;

-- 在查询中赋值并使用
SELECT @sum := SUM(price) FROM products;

-- 将多个字段的值赋给多个用户变量
SELECT id, name INTO @id, @name FROM users LIMIT 1;

特性

  • := 是专门为 用户变量赋值 设计的,不用于普通的条件判断。
  • := 只能在 SQL 语句中使用。
  • := 明确表示赋值,不与布尔表达式混淆。

2. = 用于比较或赋值

= 可以在两种情况下使用:

  1. 条件判断:表示比较运算,用于判断两个值是否相等。
  2. 赋值操作:用于 SET 语句中,为 系统变量会话变量 赋值。

用法示例

  • 比较运算

    SELECT * FROM products WHERE price = 100;
    

    说明:这里的 = 用于比较 price 是否等于 100。

  • 赋值操作

    SET @var = 30;
    SET @@global.max_connections = 200;
    

特性

  • 如果用在 SET 中,=:= 等价,可以互换。
  • 如果用在其他语句中(如 SELECT),= 仅用于比较,不会产生赋值效果。

3. 语法错误的典型案例

以下情况可能引发混淆和错误:

  • SELECT 中尝试使用 = 赋值:

    SELECT @var = 10; -- 这里是一个条件表达式,而不是赋值,可能导致结果不如预期
    
  • 修正为 :=

    SELECT @var := 10; -- 正确,赋值 @var 为 10
    

4. 总结区别

特性 := =
功能 用户变量赋值 比较运算或赋值
常用场景 SETSELECT 用户变量赋值 条件判断或系统变量赋值
赋值语义 明确的赋值操作符,不与比较混淆 用于 SET 时可以赋值,其他语境中用于比较
使用限制 只能用于 SQL 语句 用于赋值时,常见于 SET 和全局变量

最佳实践

  • 赋值时优先使用 :=,特别是涉及用户变量时,可以避免与条件判断混淆。
  • 条件判断时使用 =,确保语义清晰。

总结

  • 本地变量:仅限于函数或存储过程的范围内使用。
  • 会话变量:用于当前会话,生命周期随线程结束。
  • 全局变量:对所有用户有效,可全局或会话级别调整配置。

更多参考:MySQL 官方文档(变量声明)

最后修改: 2025年01月17日 星期五 19:23