mysql |用户定义的变量
Mysql 还支持用户定义变量的概念,它允许将值从一条语句传递到另一条语句。 Mysql 中的用户定义变量写为@var_name ,其中var_name是变量的名称,可以由字母数字字符、.、_ 和$ 组成。
- 用户定义的变量是特定于会话的,即由一个客户端定义的变量不会与其他客户端共享,并且当会话结束时,这些变量会自动过期。
- 这些变量不区分大小写。因此,@ mark 或 @Mark都指代相同的值。
- 变量的最大长度可以是 64 个字符。
- 变量名称可以在其名称中包含其他字符,例如 - {!、#、^、-、..},如果它们被引用的话。对于 ex-@'var@1' 或 @”var^2” 或 @`var3`。
- 这些变量不能被声明,它们只是被初始化,即在声明时它们应该被赋值。
- 也可以在 SQL 语句中访问未声明的变量,但它们的值设置为NULL 。
- 这些变量可以从以下一组数据类型中获取值 - { 整数、浮点、十进制、二进制、非二进制字符串或 NULL 值。
句法:
SET @var_name = expression
例子:
1. 使用SET命令为变量赋值。
mysql>SET @var1 = 2+6;
mysql>SET @var2 := @var1-2;
这些变量的值可以通过在 SELECT 语句中引用它们来显示 -
mysql>SELECT @var1, @var2;
输出:
+-------+-------+
| @var1 | @var2 |
+-------+-------+
| 8 | 6 |
+-------+-------+
2.访问未声明的变量
mysql>SELECT @var3;
输出:
+-------+
| @var3 |
+-------+
| NULL |
+-------+
此处,变量@var3未声明,因此其默认值为NULL。
3. 不使用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。