Access 2003完整教程:关于不同的查询类型 (ADP)

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

查询是对数据库中的数据进行检索、创建、修改或删除的请求。有两种基本类型的查询:

视图

使用视图

存储视图是作为数据库设计的一部分而存储的。设计数据库时,可基于以下原因而在设计中包含视图:

对结果排序可以对视图进行排序,但前提是该视图中包含 TOP 子句。

建立查询计划查询计划是一种内部策略,数据库服务器藉此可尝试快速创建结果集。保存视图后,数据库服务器即为该视图建立查询计划。

使用索引视图和架构绑定

关于索引视图和架构绑定

索引视图是其结果仍在数据库中,但同时建立索引以供快速访问的视图。在Microsoft Access 项目连接 Microsoft SQL Server 2000 Enterprise Edition 或 SQL Server 2000 Developer Edition 的情况下将支持索引视图,但在 Microsoft SQL Server 2000 Desktop Edition 中却不支持索引视图。下列条件下最好使用索引视图:数据为只读属性(例如决策支持系统);索引视图的查询未涉及聚合或联接;索引视图的基本表架构定义不可能进行更改。有关索引视图的详细信息,请参阅 Microsoft SQL Server 文档。

与其他视图类似,索引视图与其数据的基础表有关。这种相关性的含义是:如果更改决定索引视图的基础表,索引视图就可能无效。例如,重命名决定视图的列将会使视图失效。为防止上述情况发生,SQL Server 支持创建带有“架构绑定”的视图。架构绑定可以防止任何会导致视图失效的表或列修改操作。利用“查询设计器”创建的任何索引视图均将自动进行架构绑定,这是因为 SQL Server 要求索引视图具有架构绑定功能。架构绑定并不意味着不能对视图进行修改。它的含义是对基础表或视图所作的修改不能改变视图的结果集。

修改基础表或列会带来什么后果

利用“表设计器”或“数据库设计器”,对于由架构绑定所定义的视图,您可能会试图修改决定该视图的基础表或列。如果这种修改会使视图失效,设计器就将予以警告,同时询问是否要继续。如果选择继续,将出现下列几种情况:

“表设计器”和“数据库设计器”仅在下列条件下才会在修改基础表之前发出警告:该基础表决定某个具有架构绑定的视图,或者所做修改涉及以下操作:

存储过程

存储过程可以使得管理数据库和显示有关该数据库及其用户的信息变得更加容易。存储过程是以一个名称存储的 SQL 语句和可选流程控制语句的预编译的集合,并作为一个整体来执行。存储过程保存在数据库中;可通过应用程序中的一个调用来执行;并允许使用用户声明的变量、条件执行语句和其他强大的编程功能。

存储过程可以包含针对数据库的程序流、逻辑运算和查询。存储过程也能接受参数,输出参数,返回单个或多个结果集或者返回值。

使用存储过程能达到使用 SQL 语句要达到的目的,同时还有如下优点:

单语句存储过程只包含一个 SQL SELECT 语句。可以在“查询设计器”中以图形方式对其进行创建或编辑,并可定义除列属性外的扩展属性。

多语句存储过程包含多个 SQL SELECT 语句。可以在“SQL 文本编辑器”中对其进行创建或编辑,甚至还可使用“查询生成器”以图形方式编辑多语句存储过程中的 SQL SELECT 语句。但无法定义扩展属性。

用户定义函数

将 Microsoft Access 项目连接到 Microsoft SQL Server 2000 数据库时,可以创建和使用用户定义函数。下面的示例说明用户定义函数 ListCust,该函数接受已命名参数并返回表,并用于 SELECT 语句的 FROM 子句中。

SELECT * FROM ListCust(@[Enter a Name])

用户定义函数的概述

用户定义函数是一个查询,对用户定义函数,可以像视图或存储过程一样:

用户定义函数将视图和存储过程的最佳功能合并到一个查询中,在该查询中可以嵌套、向其传递参数、排序并返回值。因为用户定义函数可以返回数据或标量值的单个表,还可隐藏该数据或标量值的创建方式的商务逻辑和细节,并且可简化 SQL 语句语法,因此在很多情况下,建议使用用户定义函数来代替视图和存储过程。

有关用户定义函数的详细信息和示例,请参阅 SQL Server 文档。

三种类型的用户定义函数

根据返回值的类型的不同,每个用户定义函数可以分为下列三种类型之一:

内嵌用户定义函数?包含单个 SELECT 语句并返回数据的可更新表。可以在查询的 FROM 子句中使用该函数。使用“查询设计器”可以以图形方式创建和编辑内嵌用户定义函数。也可以定义扩展属性。

表用户定义函数?包含一个或多个 SELECT 语句并返回数据的不可更新表。可以在查询的 FROM 子句中使用该函数。使用“SQL 文本编辑器”可创建和编辑表用户定义函数,甚至还可使用“查询生成器”在表用户定义函数中以图形方式编辑 SQL SELECT 语句。但是,您无法定义扩展属性。

标量用户定义函数包含一个或多个 SELECT 语句并返回标量值,如intdecimalvarcharsql_variant或“表”数据类型。可在任何使用列名称的查询中使用标量函数。使用“SQL 文本编辑器”可创建和编辑标量用户定义函数,甚至还可使用“查询生成器”在标量用户定义函数中以图形方式编辑 SQL SELECT 语句。但无法定义扩展属性。

参数查询

参数查询的定义

如果打算反复执行同一查询,但不同时间分别使用不同的值,则可使用参数查询。参数是某个值的占位符,这个值在查询运行时键入。例如,如果打算查找同一国家/地区“客户”表中的所有客户,但希望系统每次会提示输入不同的国家/地区,可在“查询设计器”内“设计”网格的“条件”单元格中键入 @Enter_Country,并生成以下 SQL SELECT 语句:

SELECT * FROM Customers?
WHERE Country = @Enter_Country

Enter_Country 参数前的 at 标记 (@) 字符告知 Access 显示“输入参数”对话框,这样可输入国家/地区名(例如“墨西哥”或“丹麦”),然后将其用作 WHERE 子句的值。

使用参数

可以将参数作为文本或数字字面值的占位符使用。通常情况下,参数在单独的行或组(即 SQL 语句的 WHERE 或 HAVING 子句)的搜索条件中作为占位符使用。

也可以使用参数组合指定日期范围。例如,可以在查询的 WHERE 子句中创建两个参数:@Enter_Beginning_Date 和 @Enter_Ending_Date,然后在如下例所示执行查询时,指定雇佣日期的范围。

SELECT * FROM ORDERS
WHERE ShippedDate
BETWEEN @Enter_Beginning_Date AND @Enter_Ending_Date

还可以将参数用作表达式中的占位符。例如,可以通过在每次执行查询时提供不同的折扣值来计算折扣价格。为此,可以在“设计”网格的“列”单元格中输入表达式UnitPrice * @Enter_Discount,从而生成如下列表达式所示的 SQL SELECT 语句:

SELECT ProductName, UnitPrice,
(UnitPrice * @Enter_Discount) AS DiscountPrice
FROM Products

比较已命名和未命名参数

可以指定两种类型的参数,即已命名参数和未命名参数。

已命名参数

已命名参数更便于读取和使用。如果查询中有多个参数,而又想使各个参数的输入内容更为清晰,已命名参数尤其有用。例如若要提示输入并搜索作者表中作者的名和姓,可创建以下 SQL SELECT 语句:

SELECT au_id
FROM authors
WHERE au_fname = @Enter_First_Name AND au_lname = @Enter_Last_Name

运行参数查询时,Access 将使用“输入参数”对话框中的参数名对每个参数提示一次,这样用户就清楚地知道应输入哪个姓名。

未命名参数

也可以输入问号 (?) 字符作为未命名参数。

例如,如果打算利用存储过程、嵌入式用户定义函数或 SQL 语句中的一个声明来检索窗体或报表记录源中的所有作者,可在“查询设计器”内“设计”网格的“条件”单元格中键入问号 (?) 字符,从而生成以下 SQL SELECT 语句:

SELECT au_lname, au_fname
FROM state
WHERE state = @Param1

这种情况下,Access 将自动赋予未命名参数生成的名称 @Param1。

注释对于窗体或报表记录源中的 SQL 语句,Access 将不提供生成的名称。

何时能或不能使用已命名参数

下列情况下可使用已命名参数:

在“查询生成器”中创建的记录源 SQL 语句中,不能使用已命名参数。

在视图中不能使用已命名或未命名参数。

操作查询

可以在“查询设计器”的“图表”和“网格”窗格(图形窗格)中创建以下类型的操作查询:

SQL SELECT 语句

可以将 SQL 语句用作窗体或报表的记录源,或者用作窗体上列表框或组合框的行来源。您可能通过该操作来防止在数据库窗口中显示查询。通过使用字段右侧的“生成”按钮来创建 SQL SELECT 语句,然后在“查询生成器”中以图形方式设计 SQL SELECT 语句,也可以通过在任意的文本编辑器中编辑自己的 SQL SELECT 语句,然后将其复制并粘贴到“记录源”属性字段中来实现。

上页:Access 2003完整教程:关于“查询设计器”中的汇总和分组行为 (ADP) 下页:Access 2003完整教程:关于“表设计器” (ADP)

Access 2003完整教程:关于不同的查询类型 (ADP)

Access 2003完整教程:关于“表设计器” (ADP)Access 2003完整教程:关于表关系 (ADP)
Access 2003完整教程:关于表 (ADP)Access 2003完整教程:联接的类型 (ADP)
Access 2003完整教程:关于使用具有国际化数据的“查询设计器” (ADP)Access 2003完整教程:使用通配符示例 (ADP)
Access 2003完整教程:关于多用户环境 (ADP)Access 2003完整教程:关于触发器 (ADP)
Access 2003完整教程:向所选列添加公式将会删除该列参与的所有索引和关系。Access 2003完整教程:向所选列添加公式将会删除该列作为外键参与的所有关系。
Access 2003完整教程:数据库中已经存在有同名的数据库图表。Access 2003完整教程:不能将表达式用作参数值。
Access 2003完整教程:在您处理该数据库图表时,其他用户也对其做了修改。Access 2003完整教程:索引视图中不能使用星号 (*)。
Access 2003完整教程:将该列改为所选数据类型将会删除其索引。Access 2003完整教程:将列更改为选定的数据类型会删除其索引和所有参与的关系。
Access 2003完整教程:将该列改为所选数据类型将会删除关系。Access 2003完整教程:更改此别名会导致输出列同名。
Access 2003完整教程:索引视图中可能无法使用 Collate 子句。Access 2003完整教程:列“<0s>”是计算列,不能作为外键。
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号