第十八章 用SQL管理查询
查询是能够将存储于一个或多个表中符合要求的数据挑选出来,并对挑选的结果按照某种规则进行运算的对象,是ACCESS数据库中的重要数据对象。查询的主要功能有:
(1)以一个表,或多个表,或查询为基础,创建一个新的数据集;
(2)通过创建查询,完成数据的统计分析等操作;
(3)使用参数查询,可以使查询结果更具有动态性,实效性;
(4)利用交叉表查询,可以将数据表中的某个字段进行汇总,并将其分组,从而更便于查看和分析数据;
(5)利用动作查询可以生成表,可以更新、删除数据源表中的数据,也可以为数据源表追加数据;
(6)查询可作为窗体和报表数据的来源,使只能有一个数据源的窗体和报表,实现以多个数据表为数据源成为可能。
可见查询是ACCESS数据库不可或缺的部分,对数据的管理起着至关重要的作用,因而ACCESS数据库管理系统也提供了一系列对查询进行管理的SQL语句。
第一节 用SQL创建查询
在ACCESS中,我们不仅能通过各种图形介面创建与管理查询,也可以直接用SQL语句来实现查询的创建与管理。
一、用SQL创建Select(选择)查询
1、语法
Create VIEW view [(field1[, field2[, ...]])]
AS selectstatement
Create VIEW语句包含以下部分:
部分
|
说明
|
view
|
要创建的视图的名称。
|
field1, field2
|
selectstatement中指定的字段的对应字段的名称。
|
selectstatement
|
SQL Select 语句。
|
2、备注
定义视图的 Select 语句不能为 Select...INTO 语句。
定义视图的 Select 语句不能包含任何参数。
视图名称不能与现有表的名称相同。
如果 Select 语句定义的查询可更新,则视图也可更新。否则视图为只读。
如果 Select 语句定义的查询中有任何两个字段具有相同的名称,则视图定义必须包含一个字段列表,该列表为查询中的每个字段指定唯一名称。
3、示例
在ACCESS中Create VIEW创建的实际上就是一个命名的查询,查询名就代表了一个视图,下面我们通过实例就能看到这一点。
例一:
Create VIEW
vista AS Select 'Hello World';
这条SQL语句实际上是在ACCESS数据库中创建了一外名为“vista”的查询,其内容为“Select 'Hello World' AS 表达式1;”。
例二:
Create VIEW 成绩
AS Select *
FROM 学生成绩;
这个SQL语句创建一个名为“成绩”的选择查询,其内容为“Select
* FROM 学生成绩;”。
二、用SQL创建其它类型的查询
Create VIEW在ACCESS中只能创建选择查询,要创建其它类型的查询就要使用另一个重要的SQL语句“Create PROCEDURE”。
1、语法
Create PROCEDURE procedure (param1 datatype[, param2 datatype][, ...]) AS sqlstatement
Create PROCEDURE语句包含以下部分:
部分
|
说明
|
procedure
|
过程的名称。
|
param1, param2
|
从1到255个字段名或参数。
|
datatype
|
主要Microsoft Access SQL数据类型之一或其同义词。
|
sqlstatement
|
SQL语句,如Select、Update、Delete、Insert、Create TABLE、Drop TABLE等。
|
2、备注
SQL过程包含一个PROCEDURE子句(该子句指定过程的名称)、参数定义的可选列表和单个SQL语句。
过程名称不能与现有表或查询的名称相同。
事实上,ACCESS中所谓“存储过程”,和SQL Server中的Stored Procedure是不能比的。它只能算是“Stored Procedure
Lite”,不支持多条SQL语句,不支持逻辑语句(呵呵,毕竟不是 T-SQL)等等,我也还不清楚它是不是预编译了。不过,ACCESS的“轻量级存储过程”,对于在数据库操作中规范,减少出错机率应该也有帮助,并且性能可能会有提高。
3、示例
在ACCESS中所谓“存储过程”其实就是一个“查询”对象,“查询”,就扮演了存储过程的角色,我们所提到的ACCESS的“存储过程”或者“查询”都是指的同一个东西。
示例一:
Create PROCEDURE 删除指定考生号的记录
(STUNO TEXT)
AS Delete FROM 学生成绩 Where 考生号=STUNO;
这条SQL语句创建了一个名为“删除指定考生号的记录”的参数查询,查询的内容为:PARAMETERS STUNO Text ( 255 );
Delete 学生成绩.[考生号]
FROM 学生成绩
Where (((学生成绩.[考生号])=[STUNO]));
示例二:
Create PROCEDURE 浏览成绩
AS Select *
FROM 学生成绩;
这个例子创建了一个无参数的名为“浏览成绩”的查询,可以浏览整个学生成绩表,其内容为“Select * FROM 学生成绩;”,也可以作为视图代替“学生成绩”表。