动态网站设计十八般武艺——ASP篇(十一)

 

     原 定 计 划 从 本 篇 开 始 就 要 给 大 家 介 绍 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 学 习 站 点,由 上 海 的 飞 鸟 主 持,大 家 务 必 去 看 看。