我正在查看执行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 提前谢谢。
答案 0 :(得分:5)
我认为这(GROUP BY的SELECT子句中定义的ability to use a column alias)可能是某些数据库允许的非标准扩展(但不是全部)。
您应该再次重复确切的定义或将所有内容包装在子选择中。
如果你的数据库让你逃脱它,那就很幸运。
答案 1 :(得分:2)
没有&#34;顺序&#34;如何执行SQL。 SQL优化器可以选择以它决定最适合查询的任何顺序执行操作。
是命令如何解释子句。因此,表别名和列在from
子句中定义 - 首先解释。然后解释后续条款。通常,这解释了为什么不能在select
子句中使用where
中定义的列别名,因为首先解释where
子句。