12.3.4 赋值运算符
table12.5 分配运算符
Name | Description |
---|---|
:= | 赋值 |
= | 分配一个值(作为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 节,“子查询”。