📜  mysql |用户定义变量

📅  最后修改于: 2021-09-10 02:25:02             🧑  作者: Mango

Mysql 还支持用户定义变量的概念,它允许将值从一个语句传递到另一个语句。 Mysql 中用户定义的变量写为@var_name其中, var_name是变量的名称,可以由字母数字字符、.、_ 和$ 组成。

  • 用户定义的变量是特定于会话的,即由一个客户端定义的变量不会与其他客户端共享,并且当会话结束时,这些变量会自动过期。
  • 这些变量不区分大小写。因此, @mark@Mark都指代相同的值。
  • 变量的最大长度可以是 64 个字符。
  • 变量名称可以在其名称中包含其他字符,如 – {!, #, ^, -, ..}(如果它们被引用的话)。例如-@’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 |  
    +-------+
    

    此处, varialbe @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。