1、Access 开发人员参考SELECT 语句 (Microsoft Access SQL)指示 Microsoft Access 数据库引擎将数据库中的信息作为一组记录返回。语法SELECT predicate * | table.* | table.field1 AS alias1 , table.field2 AS alias2 , . FROM tableexpression , . IN externaldatabase WHERE. GROUP BY. HAVING. ORDER BY. WITH OWNERACCESS OPTIONSELECT 语句包含以下部分:部分 说明pred
2、icate下列谓词之一: ALL、DISTINCT 、DISTINCTROW 或 TOP。可以使用谓词来限定返回记录的数量。如果没有指定谓词,则默认值为 ALL。* 指定选择指定表中的所有字段。table 表的名称,该表包含从中选择记录的字段。field1、field2字段名,这些字段包含了要检索的数据。如果包括多个字段,将按它们的排列顺序对其进行检索。alias1 和 alias2 用作列标题的名称,不是 table 中的原始列名。tableexpression 表名称,其中包含要检索的数据。externaldatabase 如果 tableexpression 中的表不在当前数据库中,则使
3、用该参数指定该数据库名。说明若要执行此项操作,Microsoft Jet 数据库引擎会搜索指定的表,并提取选定的列,再选择符合条件的行,然后按指定的顺序对得到的行进行排序或分组。SELECT 语句不会更改数据库中的数据。SELECT 通常是 SQL 语句中的第一个词。大多数 SQL 语句都是 SELECT 或 SELECT.INTO 语句。SELECT 语句最简化的语法为:SELECT fields FROM table可以通过星号 (*) 来选择表中所有的字段。以下的示例选择在 Employees 表中的所有字段:SELECT * FROM Employees;如果一个字段名包括于 FROM
4、 子句内的多个表中,请在该字段前面加上表名和 .(圆点)号。在下面的示例中,Department 字段同时存在于 Employees 表和 Supervisors 表中。SQL 语句从 Employees 表中选择出部门并从 Supervisors 表中选择出主管名:SELECT Employees.Department, Supervisors.SupvNameFROM Employees INNER JOIN SupervisorsWHERE Employees.Department = Supervisors.Department;创建 Recordset 对象时,Microsoft J
5、et 数据库引擎将使用表的字段名作为 Recordset 对象中的 Field 对象名。如果需要其他字段名或者名称不适合用来生成该字段的表达式,请使用 AS 保留字。以下示例使用标题 Birth 来命名生成的 Recordset 对象中的返回 Field 对象:SELECT BirthDateAS Birth FROM Employees;只要使用的聚合函数或查询返回的是不明确的或重复的 Field 对象名称,就必须使用 AS 子句为该 Field 对象另外提供一个替代名称。以下示例使用标题 HeadCount 来命名生成的 Recordset 对象中的返回 Field 对象:SELECT C
6、OUNT(EmployeeID)AS HeadCount FROM Employees;可以在 SELECT 语句中使用其他子句进一步约束和组织所返回的数据。有关详细信息,请参阅相应子句的帮助主题。示例下面的一些示例假定 Employees 表中存在一个假想的 Salary 字段。请注意,该字段实际并不存在于罗斯文数据库的 Employees 表中。 本例基于 SQL 语句创建一个动态集类型的 Recordset,该语句选择 Employees 表中所有记录的 LastName 和 FirstName 字段。它调用 EnumFields 过程,该过程将 Recordset 对象的内容显示到调试
7、窗口。 Sub SelectX1()Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Select the last name and first name values of all records in the Employees table.Set rst = dbs.OpenRecordset(“SELECT LastName, “ _“) Popu
8、late the recordset.rst.MoveLast Call EnumFields to print the contents of the Recordset.EnumFields rst,12dbs.CloseEnd Sub以下示例计算 PostalCode 字段中有条目的记录数,并将返回的字段命名为 Tally。Sub SelectX2()Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your computer.Set dbs = OpenD
9、atabase(“Northwind.mdb“) Count the number of records with a PostalCode value and return the total in the Tally field.Set rst = dbs.OpenRecordset(“SELECT Count “ _“) Populate the Recordset.rst.MoveLast Call EnumFields to print the contents of the Recordset. Specify field width = 12.EnumFields rst, 12
10、dbs.CloseEnd Sub以下示例显示雇员数以及平均薪水和最高薪水。 Sub SelectX3()Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Count the number of employees, calculate the average salary, and return the highest salary.Set rst = db
11、s.OpenRecordset(“SELECT Count (*) “ _“) Populate the Recordset.rst.MoveLast Call EnumFields to print the contents of the Recordset. Pass the Recordset object and desired field width.EnumFields rst, 17dbs.CloseEnd Sub调用过程向 Sub 过程 EnumFields 传递了一个 Recordset 对象。然后该过程设置 Recordset 的字段的格式并将这些字段显示到调试窗口。 in
12、tFldLen变量是需要的显示字段宽度。有些字段可能会被截断。 Sub EnumFields(rst As Recordset, intFldLen As Integer)Dim lngRecords As Long, lngFields As LongDim lngRecCount As Long, lngFldCount As LongDim strTitle As String, strTemp As String Set the lngRecords variable to the number of records in the Recordset.lngRecords = rst.
13、RecordCount Set the lngFields variable to the number of fields in the Recordset.lngFields = rst.Fields.CountDebug.Print “There are “ print the record number and field values.rst.MoveFirstFor lngRecCount = 0 To lngRecords - 1Debug.Print Right(Space(6) For lngFldCount = 0 To lngFields - 1 Check for Nu
14、ll values.If IsNull(rst.Fields(lngFldCount) ThenstrTemp = “Else Set strTemp to the field contents. Select Case _rst.Fields(lngFldCount).TypeCase 11strTemp = “Case dbText, dbMemostrTemp = _rst.Fields(lngFldCount)Case ElsestrTemp = _str(rst.Fields(lngFldCount)End SelectEnd IfDebug.Print Left(strTemp _
15、 Next lngFldCountDebug.Printrst.MoveNextNext lngRecCountEnd SubAccess 开发人员参考SELECT.INTO 语句 (Microsoft Access SQL)创建生成表查询。语法SELECT field1, field2, . INTO newtable IN externaldatabase FROM sourceSELECT.INTO 语句包含以下部分:部分 说明field1、field2 要复制到新表中的字段的名称。newtable要创建的表的名称。它必须符合标准命名约定。如果 newtable 和现有表同名,会发生一个
16、可捕捉的错误。externaldatabase 外部数据库的路径。有关路径的说明,请参阅 IN 子句。source 从中选择记录的现有表的名称。它可以是单个或多个表或查询。说明可以通过生成表查询来存档记录,或制作表的备份副本,或者将副本导出到其他数据库,或作为某个特定时间段的数据的报表产生基础。例如,可以通过每个月运行相同的生成表查询来生成一个月销售区域报表。注释您可能希望定义新表的主键。创建表时,新表中的字段会继承查询的基表中每个字段的数据类型和字段大小,但不会传输其他字段或表属性。 若要将数据添加到现有表中,请使用 INSERT INTO 语句,而不用创建追加查询。 若要在运行生成表查询之
17、前查找出将要选择哪些记录,请先检查使用相同选择条件的 SELECT 语句的结果。 示例以下示例选择 Employees 表中的所有记录,并将它们复制到名为 Emp Backup 的新表中。 Sub SelectIntoX()Dim dbs As DatabaseDim qdf As QueryDef Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Select all records in the Employees table
18、and copy them into a new table, Emp Backup.dbs.Execute “SELECT Employees.* INTO “ _“ Delete the table because this is a demonstration.dbs.Execute “DROP TABLE Emp Backup;“dbs.CloseEnd SubAccess 开发人员参考INSERT INTO 语句 (Microsoft Access SQL)将一个或多个记录添加到表中。该语句称为追加查询。语法多记录追加查询:INSERT INTO target (field1, fi
19、eld2, .) IN externaldatabase SELECT source.field1, field2, . FROM tableexpression单记录追加查询:INSERT INTO target (field1, field2, .) VALUES (value1, value2, .)INSERT INTO 语句包含以下部分:部分 说明target 要追加记录的表或查询的名称。field1、field2向其中追加数据的字段的名称(如果在 target 参数之后),或获取其中数据的字段的名称(如果在 source 参数之后)。externaldatabase 外部数据库的路
20、径。有关路径的说明,请参阅 IN 子句。source 要复制其中记录的表或查询的名称。tableexpression作为插入记录来源的表的名称。该参数可以是单个表名或者是从 INNER JOIN、 LEFT JOIN 或 RIGHT JOIN 操作或保存的查询产生的组合结果。value1、value2要插入新记录特定字段中的值。每个值将插入到与该值在列表中的位置相对应的字段内:value1 将插入到新记录的 field1 字段,value2 插入到 field2 字段等等。这些值必须用逗号分隔,并且用引号 ( ) 引起来。说明通过如上所述的单记录追加查询语法,可以使用 INSERT INTO
21、语句向表中追加单个记录。在这种情形下,代码要指定每个记录字段的名称和值。必须指定每一个将被赋值的记录字段,并且要给出该字段的值。如果没有指定每个字段的值,则在缺少值的列中插入默认值或 Null 值。记录将追加到表的末尾。通过如上所示的多字段追加查询语法的 SELECT . FROM 子句,还可以使用 INSERT INTO 追加一组来自其他表或查询的记录。这种情形下,SELECT 子句指定将要追加到指定的 target 表中的字段。source 或 target 表可以指定表或查询。如果指定了查询,Microsoft Access 数据库引擎会将记录追加到查询指定的任何表或所有表中。INSER
22、T INTO 是可选的,但是如果包括它,应将它置于 SELECT 语句前面。如果目标表中包含主键,请确保追加到主键字段中的值是唯一的、非 Null 的;否则,Microsoft Access 数据库引擎不会追加这些记录。如果将一个自动编号字段记录追加到一个表中,并且希望对该追加的记录重新编号,那么不要在查询语句中包含自动编号字段。如果希望保持字段的原始值,请务必在查询语句中包含自动编号字段。通过 IN 子句可以将记录追加到其他数据库的表中。若要新建表,请使用 SELECT. INTO 语句来创建一个生成表查询。若要在运行追加查询之前找出将要追加哪些记录,可以先执行使用同样选择条件的选择查询并查
23、看其结果。追加查询把记录从一个或多个表复制到其他表中。包含所追加的记录的表不会受追加查询影响。如果不想从其他表中追加现有记录,可以通过 VALUES 子句指定每个字段在新的单个记录中的值。如果忽略了字段列表,VALUES 子句必须包括该表中每个字段的值;否则,INSERT 操作将会失败。通过附加的带有 VALUES 子句的 INSERT INTO 语句,可以创建希望得到的每一个新增记录。示例本例选择假想的 New Customers 表中的所有记录并将这些记录添加到 Customers 表。如果未指定各个列,那么 SELECT 中的表列名必须与 INSERT INTO 中的表列名完全匹配。 S
24、ub InsertIntoX1()Dim dbs As Database Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Select all records in the New Customers table and add them to the Customers table.dbs.Execute “ INSERT INTO Customers “ _“dbs.CloseEnd Sub以下示例在 Employees 表中
25、创建一个新记录。 Sub InsertIntoX2()Dim dbs As Database Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Create a new record in the Employees table. The first name is Harry, the last name is Washington, and the job title is Trainee.dbs.Execute “ INSER
26、T INTO Employees “ _“dbs.CloseEnd SubAccess 开发人员参考UPDATE 语句 (Microsoft Access SQL)创建一个更新查询,以便基于特定的条件更改指定表的字段值。语法UPDATE table SET newvalue WHERE criteria;UPDATE 语句包含以下部分:部分 说明table 表名,该表包含要修改的数据。newvalue 表达式,该表达式确定将要插入到已更新记录的特定字段内的值。criteria 表达式,用来确定将更新哪些记录。只有满足该表达式的记录才会被更新。说明当需要更改多个记录或者需要更改的记录存在于多个表
27、中时,UPDATE 语句是最有用的。可以同时更改多个字段。下面的示例把英国货主的订货量的值增加百分之十,并且把运费的值增加百分之三。UPDATE OrdersSET OrderAmount = OrderAmount * 1.1,Freight = Freight * 1.03WHERE ShipCountry = UK;要点 UPDATE 不会生成结果集。而且,使用更新查询来更新记录后,您不能取消该操作。如果希望了解已更新哪些记录,请先检查使用相同条件的选择查询的结果,然后再运行更新查询。 不论什么时候都要维护数据的备份。如果更新了错误记录,您可以从备份副本中检索这些记录。 示例以下示例将当
28、前的 ReportsTo 值为 2 的所有雇员记录的 ReportsTo 字段中的值改为 5。 Sub UpdateX()Dim dbs As DatabaseDim qdf As QueryDef Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Change values in the ReportsTo field to 5 for all employee records that currently have Report
29、sTo values of 2.dbs.Execute “UPDATE Employees “ _“dbs.CloseEnd SubAccess 开发人员参考DELETE 语句 (Microsoft Access SQL)创建一个删除查询,用于从 FROM 子句中列出的一个或多个表中删除满足 WHERE 子句的记录。语法DELETE table.* FROM table WHERE criteriaDELETE 语句包含以下部分:部分 说明table 从中删除记录的表的名称,可选。table 从中删除记录的表的名称。criteria 表达式,用于确定要删除哪些记录。注解希望删除多个记录时,DE
30、LETE 语句特别有用。要从数据库中删除整个表,可以使用带有 DROP 语句的 Execute 方法。但是,如果删除表,表的结构就会丢失;而使用 DELETE 语句时,只会删除表中的数据,表的结构和所有表属性(如字段属性和索引)将保持不变。可以使用 DELETE 从与其他表存在一对多关系的表中删除记录。当查询中删除了关系的某一方中的相应记录时,级联删除操作会删除在关系的多方表中的相应记录。例如,在“客户” 表和“订单” 表的关系中,“客户”表是关系的一方,而“ 订单”表则是关系中的多方。如果指定了级联删除选项,那么从“客户”表中删除一个记录将导致“ 订单”表中相应的记录被删除。删除查询将删除整
31、个记录,而不仅仅删除特定字段中的数据。如果要删除特定字段的值,请创建一个更新查询,将相应字段的值更改为 Null。要点 使用删除查询删除记录后,无法取消该操作。如果要知道删除了哪些记录,先检查使用相同条件的选择查询的结果,然后运行删除查询。 不论什么时候都要维护数据的备份。如果错删了记录,还可以从备份中检索这些记录。 示例本例删除职务为 Trainee 的雇员的所有记录。当 FROM 子句中仅包含一个表时,您不必在 DELETE 语句中列出该表的名称。 Sub DeleteX()Dim dbs As Database, rst As Recordset Modify this line to
32、include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Delete employee records where title is Trainee. dbs.Execute “DELETE * FROM “ _“dbs.CloseEnd SubAccess 开发人员参考EXECUTE 语句 (Microsoft Access SQL)用于启动过程的执行。语法EXECUTE procedure param1, param2, EXECUTE 语句包含以下部分:部分 说明proc
33、edure 要执行的过程的名称。param1, param2, 由过程定义的参数的值。示例以下示例将查询命名为 CategoryList。 以下示例调用 EnumFields 过程,您可以在 SELECT 语句示例中找到该过程。 Sub ProcedureX()Dim dbs As Database, rst As RecordsetDim qdf As QueryDef, strSql As String Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Nor
34、thwind.mdb“)strSql = “PROCEDURE CategoryList; “ _“ Create a named QueryDef based on the SQL statement.Set qdf = dbs.CreateQueryDef(“NewQry“, strSql) Create a temporary snapshot-type Recordset.Set rst = qdf.OpenRecordset(dbOpenSnapshot) Populate the Recordset.rst.MoveLast Call EnumFields to print the
35、 contents of the Recordset. Pass the Recordset object and desired field width.EnumFields rst, 15 Delete the QueryDef because this is a demonstration.dbs.QueryDefs.Delete “NewQry“dbs.CloseEnd SubAccess 开发人员参考TRANSACTION 语句 (Microsoft Access SQL)用于初始化和结束显式事务处理。语法初始化新事务处理。BEGIN TRANSACTION通过提交事务处理期间执行的
36、所有工作来结束事务处理。COMMIT TRANSACTION | WORK通过回滚事务处理期间执行的所有工作来结束事务处理。ROLLBACK TRANSACTION | WORK说明事务处理不会自动启动。若要启动一个事务处理,必须通过 BEGIN TRANSACTION 进行显式调用。事务处理嵌套的最大深度为五级。若要启动一个嵌套事务处理,请在现有的事务处理上下文中使用 BEGIN TRANSACTION。链接表不支持事务处理。Access 开发人员参考TRANSFORM 语句 (Microsoft Access SQL)创建交叉表查询。语法TRANSFORM aggfunction sele
37、ctstatement PIVOT pivotfield IN (value1, value2, .)TRANSFORM 语句包含以下部分:部分 说明aggfunction 对所选数据进行计算的 SQL 聚合函数 。selectstatement SELECT 语句。pivotfield 希望用于创建查询结果集中列标题的字段或表达式。value1、value2 用于创建列标题的固定值。说明使用交叉表查询汇总数据时,将从作为列标题的指定字段或表达式中选择值,以便能够以一种比使用选择查询更紧凑的方式来查看数据。TRANSFORM 是可选的,但如果包括它,则应为 SQL 字符串中的第一个语句。它在指
38、定作为行标题的字段的 SELECT 语句之前,在指定行分组方法的 GROUP BY 子句之前。您也可以包含其他子句(例如。指定其他选择或排序条件的 WHERE)。还可以在交叉表查询中使用子查询作为谓词,特别是在 WHERE 子句中。 pivotfield 中返回的值作为查询结果集中的列标题。例如,在交叉表查询中如果依据月销售量来透视销售数据,将会创建 12 个列。可以约束 pivotfield 以便从可选 IN 子句中所列出的固定值(value1,value2)内选择标题。也可以包含固定值用于没有数据来创建其他列的情况。示例以下示例使用 SQL TRANSFORM 子句创建交叉表查询,以显示每
39、个雇员在 1994 年的每个日历季度完成的订单数。运行此过程需要使用 SQLTRANSFORMOutput 函数。 Sub TransformX1()Dim dbs As DatabaseDim strSQL As StringDim qdfTRANSFORM As QueryDefstrSQL = “PARAMETERS prmYear SHORT; TRANSFORM “ _TRANSFORM “ _booFirst = FalseElseDebug.Print , fldLoop.Name;End IfNext fldLoopDebug.PrintDo While Not .EOFboo
40、First = TrueFor Each fldLoop In .FieldsIf booFirst = True ThenDebug.Print fldLoopDebug.Print , ;booFirst = FalseElseDebug.Print , fldLoop;End IfNext fldLoopDebug.Print.MoveNextLoopEnd WithEnd FunctionAccess 开发人员参考INNER JOIN 操作 (Microsoft Access SQL)只要两个表的公共字段有匹配值,就将这两个表中的记录组合起来。语法FROM table1 INNER J
41、OIN table2 ON table1.field1 compopr table2.field2INNER JOIN 操作包含以下部分:部分 说明table1、table2要组合其中记录的表的名称。field1、field2被联接的字段的名称。如果它们不是数字,则这些字段的数据类型必须相同,并且包含同类数据,但是,它们不必具有相同的名称。compopr 任何关系比较运算符:“=”、“”、“=” 或 “”。说明通过 LEFT JOIN 操作可以创建一个左外部联接。左外部联接包含两个表中第一个(左)表中的所有记录,即使在第二个(右)表中没有匹配的记录值。通过 RIGHT JOIN 操作可以创建一
42、个右外部联接。右外部联接包含两个表中第二个(右)表中的所有记录,即使在第一个(左)表中没有匹配的记录值。例如,可以将 LEFT JOIN 用于 Departments(左)和 Employees(右)表以选择所有部门,包括那些没有被分配雇员的部门。若要选择所有雇员,包括那些没有被分配到任何部门的雇员,可以使用 RIGHT JOIN。下面的示例展示了如何通过 CategoryID 字段联接 Categories 表和 Products 表。该查询将产生一个所有分类的列表,其中包括不包含任何产品的分类:SELECT CategoryName,ProductNameFROM Categories L
43、EFT JOIN ProductsON Categories.CategoryID = Products.CategoryID;在以下示例中,CategoryID 是联接字段,但是它不包括在查询结果中,因为它没有包括在 SELECT 语句中。若要包括联接的字段,请在 SELECT 语句中输入字段名,在本例中为 Categories.CategoryID。 注释若要创建一个只包括在联接字段中具有相同数据的记录,请使用 INNER JOIN 操作。LEFT JOIN 或 RIGHT JOIN 可以嵌套到 INNER JOIN 语句中,但是 INNER JOIN 语句不能嵌套到 LEFT JOIN
44、或 RIGHT JOIN 语句中。请参阅 INNER JOIN 主题中有关嵌套的讨论,以了解如何在其他联接中嵌套联接。 可以链接多个 ON 子句。请参阅 INNER JOIN 主题中有关子句链接的讨论,以了解如何操作。 如果试图联接包含 Memo 或 OLE 对象数据的字段,将产生错误。示例本例假设 Employees 表中存在假想的 Department Name 和 Department ID 字段。请注意,这些字段并不实际存在于 Northwind 数据库的 Employees 表中。 以下示例选择所有部门,包括那些没有雇员的部门。 以下示例调用 EnumFields 过程,您可以在 S
45、ELECT 语句示例中找到该过程。 Sub LeftRightJoinX()Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Select all departments, including those without employees.Set rst = dbs.OpenRecordset _(“SELECT Department Name, “ _“
46、) Populate the Recordset.rst.MoveLast Call EnumFields to print the contents of the Recordset. Pass the Recordset object and desired field width.EnumFields rst, 20dbs.CloseEnd SubAccess 开发人员参考UNION 操作 (Microsoft Access SQL)创建联合查询,该查询将两个或两个以上的独立查询或表的结果组合在一起。语法TABLE query1 UNION ALL TABLE query2 UNION
47、ALL TABLE queryn UNION 操作包含以下部分:部分 说明query1-n 一个 SELECT 语句、存储查询的名称或在 TABLE 关键字后面的存储表的名称。注解可以在单个 UNION 操作中以任何组合方式合并两个或两个以上的查询、表和 SELECT 语句的结果。下面的示例将一个名为 New Accounts 的现有表和一个 SELECT 语句进行合并:TABLE New Accounts UNION ALLSELECT *FROM CustomersWHERE OrderAmount 1000;默认情况下,使用 UNION 操作时不会返回重复的记录;但是,可以包含 ALL
48、谓词以确保返回所有记录。这样也会使查询运行得更快。在 UNION 操作中的所有查询必须请求相同数量的字段;但是,这些字段不必都具有相同的大小或数据类型。请只在第一个 SELECT 语句中使用别名,因为别名在其他语句中会被忽略。在 ORDER BY 子句中,请根据第一个 SELECT 语句中使用的字段名来引用该字段。注释可以在每个 query 参数中使用 GROUP BY 或 HAVING 子句,以便对返回的数据进行分组。可以在最后一个 query 参数的末尾使用 ORDER BY 子句,以便按指定顺序显示返回数据。示例以下示例检索巴西的所有供应商和客户的名称和所在城市。 以下示例调用 Enum
49、Fields 过程,您可以在 SELECT 语句示例中找到该过程。 Sub UnionX()Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your computer.Set dbs = OpenDatabase(“Northwind.mdb“) Retrieve the names and cities of all suppliers and customers in Brazil.Set rst = dbs.OpenRecordset(“SELECT CompanyName,“ _“) Populate the Recordset.rst.MoveLast Call EnumField