我是初学者,自己学习...请帮助我澄清一些关于查询的内容:我正在使用足球数据库并尝试回答这个问题:列出所有季节,平均每个{ {1}}费率超过1,Match
s并未以平局结束;
正确的查询是:
Match
我不理解有关此查询的两件事:
我知道SQL中的执行顺序是这样的:
这
,其中
基
具有
选择
那么这个查询如何包括:如果"比率"则比率> 1;仅在" select"中定义在HAVING之后执行? 我很困惑吗? 在此先感谢您的帮助!
答案 0 :(得分:3)
将乘法作为类型转换添加以将INT转换为FLOAT,因为默认情况下,ints的总和为int,并且除以2个整数后,除法将丢失小数位。
HAVING。您可以将HAVING视为WHERE但应用于查询结果。想象一下,在没有HAVING的情况下首先执行查询,然后将HAVING条件应用于只留下合适的结果行。
在您的情况下,您首先选择分组数据并计算汇总结果,然后跳过不必要的汇总结果。
答案 1 :(得分:0)
* 1.0用于其“.0”部分,以便它告诉系统将表达式视为小数,因此不会产生一个整数除法,它将截断小数部分(例如1而不是1.33) )。
关于第二部分:选择最后只是意味着最后一件事 要做的就是显示数据。 Hoewever,正在为一个计算字段分配一个别名,你可以说,在第一优先级。不过,我有点怀疑;我几乎肯定某些字段别名不能用于/例如sql server中的where / group。
答案 2 :(得分:0)
SQL查询没有执行顺序。 SQL是描述性语言,而不是过程语言。 SQL查询描述查询生成的结果集。 SQL引擎可以随意执行它。实际上,大多数SQL引擎将查询编译为有向非循环图,它看起来与原始查询完全不同。
你所指的可能更好地表达为“解释顺序”。这可以通过简单的规则更简单地描述。列别名可以在任何数据库的ORDER BY
子句中使用。它们不能用于FROM
,WHERE
或GROUP BY
条款。某些数据库(例如SQLite)允许在HAVING
子句中引用它们。
对于* 1.0
,这是因为某些数据库(如SQLite)执行整数运算。但是,您想要的逻辑可能更简单地表达为:
round((avg(home_team_goal + away_team_goal * 1.0), 3)