SQL选择求和查询变量

时间:2016-03-17 02:25:44

标签: sql

SELECT
@frst:= (1) 
+   
@scnd:= (2) as 'Total',
@frst as 'Frst',
@scndas 'Scnd'

此查询返回3 - 3 - 2而不是3 - 1 - 2.我做错了什么?

2 个答案:

答案 0 :(得分:1)

你做错了是在一个表达式中分配变量并使用另一个表达式中的值。 MySQL不保证select中表达式的评估顺序,因此这不安全。

documentation

中对此进行了解释
  

作为一般规则,除了SET语句之外,你永远不应该   为用户变量赋值并读取其中的值   声明。例如,要增加变量,这没关系:

SET @a = @a + 1;
     

对于其他语句,例如SELECT,您可能会得到您期望的结果,   但这不能保证。在以下声明中,   你可能会认为MySQL会首先评估@a然后做一个   第二个任务:

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

但是,涉及用户变量的表达式的评估顺序   未定义。

答案 1 :(得分:0)

这是你在做什么:

SELECT
@frst:= (1) // *1
+   
@scnd:= (2) as 'Total',// *2
@frst as 'Frst',// *3
@scnd as 'Scnd'// *4

就像:

*1 & *2 => set @frst to 1, set @scnd to 2,add and assign to @frst return as total which is 3 (1 + 2)
*3 => @frst as 'Frst' // return 3 as Frst
*4 => @scnd as 'Scnd' // return 2 as Scnd

并且您的查询返回total,其等于3,Frst等于3,Scnd等于2 希望你做对了。