我不明白为什么我们可以将WHERE子句与日期函数一起使用。例如,让我们采取
SELECT name FROM table1
WHERE DATEDIFF(year1,year2) < 10;
它的工作。我以为我们不能将WHERE用于函数。为此,我们应该使用HAVING子句。那它是如何真实的?日期功能与MAX,MIN,AVG等不同;
答案 0 :(得分:2)
您无法使用WHERE
子句中的函数,这是不正确的。只要它根据所涉及的表的列或仅仅是常量表达式求值为逻辑真/假条件,您几乎可以在其中放置任何内容(聚合除外)。另一方面,HAVING
除了支持其他所有内容外,还支持聚合。
两者之间的区别在于它的执行时间,使用GROUP BY
时它是相关的。首先是WHERE
,它规定了所有相关表格中的行可以用于组成群组的条件,而那些不履行它的群组不会被考虑用于聚合。在分组发生之前,您可以考虑WHERE
处理原始表数据。之后评估HAVING
,当组已经形成并计算聚合时(这就是为什么你可以在这里使用它们)并决定允许哪些最终组出现在最终查询结果中。
它们都在不同的时间和不同的数据集上运行。请注意,如果没有GROUP BY
,则WHERE
和HAVING
是等效的。
答案 1 :(得分:1)
您不能在WHERE
子句之后使用聚合函数,因为它没有意义,而DATEDIFF
是可用的。这没有任何意义,因为它就像告诉计算机一样:
选择id列最大值为34的所有行
这可能听起来有点合乎逻辑,但实际上并非如此,实际上与id < 35
相同。第二种方式也更清晰。
实际问题实际上是,计算选区中列的最大值需要进行选择。因此,MAX
不能用作实际选择要评估的行的条件。
至于DATEDIFF
,它的作用是因为计算机产生的问题是合乎逻辑的:
选择date1和date2之间的差值小于10
的所有行