《SQL语言在ACCESS数据库中的应用.doc》由会员分享,可在线阅读,更多相关《SQL语言在ACCESS数据库中的应用.doc(68页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
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 语句包含以下部分:部分说明predi
2、cate下列谓词之一: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 Jet 数据库引擎
5、将使用表的字段名作为 Recordset 对象中的 Field 对象名。如果需要其他字段名或者名称不适合用来生成该字段的表达式,请使用 AS 保留字。以下示例使用标题 Birth 来命名生成的 Recordset 对象中的返回 Field 对象:SELECT BirthDateAS Birth FROM Employees;只要使用的聚合函数或查询返回的是不明确的或重复的 Field 对象名称,就必须使用 AS 子句为该 Field 对象另外提供一个替代名称。以下示例使用标题 HeadCount 来命名生成的 Recordset 对象中的返回 Field 对象:SELECT COUNT(Emp
6、loyeeID)AS HeadCount FROM Employees;可以在 SELECT 语句中使用其他子句进一步约束和组织所返回的数据。有关详细信息,请参阅相应子句的帮助主题。示例下面的一些示例假定 Employees 表中存在一个假想的 Salary 字段。请注意,该字段实际并不存在于罗斯文数据库的 Employees 表中。 本例基于 SQL 语句创建一个动态集类型的 Recordset,该语句选择 Employees 表中所有记录的 LastName 和 FirstName 字段。它调用 EnumFields 过程,该过程将 Recordset 对象的内容显示到调试窗口。 Sub
7、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, _ & FirstName FROM
8、 Employees;) Populate the recordset. rst.MoveLast Call EnumFields to print the contents of the Recordset. EnumFields rst,12 dbs.CloseEnd Sub以下示例计算 PostalCode 字段中有条目的记录数,并将返回的字段命名为 Tally。Sub SelectX2() Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your com
9、puter. Set dbs = OpenDatabase(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 _ & (PostalCode) AS Tally FROM Customers;) Populate the Recordset. rst.MoveLast Call EnumFields to print the contents of
10、the Recordset. Specify field width = 12. EnumFields rst, 12 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 th
11、e average salary, and return the highest salary. Set rst = dbs.OpenRecordset(SELECT Count (*) _ & AS TotalEmployees, Avg(Salary) _ & AS AverageSalary, Max(Salary) _ & AS MaximumSalary FROM Employees;) Populate the Recordset. rst.MoveLast Call EnumFields to print the contents of the Recordset. Pass t
12、he Recordset object and desired field width. EnumFields rst, 17 dbs.CloseEnd Sub调用过程向 Sub 过程 EnumFields 传递了一个 Recordset 对象。然后该过程设置 Recordset 的字段的格式并将这些字段显示到调试窗口。 intFldLen变量是需要的显示字段宽度。有些字段可能会被截断。 Sub EnumFields(rst As Recordset, intFldLen As Integer) Dim lngRecords As Long, lngFields As Long Dim lng
13、RecCount As Long, lngFldCount As Long Dim strTitle As String, strTemp As String Set the lngRecords variable to the number of records in the Recordset. lngRecords = rst.RecordCount Set the lngFields variable to the number of fields in the Recordset. lngFields = rst.Fields.Count Debug.Print There are
14、& lngRecords _ & records containing & lngFields _ & fields in the recordset. Debug.Print Form a string to print the column heading. strTitle = Record For lngFldCount = 0 To lngFields - 1 strTitle = strTitle _ & Left(rst.Fields(lngFldCount).Name _ & Space(intFldLen), intFldLen) Next lngFldCount Print
15、 the column heading. Debug.Print strTitle Debug.Print Loop through the Recordset; print the record number and field values. rst.MoveFirst For lngRecCount = 0 To lngRecords - 1 Debug.Print Right(Space(6) & _ Str(lngRecCount), 6) & ; For lngFldCount = 0 To lngFields - 1 Check for Null values. If IsNul
16、l(rst.Fields(lngFldCount) Then strTemp = Else Set strTemp to the field contents. Select Case _ rst.Fields(lngFldCount).Type Case 11 strTemp = Case dbText, dbMemo strTemp = _ rst.Fields(lngFldCount) Case Else strTemp = _ str(rst.Fields(lngFldCount) End Select End If Debug.Print Left(strTemp _ & Space
17、(intFldLen), intFldLen); Next lngFldCount Debug.Print rst.MoveNext Next lngRecCountEnd SubAccess 开发人员参考SELECT.INTO 语句 (Microsoft Access SQL)创建生成表查询。语法SELECT field1, field2, . INTO newtable IN externaldatabase FROM sourceSELECT.INTO 语句包含以下部分:部分说明field1、field2要复制到新表中的字段的名称。newtable要创建的表的名称。它必须符合标准命名约定
18、。如果 newtable 和现有表同名,会发生一个可捕捉的错误。externaldatabase外部数据库的路径。有关路径的说明,请参阅 IN 子句。source从中选择记录的现有表的名称。它可以是单个或多个表或查询。说明可以通过生成表查询来存档记录,或制作表的备份副本,或者将副本导出到其他数据库,或作为某个特定时间段的数据的报表产生基础。例如,可以通过每个月运行相同的生成表查询来生成一个月销售区域报表。注释 您可能希望定义新表的主键。创建表时,新表中的字段会继承查询的基表中每个字段的数据类型和字段大小,但不会传输其他字段或表属性。 若要将数据添加到现有表中,请使用 INSERT INTO 语
19、句,而不用创建追加查询。 若要在运行生成表查询之前查找出将要选择哪些记录,请先检查使用相同选择条件的 SELECT 语句的结果。 示例以下示例选择 Employees 表中的所有记录,并将它们复制到名为 Emp Backup 的新表中。 Sub SelectIntoX() Dim dbs As Database Dim qdf As QueryDef Modify this line to include the path to Northwind on your computer. Set dbs = OpenDatabase(Northwind.mdb) Select all record
20、s in the Employees table and copy them into a new table, Emp Backup. dbs.Execute SELECT Employees.* INTO _ & Emp Backup FROM Employees; Delete the table because this is a demonstration. dbs.Execute DROP TABLE Emp Backup; dbs.CloseEnd SubAccess 开发人员参考INSERT INTO 语句 (Microsoft Access SQL)将一个或多个记录添加到表中
21、。该语句称为追加查询。语法多记录追加查询:INSERT INTO target (field1, field2, .) IN externaldatabase SELECT source.field1, field2, . FROM tableexpression单记录追加查询:INSERT INTO target (field1, field2, .) VALUES (value1, value2, .)INSERT INTO 语句包含以下部分:部分说明target要追加记录的表或查询的名称。field1、field2向其中追加数据的字段的名称(如果在 target 参数之后),或获取其中数
22、据的字段的名称(如果在 source 参数之后)。externaldatabase外部数据库的路径。有关路径的说明,请参阅 IN 子句。source要复制其中记录的表或查询的名称。tableexpression作为插入记录来源的表的名称。该参数可以是单个表名或者是从 INNER JOIN、LEFT JOIN 或 RIGHT JOIN 操作或保存的查询产生的组合结果。value1、value2要插入新记录特定字段中的值。每个值将插入到与该值在列表中的位置相对应的字段内:value1 将插入到新记录的 field1 字段,value2 插入到 field2 字段等等。这些值必须用逗号分隔,并且用引
23、号 () 引起来。说明通过如上所述的单记录追加查询语法,可以使用 INSERT INTO 语句向表中追加单个记录。在这种情形下,代码要指定每个记录字段的名称和值。必须指定每一个将被赋值的记录字段,并且要给出该字段的值。如果没有指定每个字段的值,则在缺少值的列中插入默认值或 Null 值。记录将追加到表的末尾。通过如上所示的多字段追加查询语法的 SELECT . FROM 子句,还可以使用 INSERT INTO 追加一组来自其他表或查询的记录。这种情形下,SELECT 子句指定将要追加到指定的 target 表中的字段。source 或 target 表可以指定表或查询。如果指定了查询,Mic
24、rosoft Access 数据库引擎会将记录追加到查询指定的任何表或所有表中。INSERT INTO 是可选的,但是如果包括它,应将它置于 SELECT 语句前面。如果目标表中包含主键,请确保追加到主键字段中的值是唯一的、非 Null 的;否则,Microsoft Access 数据库引擎不会追加这些记录。如果将一个自动编号字段记录追加到一个表中,并且希望对该追加的记录重新编号,那么不要在查询语句中包含自动编号字段。如果希望保持字段的原始值,请务必在查询语句中包含自动编号字段。通过 IN 子句可以将记录追加到其他数据库的表中。若要新建表,请使用 SELECT. INTO 语句来创建一个生成表
25、查询。若要在运行追加查询之前找出将要追加哪些记录,可以先执行使用同样选择条件的选择查询并查看其结果。追加查询把记录从一个或多个表复制到其他表中。包含所追加的记录的表不会受追加查询影响。如果不想从其他表中追加现有记录,可以通过 VALUES 子句指定每个字段在新的单个记录中的值。如果忽略了字段列表,VALUES 子句必须包括该表中每个字段的值;否则,INSERT 操作将会失败。通过附加的带有 VALUES 子句的 INSERT INTO 语句,可以创建希望得到的每一个新增记录。示例本例选择假想的 New Customers 表中的所有记录并将这些记录添加到 Customers 表。如果未指定各个
26、列,那么 SELECT 中的表列名必须与 INSERT INTO 中的表列名完全匹配。 Sub 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 Cust
27、omers _ & SELECT * _ & FROM New Customers; dbs.CloseEnd Sub以下示例在 Employees 表中创建一个新记录。 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,
28、the last name is Washington, and the job title is Trainee. dbs.Execute INSERT INTO Employees _ & (FirstName,LastName, Title) VALUES _ & (Harry, Washington, Trainee); dbs.CloseEnd SubAccess 开发人员参考UPDATE 语句 (Microsoft Access SQL)创建一个更新查询,以便基于特定的条件更改指定表的字段值。语法UPDATE table SET newvalue WHERE criteria;UP
29、DATE 语句包含以下部分:部分说明table表名,该表包含要修改的数据。newvalue表达式,该表达式确定将要插入到已更新记录的特定字段内的值。criteria表达式,用来确定将更新哪些记录。只有满足该表达式的记录才会被更新。说明当需要更改多个记录或者需要更改的记录存在于多个表中时,UPDATE 语句是最有用的。可以同时更改多个字段。下面的示例把英国货主的订货量的值增加百分之十,并且把运费的值增加百分之三。UPDATE OrdersSET OrderAmount = OrderAmount * 1.1,Freight = Freight * 1.03WHERE ShipCountry =
30、UK;要点 UPDATE 不会生成结果集。而且,使用更新查询来更新记录后,您不能取消该操作。如果希望了解已更新哪些记录,请先检查使用相同条件的选择查询的结果,然后再运行更新查询。 不论什么时候都要维护数据的备份。如果更新了错误记录,您可以从备份副本中检索这些记录。 示例以下示例将当前的 ReportsTo 值为 2 的所有雇员记录的 ReportsTo 字段中的值改为 5。 Sub UpdateX() Dim dbs As Database Dim qdf As QueryDef Modify this line to include the path to Northwind on your
31、 computer. Set dbs = OpenDatabase(Northwind.mdb) Change values in the ReportsTo field to 5 for all employee records that currently have ReportsTo values of 2. dbs.Execute UPDATE Employees _ & SET ReportsTo = 5 _ & WHERE ReportsTo = 2; dbs.CloseEnd SubAccess 开发人员参考DELETE 语句 (Microsoft Access SQL)创建一个
32、删除查询,用于从 FROM 子句中列出的一个或多个表中删除满足 WHERE 子句的记录。语法DELETE table.* FROM table WHERE criteriaDELETE 语句包含以下部分:部分说明table从中删除记录的表的名称,可选。table从中删除记录的表的名称。criteria表达式,用于确定要删除哪些记录。注解希望删除多个记录时,DELETE 语句特别有用。要从数据库中删除整个表,可以使用带有 DROP 语句的 Execute 方法。但是,如果删除表,表的结构就会丢失;而使用 DELETE 语句时,只会删除表中的数据,表的结构和所有表属性(如字段属性和索引)将保持不变
33、。可以使用 DELETE 从与其他表存在一对多关系的表中删除记录。当查询中删除了关系的某一方中的相应记录时,级联删除操作会删除在关系的多方表中的相应记录。例如,在“客户”表和“订单”表的关系中,“客户”表是关系的一方,而“订单”表则是关系中的多方。如果指定了级联删除选项,那么从“客户”表中删除一个记录将导致“订单”表中相应的记录被删除。删除查询将删除整个记录,而不仅仅删除特定字段中的数据。如果要删除特定字段的值,请创建一个更新查询,将相应字段的值更改为 Null。要点 使用删除查询删除记录后,无法取消该操作。如果要知道删除了哪些记录,先检查使用相同条件的选择查询的结果,然后运行删除查询。 不论
34、什么时候都要维护数据的备份。如果错删了记录,还可以从备份中检索这些记录。 示例本例删除职务为 Trainee 的雇员的所有记录。当 FROM 子句中仅包含一个表时,您不必在 DELETE 语句中列出该表的名称。 Sub DeleteX() Dim dbs As Database, rst As Recordset Modify this line to include the path to Northwind on your computer. Set dbs = OpenDatabase(Northwind.mdb) Delete employee records where title
35、is Trainee. dbs.Execute DELETE * FROM _ & Employees WHERE Title = Trainee; dbs.CloseEnd SubAccess 开发人员参考EXECUTE 语句 (Microsoft Access SQL)用于启动过程的执行。语法EXECUTE procedure param1, param2, EXECUTE 语句包含以下部分:部分说明procedure要执行的过程的名称。param1, param2, 由过程定义的参数的值。示例以下示例将查询命名为 CategoryList。 以下示例调用 EnumFields 过程,您可
36、以在 SELECT 语句示例中找到该过程。 Sub ProcedureX() Dim dbs As Database, rst As Recordset Dim qdf As QueryDef, strSql As String Modify this line to include the path to Northwind on your computer. Set dbs = OpenDatabase(Northwind.mdb) strSql = PROCEDURE CategoryList; _ & SELECT DISTINCTROW CategoryName, _ & Categ
37、oryID FROM Categories _ & ORDER BY CategoryName; 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
38、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通过提交事务处理期间执行的
39、所有工作来结束事务处理。COMMIT TRANSACTION | WORK通过回滚事务处理期间执行的所有工作来结束事务处理。ROLLBACK TRANSACTION | WORK说明事务处理不会自动启动。若要启动一个事务处理,必须通过 BEGIN TRANSACTION 进行显式调用。事务处理嵌套的最大深度为五级。若要启动一个嵌套事务处理,请在现有的事务处理上下文中使用 BEGIN TRANSACTION。链接表不支持事务处理。Access 开发人员参考TRANSFORM 语句 (Microsoft Access SQL)创建交叉表查询。语法TRANSFORM aggfunction sele
40、ctstatement PIVOT pivotfield IN (value1, value2, .)TRANSFORM 语句包含以下部分:部分说明aggfunction对所选数据进行计算的 SQL 聚合函数。selectstatementSELECT 语句。pivotfield希望用于创建查询结果集中列标题的字段或表达式。value1、value2用于创建列标题的固定值。说明使用交叉表查询汇总数据时,将从作为列标题的指定字段或表达式中选择值,以便能够以一种比使用选择查询更紧凑的方式来查看数据。TRANSFORM 是可选的,但如果包括它,则应为 SQL 字符串中的第一个语句。它在指定作为行标题
41、的字段的 SELECT 语句之前,在指定行分组方法的 GROUP BY 子句之前。您也可以包含其他子句(例如。指定其他选择或排序条件的 WHERE)。还可以在交叉表查询中使用子查询作为谓词,特别是在 WHERE 子句中。pivotfield 中返回的值作为查询结果集中的列标题。例如,在交叉表查询中如果依据月销售量来透视销售数据,将会创建 12 个列。可以约束 pivotfield 以便从可选 IN 子句中所列出的固定值(value1,value2)内选择标题。也可以包含固定值用于没有数据来创建其他列的情况。示例以下示例使用 SQL TRANSFORM 子句创建交叉表查询,以显示每个雇员在 1994 年的每个日历季度完成的订单数。运行此过程需要使用 SQLTRANSFORMOutput 函数。 Sub TransformX1() Dim dbs As Database Dim strSQL As String Dim qdfTRANSFORM As QueryDef strSQL = PARAMETERS prmYear SHORT; TRANSFORM _ & Count(OrderID) _