# 12.4.4 赋值运算符

表 12.6 赋值运算符

姓名 描述
:= 赋值
= 分配一个值(作为声明,或作为条款中的更新陈述)
  • :=

    赋值运算符。使运算符左侧的用户变量采用其右侧的值。右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(前提是该值是标量值)。您可以在同一个任务中执行多个任务陈述。您可以在同一语句中执行多个赋值。

    不像=, 这:=运算符永远不会被解释为比较运算符。这意味着您可以使用:=在任何有效的 SQL 语句中(不仅仅是在语句)为变量赋值。

    mysql> SELECT @var1, @var2;
            -> NULL, NULL
    mysql> SELECT @var1 := 1, @var2;
            -> 1, NULL
    mysql> SELECT @var1, @var2;
            -> 1, NULL
    mysql> SELECT @var1, @var2 := @var1;
            -> 1, 1
    mysql> SELECT @var1, @var2;
            -> 1, 1
    
    mysql> SELECT @var1:=COUNT(*) FROM t1;
            -> 4
    mysql> SELECT @var1;
            -> 4
    

    您可以使用:=除了在其他陈述中选择, 如更新,如此处所示:

    mysql> SELECT @var1;
            -> 4
    mysql> SELECT * FROM t1;
            -> 1, 3, 5, 7
    
    mysql> UPDATE t1 SET c1 = 2 WHERE c1 = @var1:= 1;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT @var1;
            -> 1
    mysql> SELECT * FROM t1;
            -> 2, 3, 5, 7
    

    虽然也可以在单个 SQL 语句中使用:=运营商,不建议这样做。第 9.4 节,“用户定义的变量”,解释了为什么你应该避免这样做。

  • =

    该运算符用于在两种情况下执行值分配,在接下来的两段中进行了描述。

    在一个陈述,=被视为赋值运算符,它使运算符左侧的用户变量取其右侧的值。(换句话说,当用于陈述,=被同等对待:=.) 右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(前提是该值是标量值)。您可以在同一个任务中执行多个任务陈述。

    在里面一个子句更新陈述,=还充当赋值运算符;但是,在这种情况下,它会导致运算符左侧命名的列采用右侧给出的值,前提是任何在哪里条件的一部分更新被满足。您可以在同一个文件中进行多项分配一个子句更新陈述。

    在任何其他情况下,=被视为比较运算符.

    mysql> SELECT @var1, @var2;
            -> NULL, NULL
    mysql> SELECT @var1 := 1, @var2;
            -> 1, NULL
    mysql> SELECT @var1, @var2;
            -> 1, NULL
    mysql> SELECT @var1, @var2 := @var1;
            -> 1, 1
    mysql> SELECT @var1, @var2;
            -> 1, 1
    

    有关详细信息,请参阅第 13.7.6.1 节,“变量赋值的 SET 语法”,第 13.2.13 节,“更新语句”, 和第 13.2.11 节,“子查询”.