Mysql 还支持用户定义变量的概念,它允许将值从一个语句传递到另一个语句。 Mysql 中用户定义的变量写为@var_name其中, var_name是变量的名称,可以由字母数字字符、.、_ 和$ 组成。
- 用户定义的变量是特定于会话的,即由一个客户端定义的变量不会与其他客户端共享,并且当会话结束时,这些变量会自动过期。
- 这些变量不区分大小写。因此, @mark或@Mark都指代相同的值。
- 变量的最大长度可以是 64 个字符。
- 变量名称可以在其名称中包含其他字符,如 – {!, #, ^, -, ..}(如果它们被引用的话)。例如-@’var@1′ 或@”var^2″ 或@`var3`。
- 这些变量不能被声明,它们只被初始化,即在声明时它们应该被分配一个值。
- 未声明的变量也可以在 SQL 语句中访问,但它们的值设置为NULL 。
- 这些变量可以从以下一组数据类型中取值 – {整数、浮点、十进制、二进制、非二进制字符串或 NULL 值。
句法:
SET @var_name = expression
例子:
- 使用SET命令为变量赋值。
mysql>SET @var1 = 2+6; mysql>SET @var2 := @var1-2;
这些变量的值可以通过在 SELECT 语句中引用它们来显示 –
mysql>SELECT @var1, @var2;
输出:
+-------+-------+ | @var1 | @var2 | +-------+-------+ | 8 | 6 | +-------+-------+
-
访问未声明的变量
mysql>SELECT @var3;
输出:
+-------+ | @var3 | +-------+ | NULL | +-------+
此处, varialbe @var3未声明,因此其默认值为 NULL。
-
不使用SET为变量赋值。
mysql>SELECT @var3 := 4;
输出:
+----------+ | @var3:=4 | +----------+ | 4 | +----------+
在上面的例子中 – 变量@var3应该只使用:= not =赋值,后者在非SET语句中被视为比较。喜欢-
mysql>SELECT @var4 = 5;
输出:
+----------+ | @var4=5 | +----------+ | NULL | +----------+
这些变量如何用于存储将来使用的值。
考虑一下下面的学生表-
s_id s_name mark 1 shagun 15 2 taruna 5 3 riya 15 4 palak 10 5 neha 7 6 garima 17 现在,我们必须使用用户定义的变量来找到这些学生的排名。
为此,我们初始化了两个变量 – @rank和@prev_mark 。
mysql>SET @rank=0, @prev_mark=0;
询问:
mysql>Select s_name, if (@prev_mark != mark, @rank:=@rank+1, @rank) as 'rank', @prev_mark:=mark as 'marks' from student order by mark desc;
这里,变量@rank用于存储学生的排名, @prev_mark用于存储以前学生的分数。
进行分数之间的比较,以便如果两个学生的分数相等,则可以避免@rank变量的增加。
在学生表按“标记”列按降序排序后,两个变量都会发生变化。
输出:
s_name rank marks garima 1 17 shagun 2 15 riya 2 15 palak 3 10 neha 4 7 taruna 5 5 因此,我们得到按“标记”列以降序和学生排名排序的结果学生表。
注意:在上面的查询中,请注意 select 语句中列的顺序。如果“marks”列写在“rank”列之前,那么我们不会得到想要的输出。因为每次@prev_mark 都被分配了当前学生的标记,结果评估 @prev_mark!=mark 为false 。因此,每个学生的排名显示为非递增,即它将保持为 0。