如何在此查询中的GROUP BY之前执行SELECT?

时间:2015-02-16 04:42:31

标签: mysql sql oracle

我正在查看执行SQL的顺序,我发现它是:

FROM,
WHERE,
GROUP BY,
HAVING,
SELECT,
ORDER BY

但在下面的查询中" _index"在GROUP BY中使用,这怎么可能?

SELECT COUNT(ab.id) AS count, COUNT(ab.id)/365.24 AS average,
    IF((SUBSTR(ab.begin, 1, 7) = '2014-08'), '2014-08-18 00:00:00.0 CEST',
    IF((SUBSTR(ab.begin, 1, 7) = '2014-09'), '2014-09-18 00:00:00.0 CEST',
    IF((SUBSTR(ab.begin, 1, 7) = '2014-10'), '2014-10-18 00:00:00.0 CEST',
    IF((SUBSTR(ab.begin, 1, 7) = '2014-11'), '2014-11-18 00:00:00.0 CET',
       '0')))) AS _index
FROM active_begin AS ab 
INNER JOIN asources AS a ON a.id = ab.asource AND a.unit IN (4, 3, 1) 
WHERE (1408226400000 <= ab.begin_time AND ab.begin_time < 1417388400000)
GROUP BY _index

PS。为订单refr:http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm 提前谢谢。

2 个答案:

答案 0 :(得分:5)

我认为这(GROUP BY的SELECT子句中定义的ability to use a column alias)可能是某些数据库允许的非标准扩展(但不是全部)。

您应该再次重复确切的定义或将所有内容包装在子选择中。

如果你的数据库让你逃脱它,那就很幸运。

答案 1 :(得分:2)

没有&#34;顺序&#34;如何执行SQL。 SQL优化器可以选择以它决定最适合查询的任何顺序执行操作。

命令如何解释子句。因此,表别名和列在from子句中定义 - 首先解释。然后解释后续条款。通常,这解释了为什么不能在select子句中使用where中定义的列别名,因为首先解释where子句。