原 定 计 划 从 本 篇 开 始 就 要 给 大 家 介 绍 ASP 内 建 的 ActiveX 组 件,但 是 考 虑 到 我 们 在 往 后 的 学 习 中 将 会 接 触 到 大 量 的 数 据 库 查 询,因 此 作 者 临 时 决 定 花 一 到 两 篇 的 篇 幅 向 大 家 简 要 介 绍 一 些 数 据 库 查 询 语 言 的 基 本 知 识,这 其 实 也 是 学 习 ASP 所 必 须 掌 握 的 一 门 知 识。是 否 能 够 灵 活 地 运 用 数 据 库 查 询 语 言,将 直 接 关 系 到 ASP 程 序 的 执 行 效 率 等 一 系 列 问 题,所 以 请 各 位 务 必 重 视。
相 信 很 多 朋 友 都 听 说 过 SQL 这 个 名 字,如 果 你 是 计 算 机 方 面 的 行 家,SQL 的 大 名 一 定 是 如 雷 贯 耳。那 么 SQL 究 竟 是 什 么 呢?SQL 一 词 实 际 上 是 "Structured Query Language" 结 构 式 查 询 语 言 的 缩 写,是 用 于 对 存 放 在 计 算 机 数 据 库 中 的 数 据 进 行 组 织、管 理 和 检 索 的 一 种 工 具;是 一 种 特 定 类 型 的 数 据 库 -- 关 系 数 据 库。而 控 制 这 种 数 据 库 的 计 算 机 程 序 就 是 我 们 常 说 的 DBMS-- 数 据 库 管 理 系 统。譬 如:SQL Server、Oracle、Sybase、DB2 等 等。当 用 户 想 要 检 索 数 据 库 中 的 数 据 时,就 通 过 SQL 语 言 发 出 请 求,接 着 DBMS 对 该 SQL 请 求 进 行 处 理 并 检 索 所 要 求 的 数 据,最 后 将 其 返 回 给 用 户,此 过 程 被 称 作 为 数 据 库 查 询,这 也 就 是 数 据 库 查 询 语 言 这 一 名 称 的 由 来。
SQL 并 不 是 象 C、COBOL 和 Fortran 语 言 那 样 的 完 整 的 计 算 机 语 言。SQL 没 有 用 于 条 件 测 试 的 IF 语 句,也 没 有 用 于 程 序 分 支 的 Goto 语 句 以 及 循 环 语 句 For 或 Do。确 切 的 讲,SQL 是 一 种 数 据 库 子 语 言,SQL 语 句 可 以 被 嵌 入 到 另 一 种 语 言 中,从 而 使 其 具 有 数 据 库 存 取 功 能。SQL 也 非 严 格 的 结 构 式 语 言,它 的 句 法 更 接 近 英 语 语 句,因 此 易 于 理 解,大 多 数 SQL 语 句 都 是 直 述 其 意,读 起 来 就 象 自 然 语 言 一 样 明 了。SQL 还 是 一 种 交 互 式 查 询 语 言,允 许 用 户 直 接 查 询 存 储 数 据,利 用 这 一 交 互 特 性,用 户 可 以 在 很 短 的 时 间 内 回 答 相 当 复 杂 的 问 题,而 同 样 问 题 若 让 程 序 员 编 写 相 应 的 报 表 程 序 则 可 能 要 用 几 个 星 期 甚 至 更 长 时 间。
在 大 部 分 ASP 应 用 程 序 中 我 们 都 会 接 触 到 数 据 库,而 我 们 在 编 写 ASP 应 用 程 序 时 用 来 进 行 数 据 库 操 作 的 标 准 语 法 正 是 SQL,因 此 SQL 语 法 的 重 要 性 是 不 言 而 喻 的。下 面,我 们 就 从 最 常 用 的 SQL 语 句 SELECT 着 手,一 步 一 步 地 来 学 习 SQL。
查 询 是 SQL 语 言 的 核 心,而 用 于 表 达 SQL 查 询 的 SELECT 语 句 则 是 功 能 最 强 也 是 最 为 复 杂 的 SQL 语 句,它 从 数 据 库 中 检 索 数 据,并 将 查 询 结 果 提 供 给 用 户。在 本 文 中 我 们 将 建 立 一 个 名 为 tianjiao 的 简 单 数 据 库,该 库 中 存 放 了 一 个 叫 sales 的 销 售 记 录 表,如 下 所 示 :
姓名 性别 工资 销售目标 销售额 地区 书生 男 2500 8000 9000 上海 吴冠军 男 3000 10000 9999 北京 雷鸣 男 2000 8000 10000 四川 雪儿 女 2500 5000 6000 广州 顾一 男 2600 9000 9800 大连 阿卓 女 2000 4000 4000 天津 熠天 男 4000 20000 20000 全国
在 该 表 中 有 六 列 即 六 个 字 段 : 姓 名、性 别、工 资、销 售 目 标、销 售 额、地 区,首 先 我 们 用 Select 语 句 列 出 姓 名、销 售 目 标 和 销 售 额 :
Select 姓 名,销 售 目 标,销 售 额 From sales
结 果 如 下 :
姓名 销售目标 销售额 书生 8000 9000 吴冠军 10000 9999 雷鸣 8000 10000 雪儿 5000 6000 顾一 9000 9800 阿卓 4000 4000 熠天 20000 20000
然 后,我 们 再 列 出 所 有 男 性 的 姓 名、销 售 目 标 和 销 售 额 :
Select 姓 名,销 售 目 标,销 售 额 From sales Where 性 别 =" 男 "
结 果 如 下 :
姓名 销售目标 销售额 书生 8000 9000 吴冠军 10000 9999 雷鸣 8000 10000 顾一 9000 9800 熠天 20000 20000
接 下 来,我 们 做 一 个 相 对 复 杂 的 查 询,列 出 销 售 额 大 于 销 售 目 标 的 所 有 男 性 的 姓 名、销 售 目 标 和 销 售 额,并 且 按 销 售 目 标 排 序。
Select 姓 名,销 售 目 标,销 售 额
Form sales
Where 销 售 额 > 销 售 目 标
And 性 别 =" 男 "
Order By 销 售 目 标
结 果 如 下 :
姓名 销售目标 销售额 书生 8000 9000 雷鸣 8000 10000 顾一 9000 9800 熠天 20000 20000
大 家 可 以 看 到,对 于 简 单 查 询,SQL Select 语 句 和 英 文 语 法 很 相 象,我 们 来 分 析 一 下 SELECT 语 句 的 完 整 格 式,它 包 括 六 个 子 句,其 中 SELECT 和 FROM 子 句 是 必 须 的,其 它 子 句 可 以 任 选,每 个 子 句 的 功 能 如 下 :
1、Select 子 句 列 出 所 有 要 求 SELECT 语 句 检 索 的 数 据 项。它 放 在 SELECT 语 句 开 始 处,指 定 此 查 询 要 检 索 的 数 据 项。这 些 数 据 项 通 常 用 选 择 表 表 示,即 一 组 用“,”隔 开 的 选 择 项。按 照 从 左 到 右 的 顺 序,每 个 选 择 项 产 生 的 一 个 列 的 查 询 结 果,一 个 选 择 项 可 能 是 以 下 项 目:
(1)、列 名:标 识 FROM 子 句 指 定 表 中 的 列。如 果 列 名 作 为 选 择 项,则 SQL 直 接 从 数 据 库 表 中 每 行 取 出 该 列 的 值,再 将 其 放 在 查 询 结 果 的 相 应 行 中。
(2)、常 数:指 定 在 查 询 结 果 的 每 行 中 都 放 上 该 值。
(3)、SQL 表 达 式:说 明 必 须 将 要 放 入 查 询 结 果 中 的 值 按 表 达 式 的 规 定 进 行 计 算。
2、From 子 句 列 出 包 含 所 要 查 询 数 据 的 表,它 由 关 键 字 FROM 后 跟 一 组 用 逗 号 分 开 的 表 名 组 成。每 个 表 明 都 代 表 一 个 包 括 该 查 询 要 检 索 数 据 的 表。这 些 表 称 为 此 SQL 语 句 的 表 源,因 为 查 询 结 果 都 源 于 它 们。
3、Where 子 句 告 诉 SQL 只 查 询 某 些 行 中 的 数 据,这 些 行 用 搜 索 条 件 描 述。
4、Group By 子 句 指 定 汇 总 查 询,即 不 是 对 每 行 产 生 一 个 查 询 结 果,而 是 将 相 似 的 行 进 行 分 组,再 对 每 组 产 生 一 个 汇 总 结 果。
5、Having 子 句 告 诉 SQL 只 产 生 有 Group By 得 到 的 某 些 组 的 结 果,和 Where 子 句 一 样,所 需 要 的 组 也 用 一 个 搜 索 条 件 指 定。
6、Order By 子 句 将 查 询 结 果 按 一 列 或 多 列 中 的 数 据 排 序。如 果 省 略 此 子 句,则 查 询 结 果 将 是 无 序 的。
下 面 作 者 将 提 供 一 个 简 单 但 实 用 的 运 用 SQL 语 句 查 询 的 ASP 程 序 供 大 家 参 考。
为 了 使 大 家 更 清 楚 更 直 接 地 了 解 SQL 语 法 在 ASP 中 的 应 用,我 们 先 将 查 询 的 所 有 核 心 过 程 写 成 一 个 名 为 query2table 的 SUB,然 后 利 用 ASP 的 服 务 器 端 包 容 功 能 调 用 该 SUB。请 将 以 下 语 句 剪 贴 到 记 事 簿,保 存 为 subdbtable.inc 文 件,并 置 于 虚 拟 目 录 asptest 下 :
< %
sub query2table(inputquery)
set conntemp=server.createobject("adodb.connection")
conntemp.open "DSN=Student;uid=student;pwd=aspmagic"
set rstemp=conntemp.execute(inputquery)
howmanyfields=rstemp.fields.count -1
' 统 计 数 据 库 中 的 列 数
%>
< table border=1>< tr>
< %
for i=0 to howmanyfields
%>
< td>< b>< %=rstemp(i).name%>< /B>< /TD>
< % next %>
< /tr>
< %
do while not rstemp.eof
%>
< tr>
< % for i = 0 to howmanyfields
thisvalue=rstemp(i)
If isnull(thisvalue) then
thisvalue=" "
' 如 果 字 段 为 空,则 将 变 量 thisvalue 的 值 定 义 为 一 个 空 格
end if%>
< td valign=top>< %=thisvalue%>< /td>
< % next %>
< /tr>
< %rstemp.movenext
loop%>
< /table>
< %
rstemp.close
set rstemp=nothing
conntemp.close
set conntemp=nothingend sub%>
完 成 了 SUB 的 定 义 过 程,在 下 面 几 个 ASP 程 序 中 我 们 只 要 加 入 想 要 使 用 的 SQL 查 询 语 句,并 调 用 该 过 程 就 可 以 非 常 方 便 的 得 到 查 询 结 果。将 以 下 四 段 代 码 分 别 保 存 为 asp11a.asp、asp11b.asp、asp11c.asp、asp11d.asp 四 个 .asp 文 件。
< HEAD>< TITLE>asp11a.asp< /TITLE>< /HEAD>
< HTML>< body bgcolor="#FFFFFF">
< %
call query2table("select * from publishers where name like 'A%%'")
' 将 表 publishers 中 所 有 姓 名 中 有 字 母 A 的 记 录 查 询 出 来
%>
< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML>
< HEAD>< TITLE>asp11b.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">
< %
call query2table("select * from titles where Year_Published > = 1998")
' 将 表 titles 中 所 有 发 表 年 份 大 于 或 等 于 1998 年 的 记 录 查 询 出 来
%>
< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML>
< HEAD>< TITLE>asp11c.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">
< %
call query2table("select * from publishers where amount>10000 and sex='male'")
' 将 表 publishers 中 所 有 数 量 大 于 10000 且 性 别 为 男 的 记 录 查 询 出 来
%>
< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML>
< HEAD>< TITLE>asp11d.asp< /TITLE>< /HEAD>< HTML>< body bgcolor="#FFFFFF">
< %
call query2table("select * from publishers where state< > 'NY'")
'将 表 publishers 中 所 有 所 在 城 市 不 为 纽 约 的 记 录 查 询 出 来。
%>
< !--#include virtual="/asptest/subdbtable.inc"-->< /BODY>< /HTML>
利 用 subdbtable.inc 文 件 中 的 所 定 义 的 过 程 query2table,你 就 可 以 非 常 迅 速 地 对 数 据 库 进 行 查 询,你 所 要 做 的 只 是 将“conntemp.open "DSN=Student;uid=student;pwd=aspmagic"”中 的 数 据 库 名 称、用 户 身 份 和 密 码 稍 加 改 动,并 在 调 用 query2table 时 输 入 想 要 使 用 的 SQL 查 询 语 句 即 可。是 不 是 很 简 单 ? 这 就 是 ASP 和 SQL 的 魅 力 所 在 !!!
今 天,我 们 虽 然 用 了 一 整 篇 的 篇 幅 只 学 习 了 一 个 SQL 指 令,但 请 你 相 信 你 所 获 得 远 不 同 于 一 个 DOS 指 令,SELECT 指 令 使 得 你 可 以 非 常 容 易 地 对 数 据 库 进 行 查 询,或 许 在 这 之 前 你 对 数 据 库 查 询 还 一 无 所 知,但 是 通 过 本 篇 的 学 习,你 其 实 已 经 会 使 用 ASP 进 行 常 用 的 数 据 库 查 询 了,是 不 是 很 激 动 ? 在 下 一 篇 中,作 者 将 继 续 给 大 家 介 绍 SQL 的 其 它 几 个 基 本 指 令。在 结 束 本 文 之 前,作 者 在 这 里 要 向 很 多 来 信 的 朋 友 致 歉,由 于 最 近 作 者 工 作 繁 忙,实 在 无 暇 一 一 回 答 各 位 的 问 题,请 见 谅,我 会 尽 量 将 一 些 常 见 的、发 生 频 率 较 高 的 问 题 在 文 章 中 写 出 来,至 于 一 些 不 常 见 的 问 题,我 建 议 大 家 到 下 面 这 个 站 点 提 问,你 将 会 得 到 及 时 的 答 复。www.onlinechina.net/friend/flybird/bbs/wwwboard.asp?id=1, 这 是 作 者 至 今 为 止 所 见 的 最 棒 的 中 文 ASP 学 习 站 点,由 上 海 的 飞 鸟 主 持,大 家 务 必 去 看 看。