MySQL数据库
完成条件
本地变量(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;
注意事项:
- 会话变量的生命周期与当前线程相同,仅在当前会话中有效。
- 如果没有记录返回,用户变量不会被设置。
- 在字段列表中设置的用户变量不能用作条件。
全局变量(Global Variables)
- 全局变量对所有用户可见,可用于修改 MySQL 的配置。
- 根据需求,可以选择临时(会话级别)或永久(全局级别)修改。
示例:
-
永久修改(全局级别):
SET @@global.max_connections = 1000; SHOW GLOBAL VARIABLES LIKE 'max_connections';
-
临时修改(会话级别):
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. =
用于比较或赋值
=
可以在两种情况下使用:
- 条件判断:表示比较运算,用于判断两个值是否相等。
- 赋值操作:用于
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. 总结区别
特性 | := | = |
---|---|---|
功能 | 用户变量赋值 | 比较运算或赋值 |
常用场景 | SET 、SELECT 用户变量赋值 |
条件判断或系统变量赋值 |
赋值语义 | 明确的赋值操作符,不与比较混淆 | 用于 SET 时可以赋值,其他语境中用于比较 |
使用限制 | 只能用于 SQL 语句 | 用于赋值时,常见于 SET 和全局变量 |
最佳实践
- 赋值时优先使用
:=
,特别是涉及用户变量时,可以避免与条件判断混淆。 - 条件判断时使用
=
,确保语义清晰。
总结
- 本地变量:仅限于函数或存储过程的范围内使用。
- 会话变量:用于当前会话,生命周期随线程结束。
- 全局变量:对所有用户有效,可全局或会话级别调整配置。
更多参考:MySQL 官方文档(变量声明)。
最后修改: 2025年01月17日 星期五 19:23