如何:在同一查询中使用 HAVING 和 WHERE 子句

在某些情况下,在对整个组应用条件(使用 HAVING 子句)之前,可能希望排除组中的单个行(使用 WHERE 子句)。

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

  • 首先在“关系图”窗格中将 WHERE 子句应用于表或表值对象中的单个行。 只有满足 WHERE 子句中条件的行才被分组。

  • 然后将 HAVING 子句应用于结果集中的行。 只有满足 HAVING 条件的组才出现在查询输出中。 可将 HAVING 子句仅应用于也在 GROUP BY 子句或聚合函数中出现的列。

例如,假设您要联接 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 子句的一部分。

备注

以下说明中的某些 Visual Studio 用户界面元素在您计算机上的名称或显示位置可能有所不同。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关详细信息,请参阅 Visual Studio 设置

在聚合查询中指定 WHERE 条件

  1. 为查询指定组。 有关详细信息,请参见 如何:将查询结果中的行分组

  2. 如果 WHERE 条件要基于的列不在“条件”窗格中,请添加该列。

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

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

    备注

    此过程的示例中显示的查询将联接 titles 和 publishers 这两张表。

    此时的查询中,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. 在**“分组依据”列中,从组和汇总选项的列表中选择“Where”**。 查询和视图设计器将从 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
    

请参见

其他资源

对查询结果进行排序和分组

汇总查询结果