正如manual所说
在SELECT语句中,仅在发送到客户端时评估每个select表达式。
但是当我在mysql 5.7中编写以下sql时
SET @row_num:=1,@type:='';
SELECT type ,age ,id,
@row_num:=IF(@type=type,@row_num+1,1) as row_number,
@type:=type as c_type
from t_foo
group by type,age,id
sql应该为每种类型中的行编号。但它没有。
sql输出在这里:
output && result
似乎sql首先执行select
子句,然后执行group by
子句。
答案 0 :(得分:0)
看看这个:
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;
查询执行顺序
首先执行FROM子句和后续JOIN,以确定正在查询的数据的总工作集。这包括此子句中的子查询,并且可以导致在引擎盖下创建临时表,其中包含要连接的表的所有列和行。
一旦我们拥有了总工作数据集,首先将WHERE约束应用于各个行,并且丢弃不满足约束的行。每个约束只能直接从FROM子句中请求的表访问列。查询的SELECT部分中的别名在大多数数据库中都不可访问,因为它们可能包含依赖于尚未执行的查询部分的表达式。
然后,应用WHERE约束之后的其余行将根据GROUP BY子句中指定的列中的公共值进行分组。作为分组的结果,只有与该列中的唯一值一样多的行。隐含地,这意味着只有在查询中具有聚合函数时才需要使用它。
如果查询具有GROUP BY子句,则HAVING子句中的约束将应用于分组行,丢弃不满足约束的分组行。与WHERE子句一样,在大多数数据库中也无法从此步骤访问别名。
最终计算查询的SELECT部分中的任何表达式。
在剩余的行中,标记为DISTINCT的列中具有重复值的行将被丢弃。
如果ORDER BY子句指定了一个订单,那么这些行将按指定的数据按升序或降序排序。由于已经计算了查询的SELECT部分中的所有表达式,因此可以在此子句中引用别名。
最后,丢弃超出LIMIT和OFFSET指定范围的行,从查询中返回最后一组行。