在同一查询中使用 HAVING 和 WHERE 子句(可视化数据库工具)

在某些情况下,你可能希望先使用 WHERE 子句从组中排除单个行,然后再使用 HAVING 子句将条件应用于整个组。

HAVING 子句类似于 WHERE 子句,但仅适用于整个组(即在结果集的行中表示分组),而 WHERE 子句适用于单个行。 查询可以同时包含 WHERE 子句和 HAVING 子句。 在这种情况下:

  • WHERE 子句首先应用于示意图窗格中表或表值对象中的单个行。 仅对符合 WHERE 子句中条件的行进行分组。

  • 然后,HAVING 子句将应用于结果集中的行。 只有满足 HAVING 条件的组才会显示在查询输出中。 只能对在 GROUP BY 子句中或作为聚合函数一部分显示的列应用 HAVING 子句。

例如,假设你正在将 titles 表和 publishers 表联接在一起,以创建一个查询,显示一组出版商的平均图书价格。 你只想看到一组特定出版商的平均价格 - 也许只有加州的出版商。 即便如此,你也只想看到平均价格超过10.00美元。

可以通过包括 WHERE 子句来建立第一个条件,该子句在计算平均价格之前放弃不在加州的任何出版商。 第二个条件需要 HAVING 子句,因为条件基于分组和汇总数据的结果。 生成的 SQL 语句可能如下所示:

SELECT titles.pub_id, AVG(titles.price)  
FROM titles INNER JOIN publishers  
   ON titles.pub_id = publishers.pub_id  
WHERE publishers.state = 'CA'  
GROUP BY titles.pub_id  
HAVING AVG(price) > 10  

可以在“条件”窗格中创建 HAVING 和 WHERE 子句。 默认情况下,如果为列指定搜索条件,条件将成为 HAVING 子句的一部分。 但是,您可以将条件更改为 WHERE 子句。

可以创建涉及同一列的 WHERE 子句和 HAVING 子句。 为此,必须将列两次添加到“条件”窗格,然后将一个实例指定为 HAVING 子句的一部分,另一个实例作为 WHERE 子句的一部分。

在聚合查询中指定 WHERE 条件

  1. 指定您的查询的组。 有关详细信息,请参阅 查询结果(Visual Database Tools)中的组行。

  2. 如果该列尚未在“条件”窗格中,请添加它以用作 WHERE 条件的基础。

  3. 清除 输出 列,除非数据列是 GROUP BY 子句的一部分或包含在聚合函数中。

  4. “筛选器” 列中,指定 WHERE 条件。 查询和视图设计器将条件添加到 SQL 语句的 HAVING 子句。

    注释

    此过程示例中所示的查询联接两个表,titlespublishers

    此时在查询中,SQL 语句包含 HAVING 子句:

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    GROUP BY titles.pub_id  
    HAVING publishers.state = 'CA'  
    
  5. 分组依据 列中,从组和摘要选项列表中选择 位置。 查询和视图设计器从 SQL 语句中的 HAVING 子句中删除条件,并将其添加到 WHERE 子句。

    SQL 语句更改为包含 WHERE 子句。

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    WHERE publishers.state = 'CA'  
    GROUP BY titles.pub_id  
    

另请参阅

排序和分组查询结果(Visual Database Tools)
汇总查询结果(Visual Database Tools)