12.1 课前导读
12.2 课堂教学
12.3 上机练习
12.4 课后作业第 12课 SQL简介
12.1 课前导读
SQL是 Structured Query Language的缩写,即结构化查询语言 。 它是关系数据库的标准语言,来源于
70 年代 IBM 的 一 个 被 称 为 SEQUEL ( Structured
English Query Language) 的研究项目 。 80年代,
SQL由 ANSI进行了标准化,它包含了定义和操作数据的指令 。 由于它具有功能丰富,使用方式灵活,语言简洁易学等突出特点,在计算机界深受广大用户欢迎,
许多数据库生产厂家都相继推出各自支持的 SQL标准 。
1989年 4月,ISO提出了具有完整性特征的 SQL,并将其定为国际标准,推荐它为标准关系数据库语言 。
1990年,我国也颁布了,信息处理系统数据库语言
SQL》,将其定为中国国家标准 。
一般说来,SQL语言具有如下特点:
① 一体化语言:用 SQL可以实现数据库生命周期中的全部活动,包括简单地定义数据库和表的结构,
实现表中数据的录入,修改,删除及查询,维护,数据库重构,数据库安全性控制等一系列操作要求 。
② 高度非过程化,SQL和其他数据操作语言不同,
SQL是一种非过程性语言,它不必一步步地告诉计算机
,如何,去做,用户只需说明做什么操作,而不用说明怎样做,不必了解数据存储的格式及 SQL命令的内部,
就可以方便地对关系数据库进行操作 。
③ 语言简洁:虽然 SQL的功能很强大,但语法却很简单,只有为数不多的几条命令,表 12-1给出了分类的命令动词 。 从上表可知,它的词汇很少,初学者经过短期的学习就可以使用 SQL进行数据库的存取等操作,因此,易学易用是它的最大特点 。
表 12-1 SQL命令动词
SQL功能 命令动词数据查询 SELECT
数据定义 CREATE,DROP,ALTER
数据操纵 INSERT,UPDATE,DELETE
数据控制 GRANT,REVOKE
12.2 课堂教学
12.2.1 SQL语句的执行
12.2.2 查询功能
12.2.3 操作功能
12.2.4 使用 Command对象改善查询
12.2.1 SQL语句的执行
1,在记录集对象的 Open方法中使用 SQL
2,在连接对象的 Execute方法中使用 SQL
3,在命令对象的 Execute方法中使用 SQL
12.2.1 SQL语句的执行
SQL语句可以在记录集对象 RecordSet的 Open方法中作为参数被执行,也可以作为链接对象 Connection
和命令对象 Command的 Execute方法中作为参数被执行 。
1,在记录集对象的 Open方法中使用 SQL
下述代码创建 Recordset对象实例,读取数据表中符合 SQL语句的记录存放在 Recordset对象中并打开
Recordset对象:
' 创建 Connection对象并打开连接
set conn=server.createobject("adodb.Connection")
CS="Provider=Microsoft.jet.OLEDB.4.0;Data Source="
conn.ConnectionString=CS & Server.MapPath("rsgl.mdb")
conn.Open
' 创建 Recordset对象
Set oRS = Server.CreateObject("ADODB.Recordset")
' 定义 SQL查询
sSQL = "SELECT * FROM 职工工资 "
' 打开 Recordset对象
oRS.Open sSQL,objConn,1,1,1
2,在连接对象的 Execute方法中使用 SQL
下述代码使用 Connection对象的 Execute方法执行 SQL语句,并返回一个符合 SQL语句的 Recordset对象实例并打开 Recordset对象:
' 创建 Connection对象并打开连接
set conn=server.createobject("adodb.Connection")
CS="Provider=Microsoft.jet.OLEDB.4.0;Data Source="
conn.ConnectionString=CS & Server.MapPath("rsgl.mdb")
conn.Open
' 定义 SQL查询
sSQL = "SELECT * FROM 职工工资 WHERE 实发工资 BETWEEN 800 AND
880"
' 返回并打开 Recordset对象
set rs=conn.Execute(sSQL)
3,在命令对象的 Execute方法中使用 SQL
' 创建 Connection对象并打开连接,
' 注意,Command对象没有可以用来建立连接的 Open方法 。
set conn=server.createobject("adodb.Connection")
CS="Provider=Microsoft.jet.OLEDB.4.0;Data Source="
conn.ConnectionString=CS & Server.MapPath("rsgl.mdb")
conn.Open
‘ 创建 Command对象,使用 ActiveConnection属性
‘ 向 Command对象附加连接 。
Set cmn= Server.CreateObject("ADODB.Command")
Set cmn.ActiveConnection = conn
' 定义 SQL查询
sSQL = "SELECT * FROM 职工工资 WHERE 实发工资 BETWEEN 800 AND
880"
' 设置 Command对象的查询串
cmn.CommandText = sSQL
' 返回并打开 Recordset对象
set rs=cmn.Execute(,,1)
12.2.2 查询功能数据库中最常见的操作是数据查询,也是 SQL的核心 。
SQL给出了简单而又丰富的查询语句形式,SQL的查询命 令也称 作 SELECT命令,它的基 本形 式由
SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行 。 SELECT-SQL的语法格式如下:
SELECT [ALL | DISTINCT] [TOP〈 表达式 〉 ]
〈 Select表达式 〉 [AS〈 列名 〉 ][,〈 Select表达式 〉 [AS〈 列名 〉 ],..]
FROM 〈 表名 〉
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER]
JOIN 〈 表名 〉 [ON〈 联接条件 〉 ]]
[WHERE〈 联接条件 1〉 [AND〈 联接条件 2〉,..][AND | OR〈 筛选条件 〉,..]]
[GROUP BY〈 组表达式 〉 [,〈 组表达式 〉,..]]
[HAVING〈 筛选条件 〉 ]
[UNION [ALL]〈 SELECT命令 〉 ]
[ORDER BY〈 关键字表达式 〉 [ASC | DESC] [,〈 关键字表达式 〉
[ASC | DESC],..]]
说明,SELECT-SQL命令的格式包括三个基本子句:
SELECT子句,FROM子句,WHERE子句,还包括操作子句,ORDER子句,GROUP子句,UNION子句以及其他一些选项 。
1,SELECT子句
SELECT子句用来指定查询结果中的数据 。 其中:
选项 ALL表示选出的记录中包括重复记录,这是缺省值; DISTINCT则表示选出的记录中不包括重复记录 。
选项 TOP〈 表达式 〉 表示在符合条件的记录中选取指定数量或百分比 ( 〈 表达式 〉 ) 的记录 。
选项 〈 Select表达式 〉 [AS〈 列名 〉 ] 中的 Select
表达式可以是字段名或字段表达式,列名用于指定输出时使用的列标题,可以不同于字段名 。
〈 Select表达式 〉 用一个 *号来表示时,指定所有的字段 。
2,FROM子句用于指定查询的表与联接类型 。 其中:
JOIN关键字用于联接其左右两个 〈 表名 〉 所指定的表 。
INNER | LEFT[OUTER] | RIGHT[OUTER] |
FULL[OUTER]选项指定两表联接时的联接类型,联接类型有 4种,如表 12-2所示 。 其中的 OUTER选项表示外部联接,即允许满足联接条件的记录,又允许不满足联接条件的记录 。 若省略 OUTER选项,效果不变 。
表 12-2 联接类型联接类型 意义
Inner Join(内部联接) 只有满足联接条件的记录包含在结果中
Left Outer Join (左联接 )
左表某记录与右表所有记录比较字段值,若有满足联接条件的,则产生一个真实值记录;若都有满足,则产生一个含,NULL值的记录。直至右表所有记录都比较完。
Right Outer Join(右联接)
右表某记录与左表所有记录比较字段值,若有满足联接条件的,则产生一个真实值记录,若都不满足,则产生一个含,NULL值的记录。直至右表所有记录都比较完。
Full Join (完全联接 ) 先按右联接比较字段值,再按左联接比较字段值。不列入重复记录。
ON选项用于指定联接条件 。 FORCE选项表示严格按指定的联接条件来联接表,避免因进行联接优化而降低查询速度 。
3,WHERE子句用来指定查询的条件 。 其中的 〈 联接条件 〉 指定一个字段,该字段连接 FROM子句中的表 。 如果查询中包含不止一个表,就应该为第 1个表后的每一个表指定连接条件 。
4,其它子句和选项其它子句和选项有:
① GROUP BY子句:对记录按 〈 组表达式 〉 值分组,常用于分组统计 。
② HAVING子句,当含 有 GROUP BY子句 时,
HAVING子句可用作记录查询的限制条件;无 GROUP BY
子句时 HAVING子句的作用如同 WHERE子句 。
③ UNION子句:可以用 UNION子句嵌入另一个
SELECT-SQL命令,使这两个命令的查询结果合并输出,
但输出字段的类型和宽度必须一致 。 UNION子句默认组合结果中排除重复行,使用 ALL则允许包含重复行 。
④ ORDER BY子句:指定查询结果中记录按 〈 关键字表达式 〉 排序,默认升序 。 选项 ASC表示升序,
DESE表示降序 。
SELECT查询命令的使用非常灵活,用它可以构造各种各样的查询 。 本课将通过大量的实例来介绍
SELECT命令的使用 。
5,在 ADO中使用 SQL查询功能
(1) 简单查询简单查询只含有基本子句,包括简单的查询条件 。
【 例 12-1】 使用 SQL语句列出职工工资表中所有部门的名称 。
程序代码,运行结果 。
一般来说结果中有重复值,如果要去掉重复值只需指定 SQL语句中的 DISTINCT短语:
SELECT DISTINCT 部门 FROM 职工工资代码 执行结果 。
说明:
① 使用下述 SQL语句可以检索实发工资大于 1000
的职工姓名 ( 显示结果 ),
SELECT 姓名 as 多于 1000者 FROM 职工工资 WHERE 实发工资 > 1000
② 使用下述 SQL语句可以查询哪些部门至少有一人实发工资大于 1000( 显示结果 ),
SELECT DISTINCT 部门 FROM 职工工资 WHERE 实发工资 > 1000
(2) 几个特殊运算符在 SQL语句中,WHERE子句后面的联接条件除了可以使用 VBScript语言中的关系表达式以及逻辑表达式外,还使用几个特殊运算符:
① [NOT] IN:意思是 [不 ]在? 之中;
② [NOT] BETWEEN? AND?,意思是 [不 ]在? 之间;
③ [NOT] LIKE:意思是 [不 ]与? 匹配 。
下面我们以几个实例来说明 。
【 例 12-2】 使用下述 SQL语句可以检索,职工工资,
表中,财务,部门所有姓李的职工信息 ( 显示结果 ) 。
sSQL =,SELECT * FROM 职工工资
WHERE 部门 = " & "'财务 ' and 姓名 Like " & "'李 %'"
这是一个字符串匹配的查询,LIKE运算符专门对字符型数据进行字符串比较 。
说明:
① 可以使用 NOT运算符来设计否定条件,如下述
SQL语句检索所有,财务,部门中不姓李的职工信息
( 显示结果 ),
sSQL =,SELECT * FROM 职工工资
WHERE 部门 = '财务 ' and not(姓名 Like '李 %')"
② LIKE运算符提供两种字符串匹配方式,一种是使用下划线符号,_” 匹配一个任意字符,另一种是使用百分号,%” 匹配 0个或多个任意字符 。
【 例 12-3】 在,职工工资,表中检索李冰,赵强的详细信息 ( 显示结果 ) 。
sSQL = "SELECT * FROM 职工工资 WHERE 姓名 IN('李冰 ','赵强 ')"
说明:这里的 IN运算符,格式为,IN( 常量 1,常量 2? ) 含义为:查找和常量相等的值 。
【 例 12-4】 检索所有实发工资在 800和 900之间的职工信息 。 这个查询的条件是值在某一范围之间,可以使用 BETWEEN运算符:
sSQL = "SELECT * FROM 职工工资 WHERE 实发工资 BETWEEN 800 AND
900"
代码 执行结果 。
(3) 嵌套查询在前面的例子中,WHERE子句的 〈 联接条件 〉 是一个简单条件,有时,〈 联接条件 〉 本身涉及多个表,
或由查询得到,这时就需要使用 SQL的嵌套查询功能 。
【 例 12-5】 找出与,赵强,同部门的职工 。
使用如下的嵌套查询:
sSQL = "SELECT 姓名 as 同事姓名 FROM 职工工资 WHERE 部门 "
sSQL =sSQL & "= (SELECT 部门 FROM 职工工资 WHERE 姓名 in ('赵强
'))"
代码 执行结果 。
说明:
① 命令中含有两 SELECT-FROM-WHERE查询块,即内层查询块和外层查询块,内层查询块检索的部门值:
财务 。
② 使用如下的嵌套查询可以在结果中去掉赵强本人 ( 执行结果 ),
sSQL = "SELECT 姓名 as 同事姓名 FROM 职工工资 WHERE 姓名 not in
('赵强 ') and "
sSQL =sSQL & "部门 = (SELECT 部门 FROM 职工工资 WHERE 姓名 in ('赵强 '))"
SQL不仅具有一般的检索数据的功能,而且还有统计计算的功能 。 SQL用于统计计算的系统函数有:
COUNT( 计数 ),SUM( 求和 ),AVG( 求平均 ),MAX
( 最大值 ),MIN( 最小值 ) 。
【 例 12-6】 下述查询计算出财务部门的平均工资,
最高工资和最低工资和人数 。
sSQL = "SELECT AVG(实发工资 ) as 平均工资,MAX(实发工资 ) as 最高工资,
"
sSQL =sSQL & " MIN(实发工资 ) as 最低工资,COUNT(姓名 ) AS 人数 "
sSQL =sSQL & " FROM 职工工资 WHERE 部门 ='财务 '"
代码 执行结果 。
【 例 12-7】 下述查询找出,财务部门,中实发工资大于平均工资的职工信息 。
sSQL = "SELECT * FROM 职工工资 WHERE (部门 ='财务 ') and 实发工资 >"
sSQL = sSQL & "(SELECT AVG(实发工资 ) FROM 职工工资 WHERE 部门 ='财务 ')"
代码 执行结果 。
(5) 排序
SQL中排序操作使用 ORDER BY子句,其具体格式为:
ORDER BY〈 关键字表达式 1〉 [ASC | DESC] [,
〈 关键字表达式 2〉 [ASC | DESC],..]
其中,ASC为升序,DESC为降序 。
【 例 12-8】 下述查询在职工工资表中,按部门升序,实发工资降序排列检索出职工信息:
sSQL = "SELECT * FROM 职工工资 ORDER BY 部门 ASC,实发工资 DESC"
查询 执行结果 。
(6) 分组
SQL提供的系统函数可以对满足条件的记录进行各种运算,这些函数还可以从一组值中计算出一个汇总信息,通常和 GROUP BY分组子句配合使用,完成一些特定功能的查询 。
【 例 12-9】 下述查询在职工工资表中按部门分组并汇总工资信息 。
sSQL="SELECT 部门,SUM(基本工资 ) as 基本工资,SUM(岗位津贴 ) as 岗位津贴,SUM(职务补贴 ) as 职务补贴,SUM(奖金 ) as 奖金 FROM 职工工资
GROUP BY 部门 "
查询 执行结果 。
【 例 12-10】 下述查询检索出最少有 10个人的部门的工资合计 。
sSQL="SELECT 部门,SUM(基本工资 ) as 基本工资,SUM(岗位津贴 )
as 岗位津贴,SUM(职务补贴 ) as 职务补贴,SUM(奖金 ) as 奖金
FROM 职工工资 GROUP BY 部门 HAVING COUNT(*)>=10"
说明,HAVING子句与 WHERE子句的区别在于,
WHERE子句是用来指定表中各行所应满足的条件,而
HAVING子句是用来指定每一分组所满足的条件,只有满足 HAVING条件的那些组才出现在结果中 。
查询 执行结果 。
【 例 12-11】 下述查询检索出平均实发工资最高的部门的工资合计信息 。
sSQL="SELECT 部门 as 合计,SUM(基本工资 ) as 基本工资,SUM(岗位津贴 ) as 岗位津贴,"
sSQL=sSQL & "SUM(职务补贴 ) as 职务补贴,SUM(奖金 ) as 奖金 FROM
职工工资 "
sSQL=sSQL & " GROUP BY 部门 HAVING avg(实发工资 )= "
sSQL=sSQL & " (SELECT top 1 avg(实发工资 ) FROM 职工工资 GROUP
BY 部门 ORDER BY avg(实发工资 ) DESC)"
代码 执行结果 。
12.2.2 查询功能
1,SELECT子句
2,FROM子句
3,WHERE子句
4,其它子句和选项
5,在 ADO中使用 SQL查询功能
12.2.3 操作功能
SQL语言的操作功能包括对表中数据的增加,删除和更新操作 。 由于对表中数据的增加,删除和更新操作一般无需返回记录集对象,因此通常使用链接对象
Connection和命令对象 Command的 Execute方法来执行
SQL。
12.2.3 操作功能
1,插入
2,删除
3,更新
1,插入在一个表的尾部追加数据时,要用到插入功能,
SQL的插入命令包括以下 2格式:
INSERT INTO〈 表名 〉 [(〈 字段名 1〉 [,〈 字段名 2〉,? ])] VALUES (〈 表达式 1〉 [,
〈 表达式 2〉? ])

INSERT INTO〈 表名 〉 FROM ARRAY〈 数组名 〉
说明:
① 第 1种格式在指定的表的表尾添加一条新记录,
其值为 VALUES后面的表达式的值 。 当需要插入表中所有字段的数据时,表名后面的字段名可以缺省,但插入数据的格式必须与表的结构完全吻合;若只需要插入表中某些字段的数据,那么就需要列出插入数据的字段,当然相应表达式的数据位置会与之对应 。
② 第 2种格式也是在指定的表的表尾添加一条新记录,新记录的值是指定的数组中各元素的数据 。 数组中各元素与表中各字段顺序对应 。 如果数组中元素的数据类型与其对应的字段类型不一致,则新记录对应的字段为空值;如果表中字段个数大于数组元素的个数,则多出的字段为空值 。
【 例 12-12】 下述网页代码在,职工工资,表中插入一条新记录 。
<HTML>
<HEAD><title>职工工资 </title></HEAD>
<BODY>
<%
set conn=server.createobject("adodb.Connection")
CS="Provider=Microsoft.jet.OLEDB.4.0;Data Source="
conn.ConnectionString=CS & Server.MapPath("rsgl.mdb")
conn.Open
set cmm=server.createobject("adodb.Command")
set cmm.ActiveConnection = conn
sSQL="INSERT INTO 职工工资 (部门,编号,姓名,基本工资,岗位津贴,
职务补贴 )"
sSQL=sSQL & " VALUES('保卫 ','04005','张立 ',340,200,180)"
cmm.CommandText=sSQL
cmm.Execute aa,,1
if aa=1 then Response.Write "插入成功 ! "
conn.Close
set conn=nothing
%>
</BODY>
</HTML>
网页 执行结果 。
说明:也可以先定义数组 A(5),A中各元素的值见表 12-2。
表 12-2 数组 A()中元素的值
A(0) A(1) A(2) A(3) A(4) A(5)
'保卫 ' '04005' '王刚 ' 340 200 180
然后将 SQL语句改为:
sSQL="INSERT INTO 职工工资 FROM ARRAY A"
2,删除用 SQL语言删除记录的命令格式如下:
DELETE FROM 〈 表名 〉
[WHERE〈 条件表达式 1〉 [AND | OR〈 条件表达式 2〉? ]]
说明:
① 〈 表名 〉,指定删除记录的表名 。
② WHERE选项:指明只删除满足条件的记录 。
使用 SQL DELETE命令时务必小心谨慎 。 不带
WHERE子句的 DELETE命令将删除表中的所有行 。 应确保包括 SQL WHERE子句,以便明确指定要删除的行 。
【 例 12-13】 下述 SQL代码将,职工工资,表中的
,张立,删除 执行结果 。
sSQL="DELETE FROM 职工工资 WHERE 姓名 = '张立 '"
3,更新更新是指对存储在表中的记录进行修改,SQL更新命令的语法格式为:
UPDATE 〈 表名 〉
SET〈 列名 1〉 =〈 表达式 1〉 [,〈 列名 2〉 =
〈 表达式 2〉? ]
[WHERE〈 条件表达式 1〉 [AND | OR〈 条件表达式 2〉? ]]
说明:
① 〈 表名 〉,指定要更新数据的记录所在的表名 。
② SET〈 列名 〉 =〈 表达式 〉,指定被更新的字段及该字段的新值 。 如果省略 WHERE子句,则该字段每一行都用同样的值更新 。
② SET〈 列名 〉 =〈 表达式 〉,指定被更新的字段及该字段的新值 。 如果省略 WHERE子句,则该字段每一行都用同样的值更新 。
③ WHERE〈 条件表达式 〉,指明将要更新数据的记录 。 即更新表中符合条件表达式的记录 。
【 例 12-14】 下述 SQL代码将,职工工资,表中基本工资低于平均数的职工增加 5%的基本工资 执行结果,
sSQL="UPDATE 职工工资 SET 基本工资 = 基本工资 *1.05 WHERE "
sSQL= sSQL & "基本工资 <(Select AVG(基本工资 ) from 职工工资 )"
12.2.4 使用 Command对象改善查询使用 Command 对象执行查询的方式与使用
Connection和 Recordset对象执行查询的方式一样,
但是使用 Command对象可以准备 ( 或编译 ) 对数据库源的查询,然后使用各种不同的值重复发出此查询 。
用这种方法编译查询的好处在于,当需要重新发出修改过的已有查询时,可以大大地减少发出时间 。 另外,
还可以留下 SQL的部分查询不进行定义,而在执行查询之前对这部分进行更改 。
Command对象的 Parameters集合可以使您避免每次重新发布查询时都要重建查询的麻烦 。 例如,如果您需要定期更新基于网站的库存系统的供应和费用信息,就可以按照下列方式预定义查询:
' 创建 Command对象;使用 ActiveConnection属性向 Command对象附加连接 。
Set cmm= Server.CreateObject("ADODB.Command")
Set cmm.ActiveConnection = conn
' 定义 SQL命令
sSQL="INSERT INTO 职工工资 (部门,编号,姓名 ) VALUES(?,?,?)"
cmm.CommandText=sSQL
' 首次执行 Command对象之后,保存 CommandText属性中
' 编译查询
cmm.Prepared = True
' 定义并执行第一个插入操作 。
cmm(0) = "供销 "
cmm(1) = "02021"
cmm(2) = "李晓梅 "
cmm.Execute,,1
' 定义并执行第二个插入操作 。
cmm(0) = "技术 "
cmm(1) = "03031"
cmm(2) = "杨惠 "
cmm.Execute,,1
说明:
① 在上例中,使用不同的值重复构建和重新发布 SQL命令,但并没有重新定义查询以及向数据库源中重新发出查询 。
② 使用 Command命令编译查询还有如下优点:可避免在将字符串和变量连接成 SQL查询时出现问题 。
特别是使用 Command对象的 Parameter集合,可以避免那些与定义特定类型字符串,日期和时间变量相关的问题 。 例如,包含单引号 (')的 SQL查询值可能导致查询失败:
strSQL = "INSERT INTO Customers (FirstName,LastName) VALUES
('Robert','O'Hara')"
注意,姓 O'Hara包含一个单引号,这与用来表示
SQL VALUES关键字中数据的单引号冲突 。 通过将查询值绑定为 Command对象参数,可以避免此类问题 。
12.3 上机练习
【 练习 12-1】 设计一个数据表查询网页程序
( 执行结果 ) 。
程序包括 3个 asp文件,它们分别是:
① main.asp:查询网页主框架,包括两个框架 。
上方框架为条件选择,下方框架为记录显示区域 。
② menu.asp:上方框架的来源网页,用以控制查询条件的输入 。
③ List1.asp:记录显示页面 。
(1) 主框架网页主框架网页 Main.asp的代码如下:
<HTML>
<FRAMESET ROWS="100,*" BORDER="0">
<FRAME NAME="Top" NORESIZE SCROLLING="No" SRC="Menu.asp">
<FRAME NAME="Bottom" NORESIZE SRC="list1.asp">
</FRAMSET>
</HTML>
说明:下方框架的名称为,Bottom”,各个记录操作网页都将在此打开 。
(2) 查询条件网页查询条件网页 Menu.asp是上方框架的来源网页 。
其 程序代码 。
说明:
① 代码包括 2个 Sub子过程和 1个事件过程 。
② 过程 change()由多个控件的事件过程调用,其功能是将各选项组合成一个查询条件,并赋值给 Form
的 Hidden控件,以便提交 。
③ 过程 aa()由窗体 form的提交 ( submit) 事件过程调用,用于检验查询条件是否合法 。
④ 控件 select1的 onchange事件过程用于根据选择改变另两个列表的选项 。
(3) 记录显示记录显示网页 List1.asp显示查询返回的记录集
Recordset对象的单条记录,程序代码 。