### 12.4.4 赋值运算符 [](<>)[](<>) [](<>) **表 12.6 赋值运算符** | 姓名 | 描述 | | --- | --- | | [`:=`](assignment-operators.html#operator_assign-value) | 赋值 | | [`=`](assignment-operators.html#operator_assign-equal) | 分配一个值(作为[`放`](set-variable.html)声明,或作为`放`条款中的[`更新`](update.html)陈述) | - [](<>) [`:=`](assignment-operators.html#operator_assign-value) [](<>)[](<>) 赋值运算符。使运算符左侧的用户变量采用其右侧的值。右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(前提是该值是标量值)。您可以在同一个任务中执行多个任务[`放`](set-variable.html)陈述。您可以在同一语句中执行多个赋值。 不像[`=`](assignment-operators.html#operator_assign-equal), 这[`:=`](assignment-operators.html#operator_assign-value)运算符永远不会被解释为比较运算符。这意味着您可以使用[`:=`](assignment-operators.html#operator_assign-value)在任何有效的 SQL 语句中(不仅仅是在[`放`](set-variable.html)语句)为变量赋值。 ``` 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 ``` 您可以使用[`:=`](assignment-operators.html#operator_assign-value)除了在其他陈述中[`选择`](select.html), 如[`更新`](update.html),如此处所示: ``` 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 语句中使用[`:=`](assignment-operators.html#operator_assign-value)运营商,不建议这样做。[第 9.4 节,“用户定义的变量”](user-variables.html),解释了为什么你应该避免这样做。 - [](<>) [`=`](assignment-operators.html#operator_assign-equal) [](<>)[](<>)[](<>) 该运算符用于在两种情况下执行值分配,在接下来的两段中进行了描述。 在一个[`放`](set-variable.html)陈述,`=`被视为赋值运算符,它使运算符左侧的用户变量取其右侧的值。(换句话说,当用于[`放`](set-variable.html)陈述,`=`被同等对待[`:=`](assignment-operators.html#operator_assign-value).) 右侧的值可以是文字值、另一个存储值的变量或任何产生标量值的合法表达式,包括查询结果(前提是该值是标量值)。您可以在同一个任务中执行多个任务[`放`](set-variable.html)陈述。 在里面`放`一个子句[`更新`](update.html)陈述,`=`还充当赋值运算符;但是,在这种情况下,它会导致运算符左侧命名的列采用右侧给出的值,前提是任何`在哪里`条件的一部分[`更新`](update.html)被满足。您可以在同一个文件中进行多项分配`放`一个子句[`更新`](update.html)陈述。 在任何其他情况下,`=`被视为[比较运算符](comparison-operators.html#operator_equal). ``` 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 语法”](set-variable.html),[第 13.2.13 节,“更新语句”](update.html), 和[第 13.2.11 节,“子查询”](subqueries.html).