关于SQL查询中执行顺序的困惑

时间:2013-08-11 05:27:53

标签: mysql sql relational-algebra

我正在使用Silberschatz,Korth和Surdashan的“数据库系统概念”一书来研究数据库(我引用作者是因为关系代数符号与其他作者不同......

好吧,我认为它是基于关系代数的SQL查询的执行顺序,例如:

如果我有这个SQL查询:

SELECT nombre_sucursal, AVG(saldo) AS media_sucursal
FROM cuenta
GROUP BY nombre_sucursal
HAVING media_sucursal > 800

对应的关系代数表达式如下:

Π nombre_sucursal (σ saldo > 800 (nombre_sucursal Ģ avg(saldo) (cuenta))

嗯......为此,在我看来,SQL查询中的执行顺序是(如果你向后看关系代数表达式):

  1. FROM - (cuenta)关系代数表达式中的基本关系
  2. 关系代数表达式中
  3. GROUP BY nombre_sucursal - nombre_sucursalĢavg(saldo)
  4. HAVING media_sucursal> 800 - σsaldo> 800关系代数表达式
  5. 中的选择操作
  6. SELECT nombre_sucursal,AVG(saldo)AS media_sucursal - Πnombre_sscursal ???
  7. 我把???符号,因为这是我不理解的部分:

    如果SELECT子句是SQL查询的最后一部分,如何将聚合函数的结果重命名为“media_sucursal”,并且在HAVING子句中我能够使用它?

    我检查了这个question,但它确认了我上面提到的内容,但没有回答我的问题。

    欢迎任何帮助!

1 个答案:

答案 0 :(得分:2)

这是MySql扩展行为GROUP BY

的行为
  

<强> MySQL Extensions to GROUP BY
  MySQL扩展了这种行为以允许在中使用别名   聚合列的HAVING子句

您可以使用sql_mode ONLY_FULL_GROUP_BY

停用该扩展程序
SET [SESSION | GLOBAL] sql_mode = ONLY_FULL_GROUP_BY;

如果您尝试在ONLY_FULL_GROUP_BY sql_mode中执行上述查询,则会收到以下错误消息:

  

非分组字段'media_sucursal'用于HAVING子句:SELECT   nombre_sucursal,AVG(saldo)AS media_sucursal FROM cuenta GROUP BY   nombre_sucursal HAVING media_sucursal&gt; 800

正如所料。

这是 SQLFiddle 演示,说明了这一点。