Access 2003完整教程:在同一查询中使用 HAVING 和 WHERE 子句 (ADP)

注释本主题中的信息仅适用于 Microsoft Access 项目 (.adp)。

背景信息

某些情况下,在将组作为整体应用条件(使用 HAVING 子句)之前,可能要从组中排除单个的行(使用 WHERE 子句)。

HAVING 子句与 WHERE 子句相似,但 HAVING 子句仅应用于整个组(即应用于结果集中代表组的行),而 WHERE 子句应用于单独的行。查询可以同时包含 WHERE 子句和 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. 在“数据库”窗口中,单击“对象”下的“查询”按钮图像,再单击要打开的查询,然后单击“数据库”窗口工具栏上的“设计”
  2. 为查询指定组。

    操作方法

    背景信息

    如果要为表的子集创建小计或显示其他汇总信息,可以使用聚合查询创建组。每个组汇总表中有相同值的所有行的数据。

    例如,要按出版商查看“titles”表中书的平均价格。可以按出版商对查询进行分组(如“pub_id”)。查询结果输出可能如下:

    查询结果网格

    对数据分组时,可以仅显示汇总或分组数据,如:

    • 分组列的值(出现在 GROUP BY 子句中)。在上述例子中,“pub_id”是进行分组的列。
    • Values produced by aggregate functions such as SUM(?) and AVG(?). In the example above, the second column is produced by using the AVG(?) function with thepricecolumn.

    不能显示单独的行的值。例如,如果仅根据出版商分组,就不能在查询中显示单独的书目。因此,如果向查询输出中添加列,“查询设计器”自动将其添加到“SQL”窗格中的语句的 GROUP BY 子句中。如果希望汇总某一列,可以为其指定一个聚合函数。

    如果对多个列进行分组,查询中的每个组显示所有分组列的汇总值。

    例如,以下基于titles表的查询根据出版商 (pub_id) 和书籍类型 (type) 分组。查询结果按出版商进行组织,并且显示该出版商出版每种不同类型的书的汇总信息:

    SELECT pub_id, type, SUM(price) Total_price
    FROM titles
    GROUP BY pub_id, type
    

    输出结果如下:

    查询结果网格

    分组行

    1. 在“数据库”窗口中,单击“对象”下的“查询”按钮图像,再单击要打开的查询,然后单击“数据库”窗口工具栏上的“设计”
    2. 通过向“图表”窗格添加要汇总的表、视图或函数,启动查询。

      操作方法

      当创建查询时,是从表、视图或函数中检索数据。如果要在查询中使用这些对象,可将其添加到“图表”窗格中。

      向查询中添加表、视图或用户定义函数

      1. 在“数据库”窗口中,单击“对象”下的“查询”按钮图像,再单击要打开的查询,然后单击“数据库”窗口工具栏上的“设计”
      2. 在“图表”窗格中,用右键单击背景,再从快捷菜单中选择“添加表”。
      3. 在“添加表”对话框中,选择“表”、“视图”或“函数”选项卡。
      4. 在列表中,双击要添加的项目。
      5. 在完成了对项目的添加后,请单击“关闭”按钮。

      “查询设计器”相应地更新“图表”窗格、“网格”窗格和“SQL”窗格。

      可以拖动对象到“图表”窗格。可以从数据库窗口拖动表、视图或内嵌函数。

      可以从“数据库设计器”拖动列或表,或者从剪贴板粘贴。

      在“SQL”窗格的语句中引用表和视图时,它们会被自动添加到查询中。

      如果用户没有足够的权限,“查询”设计器不会显示表、视图或内嵌函数的数据列。这时,只会显示表、视图或内嵌函数的标题栏和“*(所有列)”复选框。

      向新查询中添加现有查询

      1. 如有必要,单击SQL按钮图像以显示SQL窗格。
      2. 在“SQL”窗格中,在 FROM 后键入左右括号 ()。
      3. 为现有查询打开“查询设计器”。(现在有两个打开的“查询设计器”。)
      4. 显示内部查询 - 要包含在新查询(也叫“外部查询”)中的现有查询 - 的“SQL”窗格。
      5. 选取“SQL”窗格中的所有文本,并复制到剪贴板。
      6. 在新查询的“SQL”窗格中单击,使光标置于添加的括号中,并粘贴剪贴板的的内容。
      7. 在“SQL”窗格中,在右括号后,添加别名。有关 SQL 别名和子查询的详细信息,请参阅 Microsoft SQL Server 文档。
    3. 用鼠标右键单击“图表”窗格的背景,然后从快捷菜单中选择“分组”。“查询设计器”会将一个“分组”列添加到“网格”窗格的网格中。
    4. 将要分组的列添加到“网格”窗格。如果要在查询输出中显示列,确定选中了“输出”列。

      “查询设计器”将 GROUP BY 子句添加到“SQL”窗格的语句中。例如,SQL 语句可能如下:

      SELECT pub_id
      FROM titles
      GROUP BY pub_id
      
    5. 将要汇总的列添加到“网格”窗格。要确保已将该列标记为输出。
    6. 在要汇总的列的“分组”网格单元格中,选择适当的聚合函数。

      “查询设计器”自动向汇总的列分派一个列别名。可以用更有意义的名称代替自动生成的别名。

      查询设计器

      SQL 窗格中相应的语句可能如下所示:

      SELECT pub_id, SUM(price) AS Totalprice
      FROM titles
      GROUP BY pub_id
      
  3. 如果尚未在“网格”窗格中,请添加 WHERE 条件所依据的列。
  4. 清除“输出”列,除非数据列是 GROUP BY 子句的一部分或者包含在聚合函数中。
  5. 在“准则”列中指定 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'
    
  6. 在“分组依据”列中,从组和汇总选项列表中选择“位置”。“查询设计器”从 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
    

上页:Access 2003完整教程:在查询中使用表达式 (ADP) 下页:Access 2003完整教程:验证查询 (ADP)

Access 2003完整教程:在同一查询中使用 HAVING 和 WHERE 子句 (ADP)

Access 2003完整教程:验证查询 (ADP)Access 2003完整教程:查看外键约束属性 (ADP)
Access 2003完整教程:缩放数据库图表 (ADP)Access 2003完整教程:即将删除一行或多行。
Access 2003完整教程:不允许空约束表达式。Access 2003完整教程:DELETE 语句与 COLUMN REFERENCE 约束冲突。
Access 2003完整教程:已对多行发生影响。Access 2003完整教程:已成功执行了查询。
Access 2003完整教程:已对照数据源检查过 SQL 语法。Access 2003完整教程:确定要删除数据库中选定的关系吗?
Access 2003完整教程:“数据库设计器”出错Access 2003完整教程:删除选定的列将同时删除关系。
Access 2003完整教程:是否保存对数据库图表的更改?Access 2003完整教程:是否保存对该表的更改?
Access 2003完整教程:INSERT INTO 子句的值列表中出错:无法识别“<Os>”Access 2003完整教程:名称无效。必须为对象提供名称。
Access 2003完整教程:不能对空列编制索引。Access 2003完整教程:表“<0s>”中的列和已有可用的主键或唯一约束不匹配。
Access 2003完整教程:“查询设计器”出错。Access 2003完整教程:函数参数计数错误。
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号