12.3.4 赋值运算符

table12.5 分配运算符

NameDescription
:=赋值
=分配一个值(作为SET语句的一部分或UPDATE语句的SET子句的一部分)

:=

赋值运算符。使操作员左侧的用户变量采用其右侧的值。右侧的值可以是 Literals 值,存储该值的另一个变量,或者是产生标量值的任何合法 table 达式,包括查询的结果(前提是该值是标量值)。您可以在同一SET语句中执行多个分配。您可以在同一条语句中执行多个分配。

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

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

您可以在SELECT之外的其他语句中使用:=进行值分配,例如UPDATE,如下所示:

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 节“用户定义的变量”,说明了为什么应避免这样做。

=

该操作符用于在两种情况下执行值分配,下面两段介绍。

SET语句中,=被视为赋值运算符,它使运算符左侧的用户变量采用其右侧的值。 (换句话说,当在SET语句中使用=时,它与:=相同。)右侧的值可以是 Literals 值,另一个存储值的变量或任何产生标量值的合法 table 达式,包括查询的结果(前提是该值是标量值)。您可以在同一SET语句中执行多个分配。

UPDATE语句的SET子句中,=也充当赋值运算符。但是,在这种情况下,只要满足UPDATE的任何WHERE条件,它就会使在运算符左侧命名的列采用赋给右侧的值。您可以在UPDATE语句的同一SET子句中进行多个分配。

在任何其他上下文中,=被视为comparison operator

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.4.1 节“变量分配的 SET 语法”第 13.2.11 节“ UPDATE 语句”第 13.2.10 节,“子查询”