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

     在 本 篇 的 开 头, 我 要 感 谢 一 些 朋 友 来 信 给 我 指 出 了 前 几 篇 文 章 中 的 错 误。 不 知 大 家 是 否 记 得 在 第 八 篇 中 我 举 了 一 个 简 单 的 利 用 Application 制 作 的 页 面 访 问 计 数 器? 有 位 朋 友 来 信 问 我, 为 何 当 他 改 变 计 数 器 起 始 变 量 NumVisits 的 值 后 对 最 后 的 记 数 结 果 没 有 任 何 作 用? 起 初 我 也 大 惑 不 解, 让 我 们 来 回 忆 一 下 这 段 源 程 序, 如 下:
< %
Dim NumVisits
NumVisits=0
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>
欢 迎 光 临 本 网 页, 你 是 本 页 的 第 < %= Application("NumVisits") %> 位 访 客 !

   在 这 段 程 序 中, 如 果 你 试 图 通 过 改 变 变 量 NumVisits 的 值 来 改 变 记 数 器 结 果, 是 绝 对 办 不 到 的。 因 为 用 变 量 的 值 去 改 变 Application 的 值 是 不 可 以 的, 这 两 者 是 不 相 关 的。 所 以 这 里 对 变 量 的 定 义 和 赋 值 都 是 多 余 的。 那 么 我 们 究 竟 应 该 如 何 来 给 Application("NumVisits") 定 义 一 个 初 始 值 呢? 请 看 以 下 修 正 后 程 序:
< %
If Application("NumVisits")< 999 then
Application("NumVisits")=999
End If
Application.Lock
Application("NumVisits")=Application("NumVisits")+1
Application.Unlock
%>
欢 迎 光 临 本 网 页, 你 是 本 页 的 第 < %= Application("NumVisits") %> 位 访 客 !

   这 里 的 999 就 是 你 要 设 定 的 计 数 器 初 始 值, 如 此 一 来 问 题 就 迎 刃 而 解 了。 我 非 常 感 谢 这 位 姓 康 的 朋 友 给 我 指 出 了 这 个 错 误, 虽 然 这 只 是 一 个 很 小 的 漏 洞, 但 我 们 在 共 同 学 程 序 写 程 序 的 过 程 中 非 常 需 要 这 种 严 谨 细 致 的 作 风, 希 望 今 后 朋 友 们 们 一 旦 发 现 文 中 的 错 误 即 刻 来 信 告 知, 我 也 能 及 时 纠 正, 谢 谢。

   SQL 语 言 可 以 分 为 两 大 部 分: 数 据 定 义 语 言 和 数 据 操 纵 语 言, 继 上 一 篇 我 们 学 习 了 数 据 操 纵 语 言 中 的 Select 语 句 后, 今 天 作 者 要 继 续 给 大 家 简 要 介 绍 其 余 的 SQL 语 句。

   SQL 是 一 种 完 备 的 数 据 处 理 语 言, 不 仅 用 于 数 据 库 查 询, 而 且 用 于 数 据 库 中 的 数 据 修 改 和 更 新, 与 支 持 SQL 查 询 的 Select 语 句 的 复 杂 性 相 比 较, 更 改 数 据 库 内 容 的 SQL 语 句 就 格 外 简 单。 然 而 对 于 一 个 DBMS 来 说, 数 据 更 新 所 造 成 的 风 险 大 大 超 出 了 数 据 查 询。 数 据 库 管 理 系 统 必 须 在 更 改 期 内 保 护 所 存 储 的 数 据 的 一 致 性, 确 保 有 效 的 数 据 进 入 数 据 库, 数 据 库 必 须 保 持 一 致 性, DBMS 还 必 须 协 调 多 用 户 的 并 行 更 新, 以 确 保 用 户 和 他 们 的 更 改 不 至 于 影 响 其 他 用 户 的 作 业。

   用 于 修 改 数 据 库 内 容 的 SQL 语 句 主 要 有 以 下 三 个:

   1、 Insert, 向 一 个 表 中 加 入 新 的 数 据 行

   2、 Delete, 从 一 个 表 中 删 除 数 据 行

   3、 Update, 更 改 数 据 库 中 已 经 存 在 的 数 据

   首 先 我 们 来 看 看 Insert 的 用 法:

   标 准 语 法:
   INSERT INTO table_name
   (col1, col2...)
   VALUES(value1, value2...)

   下 例 要 将 书 生 作 为 一 个 新 的 销 售 员 加 入 表 Salesreps 中
   Insert Into
   Salesreps (name,num,sales,hire_date,income)
   values ('shusheng',9,10000,'23-Feb-99',2000)

   在 此 语 句 中, 列 的 名 称 列 在 括 号 中 以 逗 号 隔 开, 接 下 去 是 Value 短 语 和 括 号 中 同 样 以 逗 号 隔 开 的 每 列 数 据, 应 该 注 意 的 是 数 据 和 列 名 称 的 顺 序 是 相 同 的, 而 且 若 是 字 符 串 型 则 以 单 引 号 隔 开。 从 概 念 上 来 讲, Insert 语 句 建 立 的 一 个 与 表 列 结 构 相 一 致 的 数 据 行, 用 取 自 Values 子 句 的 数 据 来 填 充 它, 然 后 将 该 新 行 加 入 表 中, 表 中 的 行 是 不 排 序 的, 因 此 不 存 在 将 该 行 插 入 到 表 的 头 或 尾 或 两 行 之 间 的 这 个 概 念。 Insert 语 句 结 束 后, 新 行 就 是 表 的 一 部 分 了。

   Insert 语 句 还 可 以 将 多 行 数 据 添 加 到 目 标 表 中 去, 在 这 种 形 式 的 Insert 语 句 中, 新 行 的 数 据 值 不 是 在 语 句 正 文 中 明 确 地 指 定 的, 而 是 语 句 中 指 定 的 一 个 数 据 库 查 询。 添 加 的 值 来 自 数 据 库 自 身 的 行, 这 乍 看 起 来 似 乎 有 些 奇 怪, 但 是 在 某 些 特 定 的 状 态 下, 这 是 非 常 有 用 的。 比 如, 你 想 把 1998 年 12 月 30 日 之 前 产 生 的 订 单 编 号、 日 期 和 数 目 从 order 表 中 拷 贝 到 另 一 个 名 为 oldorder 的 表 中 去, 多 行 Insert 语 句 为 拷 贝 数 据 提 供 了 一 种 紧 凑 而 高 效 的 方 法, 如 下:
   Insert into oldorder (Num,Date,Amount)
   Select Num,Date,Amount
   From order
   Where Date<'30-12-98'

   这 条 语 句 看 起 来 有 些 复 杂, 其 实 很 简 单, 语 句 标 识 了 接 收 新 行 的 表 oldorder 和 接 收 数 据 的 列, 完 全 类 似 于 单 行 Insert 语 句。 语 句 的 剩 余 部 分 是 一 个 查 询, 它 检 索 order 表 中 的 数 据。 SQL 先 执 行 对 order 表 的 查 询, 然 后 将 查 询 结 果 逐 行 插 入 到 oldorder 表 中 去。

   下 面 我 们 来 看 看 Update 的 用 法, Update 语 句 用 于 更 新 单 表 中 选 定 行 的 一 列 或 多 列 的 值。 要 更 新 的 目 标 表 在 语 句 中 定 义, Set 子 句 则 指 定 要 更 新 哪 些 列 并 计 算 他 们 的 值。 Update 语 句 总 是 包 含 Where 语 句, 而 且 Update 语 句 比 较 危 险, 所 以 您 必 须 明 确 地 认 识 到 Where 语 句 的 重 要 性, Where 语 句 被 用 来 指 定 需 要 更 新 的 行。

   标 准 语 法:
   UPDATE table_name
   SET columnname1 = value1
   [, columname2 = value2]...
   WHERE search_condition

   以 下 是 一 个 简 单 的 Update 语 句 的 例 子 :
   Update customers
   Set credit=100000.00,id=99
   Where name='asp'

   在 此 例 中 我 们 将 表 customers 中 客 户 名 为 asp 的 客 户 的 信 贷 值 更 新 为 10 万 并 将 他 的 ID 变 更 为 99。 再 看 下 例:
   Update customers
   Set credit=200000.00,state=021
   Where ID in (80,90,100,120)

   我 们 可 以 发 现, 其 实 SQL 处 理 Update 语 句 的 过 程 就 是 逐 行 遍 历 所 指 定 的 表, 更 新 其 搜 索 条 件 结 果 为“真” 的 行, 跳 过 其 搜 索 条 件 结 果 为“假” 或“空” 的 行。

   最 后, 来 看 看 Delete 语 句。

   标 准 语 法:
   DELETE FROM tablename
   WHERE condition

   由 于 它 过 于 简 单, 所 以 所 造 成 的 后 果 也 是 严 重 的, 虽 然 其 中 的 Where 子 句 是 任 选 的, 但 它 几 乎 总 是 存 在 的, 若 将 Where 子 句 从 Delete 语 句 中 省 略 掉, 则 目 标 表 的 所 有 行 都 将 被 删 除。 看 下 例:
   Delete from order Where ID=99

   在 文 章 的 末 尾, 作 者 在 给 大 家 简 要 介 绍 一 下 数 据 定 义 语 言。 它 是 用 来 创 建 和 修 改 数 据 库 结 构 的 一 种 语 句, 包 括 Create 和 Drop 语 句。

   1、 Create 语 句

   标 准 语 法:
   CREATE TABLE table_name
   ( field1 datatype [ NOT NULL ],
   field2 datatype [ NOT NULL ],
   field3 datatype [ NOT NULL ]...)

   如:
   CREATE TABLE BILLS
   ( NAME CHAR(30),
   AMOUNT NUMBER,
   ACCOUNT_ID NUMBER)

   尽 管 Create Table 比 前 面 介 绍 的 语 句 难 理 解 一 些, 但 仍 然 很 直 观。 它 将 bills 赋 予 一 个 新 表, 并 指 定 表 中 三 列 的 名 称 和 数 据 类 型。 表 被 建 立 后 我 们 就 可 以 添 入 数 据 了。 如:

   Insert into bills(name,amout,account_id) values('gates',100,1)

   如 果, 你 觉 得 不 再 需 要 保 存 产 品 信 息, 则 可 用 Drop table 语 句 将 该 表 及 其 所 包 含 的 所 有 数 据 从 数 据 库 中 删 除 掉。

   标 准 语 法:

   DROP TABLE table_name

   至 此, 我 们 已 经 了 解 了 所 有 常 用 的 SQL 语 句, 可 别 小 看 这 些 貌 似 英 文 的 简 单 语 句, 它 们 的 功 能 十 分 强 大, 当 我 们 编 写 asp 程 序 时 必 须 使 用 他 们 对 数 据 库 进 行 操 作。