Microsoft Access:查询、表单与报表的使用指南
1. 数据插入与修改
在进行数据插入时,如果插入的数据不满足属性上定义的约束条件,插入操作会立即被拒绝。当将指针移出当前行时,意味着插入操作结束,此时系统会检查所有约束条件是否满足,包括必填属性是否已指定值,以及输入的值是否符合定义的验证规则。
若要修改属性值,只需将鼠标指针移至要修改的值上,点击后输入新值。当光标移至不同行时,系统会检查约束条件,若满足则修改生效。
2. 查询定义
2.1 Query By Example(QBE)
2.1.1 QBE概述
QBE是一类尝试实现域关系演算基本思想的语言,通过描述查询结果元素应具备的特征来表达查询。在Access中使用QBE定义查询,需要在一个表结构中填写所有属性和条件,以描述结果的“示例”行。
2.1.2 创建新查询步骤
- 在主数据库窗口中选择“Query”组件。
-
点击“New”,选择“Design view”选项,打开查询设计窗口。该窗口分为上下两部分:
- 上半部分初始为空,从列表中选择查询涉及的表的结构描述填充,表之间通过预定义的连接路径相连。
- 下半部分会出现一个初始为空的表格,有未命名的列和预定义的行,包括“Field”、“Sort”、“Show”和“Criteria”。
2.1.3 各预定义行的作用
| 行名称 | 作用 |
|---|---|
| Sort | 单元格可空或包含“Ascending”(升序)、“Descending”(降序)选项。若不为空,根据该列关联属性的值对结果元组进行排序。若有多个列的“Sort”行有值,从左到右依次考虑。 |
| Show | 单元格包含一个方块,可通过鼠标点击切换是否有勾选标记。若有标记,该列的属性将包含在查询结果中。 |
| Criteria | 单元格包含查询结果元组必须满足的条件。若只对某属性具有特定常数值的元组感兴趣,可在该属性所在列的“Criteria”单元格中直接插入常数值。条件也可以更复杂,包括比较运算符、表达式和对其他属性的引用。 |
2.1.4 属性名称添加方法
- 直接在列的第一行输入属性名称,可在前面加上所属表的名称。
- 从窗口上半部分的表结构表示中选择属性,“拖动”到相应列。
2.1.5 执行查询
查询制定完成后,点击工具栏上带有感叹号的按钮执行查询,查询结果表将替换查询定义窗口显示。
2.1.6 查询示例
-
示例1:查找名为Brown的人的名字(按字母顺序)
假设有数据库包含表“PERSON(First Name, Last Name, Address, City, City of birth, Date of birth)”和表“CITY(Name, Number of inhabitants)”,可按相应规则填充表结构进行查询。 -
示例2:查找居住在波士顿的名为Brown或White的人的名字、姓氏和地址
当查询需要选择满足多个条件的析取的元组时,在不同行填写不同条件,系统会自动在额外行使用“Or”标签。 -
示例3:提取居住在出生城市的“PERSON”表元组的所有属性
列表中的表属性包含星号“*”,表示所有属性。在查询中,为了强制两个属性相等,可在属性“City”的选择值处,使用方括号括起属性名“City of birth”。方括号是Access用于区分对模式组件的引用和字符串常量的语法结构。 -
示例4:查找1965年1月31日之前出生且姓氏以C开头的人的名字和姓氏
Access允许使用常规比较运算符(<, >, <=, >=, <>)和“Like”运算符来制定条件,“Like”用于比较字符串与包含特殊字符“*”和“?”的正则表达式,分别对应标准SQL中的“%”和“_”。
2.1.7 查询属性设置
对于每个查询,可以在不同级别指定一组属性。在单个列级别,可以指定与表结构设计中不同的显示格式。另一个重要属性是消除结果中可能存在的重复项,可通过打开查询属性窗口(使用“View”菜单中的“Property”选项),将“Unique values”属性设置为“Yes”来实现。
2.1.8 多表查询
制定需要多个表的查询时,最好让查询所需的所有表显示在窗口上半部分,从创建新查询时出现的对话框中选择表,表将通过模式设计结束时定义的连接路径显示连接。在查询定义窗口下半部分的表中,可通过“View”菜单选择“Table names”选项添加一个名为“Table”的行,该行显示属性提取自哪个表。如果表元组之间的连接条件是预定义的,则无需指定;若查询需要不同的连接条件,可直接在窗口上半部分的图形表示中修改路径。
2.1.9 中间表的使用
有时需要在窗口上半部分引入其属性不属于查询结果的表。例如,当需要从两个没有直接连接路径的表中提取信息,但连接涉及中间表时,即使查询结果和条件中只使用了两个未连接表的属性,中间表也必须出现在上半部分,否则系统会计算两个表的笛卡尔积,再应用QBE查询结构中出现的条件。
2.1.10 使用聚合运算符的QBE查询
Access提供的聚合运算符包括“Sum”、“Avg”、“Min”、“Max”和“Count”,对应标准SQL中同名的运算符,还提供“DevSt”(标准差)、“Var”(方差)、“First”和“Last”(分别为第一个和最后一个元组的属性值)。使用这些运算符时,需在查询结构中引入“Total”行,可通过“View”菜单选择“Totals”选项添加。
以下是使用聚合运算符的示例:
-
示例1:查询“PERSON”表中的元组数量
在“Total”行中使用“Count”值,查询结果将是元组数量,而不是“PERSON”表中“First Name”属性的值。“Field”行可以出现“PERSON”表的任何属性,但在“Total”行激活时,Access不允许使用星号“
”,因为在计算其他聚合运算符时会产生复杂情况。
-
示例2:按姓氏分组统计人数
在“Total”行中,“Last Name”属性设置为“Group by”,表示按该属性对“PERSON”表的元组进行分组,第二列应用“Count”运算符对每个分组进行统计。
-
示例3:查找至少有两个人拥有的姓氏
Access允许对聚合运算符的结果制定条件,类似于SQL中的“having”子句。在“Criteria”行中指定所需的值即可。
-
示例4:查找1975年1月1日后出生且有同名者的人
*
当查询需要在分组前根据不用于分组的属性值选择元组时,需要区分分组前后应用的条件。在SQL中通过“where”子句和“having”子句区分,在QBE中,对于仅在分组操作前使用的属性,在“Total”行中设置为“Where”。“Where”值与激活的“Show”单元格不兼容,因为使用聚合运算符的查询结果可能只包含聚合运算符的计算结果和用于分组的属性。也可以先定义并保存一个提取1975年1月1日后出生的人的初步查询,再基于该结果定义第二个查询进行分组统计。
2.2 SQL解释器
2.2.1 SQL与QBE的切换
Access除了QBE查询语言,还提供了SQL解释器,可作为QBE的替代。通过点击工具栏最左侧的按钮或在“View”菜单中选择“SQL View”和“Design View”选项,可在QBE和SQL环境之间快速切换,切换时会将当前查询转换为另一种表示形式。
2.2.2 QBE与SQL的转换特点
从QBE转换为SQL总是可行的,每次请求计算QBE查询时,查询会先在内部转换为相应的SQL形式,然后由SQL引擎执行。但从SQL转换为QBE并非总是可行,因为SQL语言更强大,例如可以表达使用并集运算符的查询。QBE在制定仅涉及选择、投影和连接的查询时强大且友好,无需按照严格的语法编写文本;但对于复杂查询,如需要使用SQL中嵌套查询的情况,QBE缺乏足够的表示机制,将使用嵌套查询的SQL查询转换为QBE时,只是将整个嵌套查询的文本返回到“Criteria”行的相应单元格中。
2.2.3 Access中SQL语法的差异
Access的SQL解释器识别的语法是标准SQL语法的轻微变体,支持新函数,有一些语法和语义上的差异:
- “top”子句可用于从结果中选择一定数量的元组。
- 使用方括号括起表和属性的标识符,当标识符中包含空格或特殊字符时必需。
- 连接运算符必须始终使用“inner”或“outer”进行限定。
- “count”运算符的计算方式不同:如果将属性作为参数,该运算符不计算属性的不同值,而是返回该属性的非空值数量,就像显式指定了“all”选项一样,“count”参数中不识别“distinct”选项。
2.2.4 SQL查询示例
例如,对于一个QBE查询,要求返回城市中同名人数,且城市人口超过200,000,只返回前10个结果,并且有预定义的连接路径,对应的Access SQL方言查询如下:
select top 10 Lastname, count (Lastname) as HomonymNumber
from Person inner join City on Person.[City of birth]=City.Name
where [Number of inhabitants] > 200000
group by Lastname
having count (Lastname) > 1
order by count(Lastname) desc
2.3 表单和报表
2.3.1 表单概述
表单可以以美观和结构化的方式展示数据库内容,通常比表格的平面行表示更受欢迎。表单类似于预先打印的表格,有用于插入数据的插槽和指定每个插槽应插入数据项的标签。表单可用于数据插入,创建电子版本的预打印表格,也可用于查看和修改数据库内容。
2.3.2 创建表单步骤
- 在主数据库窗口的“Form”组件中点击“New”按钮。
-
系统会询问是否使用基本设计工具或向导:
- 使用向导可以在短时间内根据表结构创建简单表单,Access提供多种创建表单的向导,不同向导生成的表单结构不同。
- 若不使用向导,工具会显示一个空白页面,设计人员可在其中插入表单组件。也可通过在主数据库窗口中选择现有表单,点击“Design”按钮来探索和修改其结构。
2.3.3 表单的基本元素 - 控件
表单由多个元素组成,基本元素是控件,对应屏幕上的矩形区域,有三种类型:
-
Bound control(绑定控件)
:与表的属性关联,负责表示特定元组的属性值。对于大多数属性,通过打印字符序列表示值;对于具有OLE域的属性,由管理属性内容的应用程序负责表示。
-
Unbound control(未绑定控件)
:包含固定值,通常用于定义表单标签。常量值可以是字符序列或通用对象,例如可将代表徽标的图形分配给未绑定控件插入到表单中。
-
Calculated control(计算控件)
:用于查看表达式的结果,表达式基于常量参数和属性值的任意组合计算。计算控件不能用于插入或更新属性值。
设计好表单后,可直接访问和修改数据库内容。插入新元组的操作可通过表单完成。
以下是创建表单的流程图:
graph TD
A[点击主数据库窗口中Form组件的New按钮] --> B{是否使用向导?}
B -- 是 --> C[选择合适的向导创建表单]
B -- 否 --> D[在空白页面插入表单组件]
C --> E[完成表单创建]
D --> E
综上所述,Access提供了丰富的功能和工具,通过QBE和SQL解释器可灵活进行查询定义,利用表单和报表能更好地展示和管理数据库内容。熟练掌握这些功能,可提高数据库操作的效率和便捷性。
3. 数据插入与修改的深入分析
3.1 插入操作的详细流程
插入数据时,系统会实时检查约束条件。以下是插入操作的详细步骤:
1. 开始插入数据,在表格中输入属性值。
2. 系统会对输入的数据进行初步检查,若不满足属性上定义的约束条件,插入操作立即被拒绝。
3. 当将指针移出当前行,插入操作结束,系统会进行全面检查:
- 检查必填属性是否已指定值。
- 检查输入的值是否符合定义的验证规则。
4. 若所有约束条件都满足,插入操作成功;否则,系统会提示错误信息。
3.2 修改操作的注意事项
修改属性值时,虽然操作简单,但也有一些注意事项:
- 当光标移至不同行时,系统会检查约束条件,若不满足则修改不会生效。
- 对于一些复杂的约束条件,如涉及多个属性之间的关系,修改时需要确保所有相关属性的值都符合约束。
4. 查询定义的高级应用
4.1 复杂查询的构建
在实际应用中,可能会遇到更复杂的查询需求。例如,需要同时使用多个聚合运算符和分组条件。以下是一个示例:
假设有一个数据库包含表“ORDERS(OrderID, CustomerID, OrderDate, TotalAmount)”和表“CUSTOMERS(CustomerID, CustomerName, City)”,要查询每个城市中订单总金额最高的客户。
步骤如下
- 首先,按城市和客户分组,计算每个客户的订单总金额。
- 然后,在每个城市组内找出订单总金额最高的客户。
对应的Access SQL方言查询如下:
SELECT City, CustomerName, MAX(TotalAmount) AS MaxTotalAmount
FROM (
SELECT C.City, C.CustomerName, SUM(O.TotalAmount) AS TotalAmount
FROM ORDERS O
INNER JOIN CUSTOMERS C ON O.CustomerID = C.CustomerID
GROUP BY C.City, C.CustomerName
) AS Subquery
GROUP BY City, CustomerName
HAVING MAX(TotalAmount) = (
SELECT MAX(TotalAmount)
FROM (
SELECT C.City, C.CustomerName, SUM(O.TotalAmount) AS TotalAmount
FROM ORDERS O
INNER JOIN CUSTOMERS C ON O.CustomerID = C.CustomerID
GROUP BY C.City, C.CustomerName
) AS InnerSubquery
WHERE InnerSubquery.City = Subquery.City
);
4.2 查询性能优化
为了提高查询性能,可以采取以下措施:
-
合理使用索引
:在经常用于查询条件的属性上创建索引,可以加快查询速度。例如,在“PERSON”表的“Last Name”属性上创建索引,对于查找特定姓氏的查询会更高效。
-
避免使用复杂的子查询
:尽量将复杂的子查询转换为连接查询,减少查询的嵌套层次。
-
定期清理无用数据
:删除不再需要的数据,减少数据库的大小,提高查询效率。
4.3 查询结果的处理
查询结果可以进行进一步的处理,例如导出到其他文件格式(如Excel、CSV等),或者进行可视化展示。以下是将查询结果导出到Excel文件的步骤:
1. 执行查询,得到查询结果。
2. 在查询结果窗口中,点击“外部数据”选项卡。
3. 在“导出”组中,选择“Excel”。
4. 在弹出的对话框中,选择保存路径和文件名,点击“确定”。
5. 表单和报表的扩展应用
5.1 表单的交互设计
为了提高表单的用户体验,可以进行一些交互设计。例如,添加按钮实现特定功能,如保存数据、重置表单等。以下是添加保存按钮的步骤:
1. 在表单设计视图中,点击“设计”选项卡。
2. 在“控件”组中,选择“按钮”。
3. 在表单上合适的位置绘制按钮。
4. 在弹出的“命令按钮向导”中,选择“记录操作”类别,选择“保存记录”操作。
5. 点击“下一步”,根据需要设置按钮的文本和样式。
6. 点击“完成”。
5.2 报表的定制化
报表可以根据需求进行定制化设计,例如添加图表、分组统计等。以下是在报表中添加图表的步骤:
1. 在报表设计视图中,点击“设计”选项卡。
2. 在“控件”组中,选择“图表”。
3. 在报表上合适的位置绘制图表区域。
4. 在弹出的“图表向导”中,选择要使用的数据表或查询。
5. 选择要显示的字段和图表类型(如柱状图、折线图等)。
6. 根据需要设置图表的标题、坐标轴等属性。
7. 点击“完成”。
5.3 表单和报表的关联
表单和报表可以关联起来,实现数据的动态展示。例如,在表单中选择一个记录,报表自动显示该记录的详细信息。以下是实现关联的步骤:
1. 创建表单和报表,确保它们使用相同的数据源。
2. 在表单中添加一个按钮,用于触发报表的显示。
3. 在按钮的“单击”事件中,编写代码来打开报表并传递当前记录的相关信息。示例代码如下:
Private Sub btnShowReport_Click()
Dim strReportName As String
Dim strWhereClause As String
strReportName = "YourReportName"
strWhereClause = "YourField = '" & Me.YourField & "'"
DoCmd.OpenReport strReportName, acViewReport, , strWhereClause
End Sub
以下是表单和报表关联的流程图:
graph TD
A[在表单中选择记录] --> B[点击显示报表按钮]
B --> C[执行按钮单击事件代码]
C --> D[打开报表并传递相关信息]
D --> E[报表显示所选记录的详细信息]
6. 总结
通过对Microsoft Access的数据插入与修改、查询定义、表单和报表等功能的详细介绍,我们可以看到Access提供了一套完整的数据库管理解决方案。无论是简单的数据操作还是复杂的查询和报表设计,Access都能满足需求。在实际应用中,我们可以根据具体的业务场景,灵活运用这些功能,提高数据库管理的效率和质量。同时,通过不断学习和实践,我们可以进一步挖掘Access的潜力,实现更多的高级应用。
希望本文能够帮助读者更好地理解和使用Microsoft Access,在数据库管理领域取得更好的成果。
超级会员免费看
51

被折叠的 条评论
为什么被折叠?



