像这样在 sum() 中使用 sql 变量--sum(@wokao) 导致无法预料的结果

Posted

技术标签:

【中文标题】像这样在 sum() 中使用 sql 变量--sum(@wokao) 导致无法预料的结果【英文标题】:using sql variable in sum() like this--sum(@wokao) cause unpredicted result 【发布时间】:2015-07-11 01:58:42 【问题描述】:

查询 1)

Select * From test;

-----------
|no1|no2|
----+------
|1  |   1 |
|2  |   2 |
|3  |   3 |
|4  |   4 |
|5  |   5 |
----+------

查询 2)

select @wokao:= (no1 + no2), @wokao from test group by no1;

2   2
4   4
6   6
8   8
10  10

查询 3)

select @wokao:= (no1 + no2), sum(@wokao) from test group by no1;

2   null
4   2
6   4
8   6
10  8

最后一个 SQL 查询的结果令人困惑。为什么不输出类似第二个查询结果的东西?

我问这个问题是因为我在 google 和 *** 中搜索了“sum() sql variable”的关键字,但一无所获。当我在工作中编写 SQL 查询以使用 SUM() 中的 SQL 变量和大量子查询查询事务信息时,我遇到了这个问题。

非常感谢有人能解释这个问题。

【问题讨论】:

【参考方案1】:

根据mysql Documentation

作为一般规则,除了在 SET 语句中,您不应该为用户变量赋值并在同一语句中读取值。对于其他语句,例如 SELECT,您可能会得到您期望的结果,但是这不能保证。

在下面的语句中,你可能会认为 MySQL 会先评估 @a,然后再进行赋值:

SELECT @a, @a:=@a+1, ...;

但是,涉及用户变量的表达式的计算顺序是不确定的

所以在你的第二个查询中,@wokao 首先计算 @wokao:= (no1 + no2),然后显示结果在第三个查询中,首先显示 sum(@wokao) 的值然后计算,因为首先,@987654326 的值@ 为 null,这就是为什么它首先显示 null,然后添加后续值。

【讨论】:

谢谢。你的回答启发了我!

以上是关于像这样在 sum() 中使用 sql 变量--sum(@wokao) 导致无法预料的结果的主要内容,如果未能解决你的问题,请参考以下文章

对 SQL 中的每一列求和并在行中显示它们

如何在 JPA 的两列上运行像 SUM 这样的聚合函数并显示它们的结果?

sql语句求和

如何减去而不是添加像 sql 函数一样的 Sum() [关闭]

基于列的 SQL 中的 SUM 值

转义 bash 函数参数以供 su -c 使用