SELECT *
FROM Book
HAVING NumberOfPages = MAX(NumberOfPages)
以下内容写于标准:
HAVING <search condition>
- 设G是由&lt;列引用&gt;引用的每个列组成的集合。包含在&lt; group by clause&gt;。
中- 直接包含在&lt;搜索条件&gt;中的每个列引用应为以下之一:
- 对功能上依赖于G的列的明确引用。
- 外部参考。
根据标准,有人可以解释一下,为什么it should be possible?
在MySQL中,它完美无缺。
答案 0 :(得分:19)
尽管Mimer Validator结果为{{3}},但我认为您的标准SQL不合适。
没有HAVING
子句的GROUP BY
子句在标准SQL中是有效且(可以说)有用的语法。因为它作为一个集合一起操作表表达式,所以可以说,使用聚合函数才真正有意义。在您的示例中:
Book HAVING NumberOfPages = MAX(NumberOfPages)
无效,因为在考虑整个表时,NumberOfPages
指的是哪一行?同样,只在SELECT
子句中使用文字值才有意义。
请考虑此示例,它是有效的标准SQL:
SELECT 'T' AS result
FROM Book
HAVING MIN(NumberOfPages) < MAX(NumberOfPages);
尽管缺少DISTINCT
关键字,但查询永远不会返回多行。如果满足HAVING
子句,那么结果将是一行,其中一列包含值'T'(表示我们有不同页数的书籍),否则结果将是空集,即零单列的行。
我认为查询在mySQL中没有错误的原因是由于在HAVING
子句之后导致SELECT
子句(逻辑地)存在的推荐扩展(标准行为是另一种方式),加上其他答案中提到的隐式GROUP BY
子句。
答案 1 :(得分:2)
从标准(粗体加重)
1)让HC成为having子句。设TE为立即包含HC的表表达式。 如果TE不立即包含group by子句,则“GROUP BY()”是隐式的。设T为 由TEC定义的表的描述符直接包含在TE中,并且让R为 GBC的结果。
使用隐式group by子句,外部引用可以访问TE列。
然而,这些标准的认证现在非常自我认证,而且您提供的示例不适用于所有主要的RDBMS提供商。
答案 2 :(得分:0)
“不使用GROUP BY时,HAVING的行为类似于WHERE子句。” where和having之间的区别:WHERE过滤行,而HAVING过滤组
table {border:1px outset;}
th, td {border:1px inset;}
col.isSystem {visibility:collapse;}
结果
<table>
<col/><col class="isSystem"/><col/><col/>
<thead>
<tr><th>One</th> <th>Two</th> <th>Three</th> <th>Four</th></tr>
</thead>
<tbody>
<tr><td>This</td> <td>This</td> <td>This</td> <td>This</td></tr>
<tr><td>is</td> <td>is</td> <td>is</td> <td>is</td></tr>
<tr><td>the</td> <td>the</td> <td>the</td> <td>the</td></tr>
<tr><td>first</td> <td>second</td><td>third</td> <td>fourth</td></tr>
<tr><td>column</td><td>column</td><td>column</td><td>column</td></tr>
</tbody>
</table>
更多细节,请咨询 https://dba.stackexchange.com/questions/57445/use-of-having-without-group-by-in-sql-queries/57453
答案 3 :(得分:-1)
是我们可以编写没有Group by的SQL查询但是编写聚合函数 在我们的查询中。
select sum(Salary) from ibs having max(Salary)>1000