在聚合查询中使用列
创建聚合查询时,查询和视图设计器工具进行某些假设以便可以构造有效的查询。例如,如果正在创建聚合查询并将某个数据列标记为输出,则查询和视图设计器自动使该列成为 GROUP BY 子句的一部分,以便您不会无意中尝试显示汇总中个别行的内容。
使用“分组依据”
查询和视图设计器在处理列时使用下列原则:
当选择“分组依据”选项或将聚合函数添加到查询中时,所有标记为输出或用于排序的列将自动添加到 GROUP BY 子句中。如果列已经是聚合函数的一部分,则不会自动添加到 GROUP BY 子句中。
如果不想使某特定列成为 GROUP BY 子句的一部分,必须在“条件”窗格的“分组依据”列中选择不同的选项以手动更改该设置。然而,查询和视图设计器不会防止您选择可能产生无法运行的查询的选项。
如果在“条件”窗格或“SQL”窗格中手动向聚合函数添加查询输出列,则查询和视图设计器不能自动从查询中移除其他输出列。因此,必须从查询输出中移除剩余的列,或使它们成为 GROUP BY 子句或聚合函数的一部分。
向“条件”窗格的“筛选器”列中输入搜索条件时,查询和视图设计器遵循下列规则:
如果没有显示网格的**“分组依据”**列(因为尚未指定聚合查询),则搜索条件将被放入 WHERE 子句中。
如果已在聚合查询中,并在**“分组依据”列中选择了“Where”**选项,则搜索条件将被放入 WHERE 子句中。
如果**“分组依据”列包含“Where”**以外的任何值,则搜索条件将被放入 HAVING 子句中。
使用 HAVING 和 WHERE 子句
下列原则描述如何在聚合查询的搜索条件中引用列。一般情况下,可使用搜索条件中的某列筛选应汇总的行(WHERE 子句)或确定出现在最终输出中的分组结果(HAVING 子句)。
个别数据列可以出现在 WHERE 子句或 HAVING 子句中,这取决于在查询中的其他地方使用它们的方式。
WHERE 子句用于选择行的子集以进行汇总和分组,因此在分组前应用 WHERE 子句。所以,即使数据列不是 GROUP BY 子句的一部分或者不包含在聚合函数中,也可以在 WHERE 子句中使用它。例如,下面的语句选择所有超过 10.00 美元的书并求其平均价格:
SELECT AVG(price) FROM titles WHERE price > 10
如果创建一个搜索条件,该条件涉及也用于 GROUP BY 子句或聚合函数中的一列,则该搜索条件可以作为 WHERE 子句或 HAVING 子句出现,您可以在创建条件时决定以哪一种形式出现。例如,下面的语句创建每个出版商的书的平均价格,然后为平均价格超过 10.00 美元的出版商显示平均值:
SELECT pub_id, AVG(price) FROM titles GROUP BY pub_id HAVING (AVG(price) > 10)
如果在搜索条件中使用聚合函数,则条件将涉及汇总,因此必须是 HAVING 子句的一部分。