HAVING
在某些情况下,在对作为一个整体的组应用条件之前(使用 HAVING 子句),可能需要从组中排除个别的行(使用 WHERE 子句)。
HAVING 子句与 WHERE 子句类似,但只应用于作为一个整体的组(即应用于在结果集中表示组的行),而 WHERE 子句应用于个别的行。查询可同时包含 WHERE 子句和 HAVING 子句。在这种情况下:
- 首先将 WHERE 子句应用于表中的个别行或关系图网格中的表结构化对象。只对符合 WHERE 子句条件的行进行分组。
- 然后将 HAVING 子句应用于由分组生成的结果集中的行。只有符合 HAVING 子句条件的组才出现在查询输出中。只能将 HAVING 子句应用于也出现在 GROUP BY 子句或聚合函数中的列。
例如,假设联接 titles
和 publishers
表以创建一个查询,显示一组出版商出版的书的平均价格。只想看到一组特定出版商(可能只是加利福尼亚州 (CA) 的出版商)出版的书的平均价格。甚至只想看到超过 10.00 美元的平均价格。
在计算平均价格前,可以包含 WHERE 子句以建立第一个条件,该条件将放弃不在加利福尼亚州 (CA) 的出版商。第二个条件需要 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 条件
- 为查询指定组。有关详细信息,请参见对查询结果中的行分组。
- 如果网格窗格中还没有 WHERE 条件所基于的列,请添加该列。
- 清除"输出"列,除非数据列是 GROUP BY 子句的一部分或包含在聚合函数中。
- 在"准则"列中指定 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'
- 在"分组"列中,从分组和汇总选项列表中选择"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