没有GROUP BY的情况

时间:2011-08-03 10:15:56

标签: sql

  1. 根据标准(!)SQL?
  2. 是否可以使用以下内容?
  3. 为了符合标准(如果还没有),必须进行哪些微小的改动?
  4. 如果第一行具有 NumberOfPages 的最大值,它在MySQL中可以正常工作。
  5. SELECT * FROM Book HAVING NumberOfPages = MAX(NumberOfPages)

    以下内容写于标准:

      

    HAVING <search condition>

         
        
    • 设G是由&lt;列引用&gt;引用的每个列组成的集合。包含在&lt; group by clause&gt;。
    • 中   
    • 直接包含在&lt;搜索条件&gt;中的每个列引用应为以下之一:      
          
      1. 对功能上依赖于G的列的明确引用。
      2.   
      3. 外部参考。
      4.   
    •   

    source

    根据标准,有人可以解释一下,为什么it should be possible

    在MySQL中,它完美无缺。

4 个答案:

答案 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