📜  mysql |用户定义的变量

📅  最后修改于: 2022-05-13 01:55:11.940000             🧑  作者: Mango

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_ids_namemark
1shagun15
2taruna5
3riya15
4palak10
5neha7
6garima17

现在,我们必须使用用户定义的变量来查找这些学生的排名

为此,我们初始化了两个变量- @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_namerankmarks
garima117
shagun215
riya215
palak310
neha47
taruna55

因此,我们得到了按“标记”列按降序排序的结果学生表以及学生的排名。

注意:在上述查询中,请注意 select 语句中列的顺序。如果“marks”列写在“rank”列之前,那么我们不会得到想要的输出。因为每次@prev_mark被分配当前学生的标记,结果评估 @prev_mark!=mark 为false 。因此,每个学生的排名显示为非递增,即保持为 0。