我正在使用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查询中的执行顺序是(如果你向后看关系代数表达式):
我把???符号,因为这是我不理解的部分:
如果SELECT子句是SQL查询的最后一部分,如何将聚合函数的结果重命名为“media_sucursal”,并且在HAVING子句中我能够使用它?
我检查了这个question,但它确认了我上面提到的内容,但没有回答我的问题。
欢迎任何帮助!
答案 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 演示,说明了这一点。