SQL - HAVING(执行与结构)

时间:2018-05-17 08:39:16

标签: sql database sqlite

我是初学者,自己学习...请帮助我澄清一些关于查询的内容:我正在使用足球数据库并尝试回答这个问题:列出所有季节,平均每个{ {1}}费率超过1,Match s并未以平局结束;

正确的查询是:

Match

我不理解有关此查询的两件事:

  1. 为什么我* 1.0?为什么有必要?
  2. 我知道SQL中的执行顺序是这样的:

    ,其中

    具有

    选择

  3. 那么这个查询如何包括:如果"比率"则比率> 1;仅在" select"中定义在HAVING之后执行? 我很困惑吗? 在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

  1. 将乘法作为类型转换添加以将INT转换为FLOAT,因为默认情况下,ints的总和为int,并且除以2个整数后,除法将丢失小数位。

  2. HAVING。您可以将HAVING视为WHERE但应用于查询结果。想象一下,在没有HAVING的情况下首先执行查询,然后将HAVING条件应用于只留下合适的结果行。

  3. 在您的情况下,您首先选择分组数据并计算汇总结果,然后跳过不必要的汇总结果。

答案 1 :(得分:0)

* 1.0用于其“.0”部分,以便它告诉系统将表达式视为小数,因此不会产生一个整数除法,它将截断小数部分(例如1而不是1.33) )。

关于第二部分:选择最后只是意味着最后一件事 要做的就是显示数据。 Hoewever,正在为一个计算字段分配一个别名,你可以说,在第一优先级。不过,我有点怀疑;我几乎肯定某些字段别名不能用于/例如sql server中的where / group。

答案 2 :(得分:0)

SQL查询没有执行顺序。 SQL是描述性语言,而不是过程语言。 SQL查询描述查询生成的结果集。 SQL引擎可以随意执行它。实际上,大多数SQL引擎将查询编译为有向非循环图,它看起来与原始查询完全不同。

你所指的可能更好地表达为“解释顺序”。这可以通过简单的规则更简单地描述。列别名可以在任何数据库的ORDER BY子句中使用。它们不能用于FROMWHEREGROUP BY条款。某些数据库(例如SQLite)允许在HAVING子句中引用它们。

对于* 1.0,这是因为某些数据库(如SQLite)执行整数运算。但是,您想要的逻辑可能更简单地表达为:

round((avg(home_team_goal + away_team_goal * 1.0), 3)