带有日期函数的SQL

时间:2014-11-30 15:49:40

标签: mysql sql where having

我不明白为什么我们可以将WHERE子句与日期函数一起使用。例如,让我们采取

SELECT name FROM table1
WHERE DATEDIFF(year1,year2) < 10;

它的工作。我以为我们不能将WHERE用于函数。为此,我们应该使用HAVING子句。那它是如何真实的?日期功能与MAX,MIN,AVG等不同;

2 个答案:

答案 0 :(得分:2)

您无法使用WHERE子句中的函数,这是不正确的。只要它根据所涉及的表的列或仅仅是常量表达式求值为逻辑真/假条件,您几乎可以在其中放置任何内容(聚合除外)。另一方面,HAVING除了支持其他所有内容外,还支持聚合。

两者之间的区别在于它的执行时间,使用GROUP BY时它是相关的。首先是WHERE,它规定了所有相关表格中的行可以用于组成群组的条件,而那些不履行它的群组不会被考虑用于聚合。在分组发生之前,您可以考虑WHERE处理原始表数据。之后评估HAVING,当组已经形成并计算聚合时(这就是为什么你可以在这里使用它们)并决定允许哪些最终组出现在最终查询结果中。

它们都在不同的时间和不同的数据集上运行。请注意,如果没有GROUP BY,则WHEREHAVING是等效的。

答案 1 :(得分:1)

您不能在WHERE子句之后使用聚合函数,因为它没有意义,而DATEDIFF是可用的。这没有任何意义,因为它就像告诉计算机一样:

  

选择id列最大值为34的所有行

这可能听起来有点合乎逻辑,但实际上并非如此,实际上与id < 35相同。第二种方式也更清晰。

实际问题实际上是,计算选区中列的最大值需要进行选择。因此,MAX不能用作实际选择要评估的行的条件。

至于DATEDIFF,它的作用是因为计算机产生的问题是合乎逻辑的:

  

选择date1和date2之间的差值小于10

的所有行