MySQL 变量

在计算机编程中,变量是用于存储和表示数据的一种命名内存位置。变量可以存储各种类型的数据,如整数、浮点数、字符串、布尔值等。

MySQL 的存储过程中也支持变量声明和定义,让我们看一下 MySQL 存储过程是如何处理变量的。

用户定义变量

MySQL 提供了用户定义变量(User-Defined Variables)的功能,允许你在查询中声明和使用变量。

使用 SET 语句来声明和赋值一个变量,语法如下:

SET @variable_name = value;

在上面的语法中,@variable_name 是变量的名称,value 是要赋给变量的值。变量名称可以以 @ 开头,后面跟着一个合法的标识符。

以下是一个使用变量的示例:

-- 声明并赋值一个整数变量
mysql> set @age=25;
Query OK, 0 rows affected (0.00 sec)

-- 声明并赋值一个字符串变量
mysql> set @name='John';
Query OK, 0 rows affected (0.00 sec)

-- 使用变量进行查询
mysql> select @name, @age;
+-------+------+
| @name | @age |
+-------+------+
| John  |   25 |
+-------+------+
1 row in set (0.04 sec)

在上面的示例中,我们声明了一个名为 @age 的整数变量,并将值 25 赋给它。我们还声明了一个名为 @name 的字符串变量,并将值 'John' 赋给它。最后,我们使用这些变量进行了一个查询,并将它们的值作为结果返回。

变量在查询中可以像任何其他列或表达式一样使用。你可以在 SELECT 语句、WHERE 子句、ORDER BY 子句等地方使用变量。你还可以在查询中使用变量进行计算、比较和赋值等操作。

用户定义变量命名规则

MySQL 中,变量的命名规则如下:

  • 变量名必须以 @ 符号开头。例如:@variable_name。

  • 变量名必须是一个合法的标识符,由字母、数字和下划线组成。

  • 变量名区分大小写。例如,@variable 和 @Variable 是两个不同的变量。

  • 变量名不能与 MySQL 的保留关键字冲突。

以下是一些有效的变量名示例:

SET @age = 25;
SET @employee_name = 'John';
SET @total_salary = 10000.00;

在上面的示例中,@age、@employee_name 和 @total_salary 都是有效的变量名,符合 MySQL 变量的命名规则。

如果声明变量没有使用 @ 字符开头,则抛出错误提示,如下:

-- 声明一个错误的变量
mysql> set myVar = 10;
1193 - Unknown system variable 'myVar'

-- 声明一个正确的变量
mysql> set @myVar = 10;
Query OK, 0 rows affected (0.00 sec)

mysql> select @myVar;
+--------+
| @myVar |
+--------+
|     10 |
+--------+
1 row in set (0.07 sec)

变量声明

在 MySQL 存储过程中,你可以使用变量来存储和操作数据。存储过程变量是在存储过程中声明的,它们可以存储各种类型的数据,如整数、浮点数、字符串等。

要在存储过程中声明一个变量,可以使用 DECLARE 语句,语法如下:

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];

变量可以在一个 DECLARE 语句中被声明,而且变量可以给出一个默认值(初始值)。如果你不给出 DEFAULT 子句,那么这个变量将会被赋予空值。

使用 DEFAULT 是一项很好的实践,因为除非你给出一个初始值,否则任何依赖于这个变量的后续操作都将在赋值之前返回 NULL 值。

在上面的语法中:

  • variable_name 是变量的名称

  • datatype 是变量的数据类型,可以是任何你可以在 CREATE TABLE 语句中使用的有效 MySQL 数据类型。

  • value 是可选的默认值

以下是一个使用变量的示例:

-- 创建过程,获取用户个数
CREATE PROCEDURE get_user_count()
BEGIN
   -- 声明一个变量,类型为 int,默认值为 0
   -- 该变量用来存储用户数
   DECLARE user_count INT DEFAULT 0;
   
   -- 获取用户数,存储到 user_count 变量中
   SELECT COUNT(*) INTO user_count FROM `user`;
   
   -- 输出用户数
   SELECT user_count;
END;

-- 调用存储过程
mysql> call get_user_count();
+------------+
| user_count |
+------------+
|          1 |
+------------+
1 row in set (0.07 sec)

Query OK, 0 rows affected (0.00 sec)

在上面的示例中,我们创建了一个名为 get_user_count 的存储过程。

在存储过程中,我们声明了一个名为 user_count 的整数变量,并将默认值设置为 0。然后,我们使用 SELECT COUNT(*) INTO user_count 查询语句将 user 表中用户的数量赋值给 user_count 变量。最后,我们使用 SELECT user_count 返回 user_count 变量的值。

注意:存储过程变量可以在存储过程中的任何地方使用,包括查询、计算和赋值等操作,它们可以帮助你更灵活地处理和操作数据。

下面例子向我们演示了各种数据类型的声明:

-- 整数
DECLARE l_int1 int default -2000000;
DECLARE l_int2 INT unsigned default 4000000;
DECLARE l_bigint1 BIGINT DEFAULT 4000000000000000;

-- 浮点数
DECLARE l_float FLOAT DEFAULT 1.8e8;
DECLARE l_double DOUBLE DEFAULT 2e45;
DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95;

-- 日期
DECLARE l_date DATE DEFAULT '1999-12-31';
DECLARE l_datetime DATETIME DEFAULT '1999-12-31 23:59:59';

-- 字符串
DECLARE l_char CHAR(255) DEFAULT 'This will be padded to 255 chars';
DECLARE l_varchar VARCHAR(255) DEFAULT 'This will not be padded';
DECLARE l_text TEXT DEFAULT 'This is a really long string. In stored programs
we can use text columns fairly freely, but in tables there are some
limitations regarding indexing and use in various expressions.';

变量命名规则

MySQL 在变量命名方面具有惊人的灵活性。

MySQL 并不像其他大多数编程语言,MySQL 允许非常长的变量名(大于 255 个字符)。

MySQL 变量名可以包含特殊的字符,并且允许以数字字符开始。

尽管如此,我们还是建议您不要把 MySQL 这种灵活性的优势取代好的命名习惯,并且建议避免使用过长的变量名。

变量赋值

你可以使用 SET 语句操纵变量赋值,请使用如下语法:

SET variable_name = expression [,variable_name = expression ...]

就像你所看到的,你完全可以通过使用一个 SET 语句来完成多次赋值。

大多数语言并不会在对变量赋值时使用 SET 语句,于是结果就很容易造成了在不使用具体的 SET 来对变量赋值时造成的错误。

示例:尝试不使用 SET 语句对变量赋值

mysql> Create procedure no_set_stmt( )
BEGIN
   DECLARE i INTEGER;
   -- 给变量 i 赋值
   i=1;
END;
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1;
END' at line 4

上述示例中,就像经常会犯的存储程序编译错误,错误信息并不会直接指明当前缺失的 SET 语句,所以当检查你程序的编译错误时,应该加倍检查所有的变量赋值,确保他们包含 SET。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号