mysql在g​​roup by子句之前或之前选择用户定义的变量?

时间:2016-11-25 07:04:08

标签: mysql sql select group-by

正如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子句。

  1. 如何解释?
  2. 执行mysql子句的顺序是什么?我们可以看看sql是如何执行的吗?如果是,怎么做?

1 个答案:

答案 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;

查询执行顺序

  1. FROM和JOINs
  2. 首先执行FROM子句和后续JOIN,以确定正在查询的数据的总工作集。这包括此子句中的子查询,并且可以导致在引擎盖下创建临时表,其中包含要连接的表的所有列和行。

    1. WHERE
    2. 一旦我们拥有了总工作数据集,首先将WHERE约束应用于各个行,并且丢弃不满足约束的行。每个约束只能直接从FROM子句中请求的表访问列。查询的SELECT部分​​中的别名在大多数数据库中都不可访问,因为它们可能包含依赖于尚未执行的查询部分的表达式。

      1. GROUP BY
      2. 然后,应用WHERE约束之后的其余行将根据GROUP BY子句中指定的列中的公共值进行分组。作为分组的结果,只有与该列中的唯一值一样多的行。隐含地,这意味着只有在查询中具有聚合函数时才需要使用它。

        1. HAVING
        2. 如果查询具有GROUP BY子句,则HAVING子句中的约束将应用于分组行,丢弃不满足约束的分组行。与WHERE子句一样,在大多数数据库中也无法从此步骤访问别名。

          1. 选择
          2. 最终计算查询的SELECT部分​​中的任何表达式。

            1. DISTINCT
            2. 在剩余的行中,标记为DISTINCT的列中具有重复值的行将被丢弃。

              1. ORDER BY
              2. 如果ORDER BY子句指定了一个订单,那么这些行将按指定的数据按升序或降序排序。由于已经计算了查询的SELECT部分​​中的所有表达式,因此可以在此子句中引用别名。

                1. LIMIT / OFFSET
                2. 最后,丢弃超出LIMIT和OFFSET指定范围的行,从查询中返回最后一组行。