📄 visual foxpro 5.txt
字号:
---- 使 用SELECT - SQL 结 构 化 查 询 语 句, 可 以 完 成 几 乎 所 有 的 数 据 表 记 录 查 询 任 务。SELECT - SQL 语 句 功 能 之 强 大, 其 完 成 复 杂 查 询 任 务 的 代 码 之 简 单, 令 许 多 传 统 FoxPro 编 程 者 相 见 恨 晚 !
---- 其 实,FoxPro 2.0 以 后 产 品 都 提 供 了 对 SELECT - SQL 语 句 的 支 持, 只 不 过 随 着 版 本 的 提 高,SELECT - SQL 语 句 的 功 能 也 有 了 很 大 的 增 强。 直 至 Visual FoxPro 5.0 ,SELECT - SQL 语 句 功 能 更 有 了 质 的 飞 跃。 这 在 后 面 的 技 巧 中 可 以 略 见 一 斑。
---- SELECT - SQL 语 句 中 提 供 了 一 个 WHERE 子 句 和 一 个 HAVING 子 句, 两 者 都 是 用 于 构 造 记 录 筛 选 条 件, 以 过 滤 出 满 意 的 查 询 结 果 来。 但 是 两 者 是 有 区 别 的。
---- 首 先, 如 果 是 通 过 查 询 设 计 器 设 计 一 个 查 询( 实 质 是 构 造 一 个SELECT - SQL 语 句), 则 产 生 的 SELECT - SQL 语 句 的 WHERE 子 句 是 通 过 设 计 器 中 的 筛 选(Filter) 页 来 构 造 的; 而 HAVING 子 句 则 必 须 通 过 点 按 分 组(Group By) 页 中 的 满 足 条 件(Having) 按 钮 激 活 满 足 条 件 对 话 框 来 构 造, 但 两 者 的 设 计 构 造 方 式 都 是 一 样 的。
---- 再 次, 两 者 筛 选 记 录 的 时 间 是 不 一 样 的: SELECT - SQL 语 句 首 先 用 通 过 筛 选(Filter) 页 所 设 置 的 筛 选 条 件(WHERE 子 句) 针 对 原 始 数 据 源(FROM 子 句 后 面 的 数 据 表 或 视 图) 进 行 相 应 的 记 录 筛 选 之 后, 再 执 行GROUP BY 子 句 中 之 HAVING 子 句 对 WHERE 子 句 筛 选 出 来 的 记 录 进 行 再 次 筛 选。
---- 第 三,WHERE 子 句 可 以 针 对 数 据 源 的 所 有 字 段 构 造 筛 选 条 件; 而 HAVING 子 句 则 只 能 对 SELECT - SQL 语 句 输 出 的 字 段( 包 括 实 际 的 字 段 和 计 算 字 段) 构 造 筛 选 条 件, 但 是 由 于 它 可 对 计 算 字 段 构 造 条 件, 而 计 算 字 段 可 由 任 何 合 法 的 表 达 式 构 成, 因 而 用 HAVING 构 造 筛 选 条 件 更 加 灵 活。 例 如 下 例:
SELECT zh,;
AVG(jffse) AS rjjffse,SUM(jffse) AS zjffse,;
AVG(dffse) AS rjdffse,SUM(dffse) AS zdffse;
From Bankdata!fhz ;
WHERE fhz.zh >=2010001000149 AND fhz.zh< 3010001000157;
GROUP BY zh ;
HAVING rjjffse >100000
---- 上 例 从 银 行 会 计 分 户 明 细 帐 上 统 计 帐 号 2010001000149 到 3010001000157 之 间 的 帐 号 中 日 均 借 方 发 生 额 在 十 万 元 以 上 的 帐 户 有 关 发 生 额 的 信 息。 其 中 的“ 日 均 借 方 发 生 额 在 十 万 元 以 上” 的 条 件 如 果 用 WHERE 子 句 来 构 造, 相 应 语 句 如 下:
SELECT zh,;
AVG(jffse) AS rjjffse,SUM(jffse) AS zjffse,;
AVG(dffse) AS rjdffse,SUM(dffse) AS zdffse;
From Bankdata!fhz ;
WHERE fhz.zh >=2010001000149 AND fhz.zh< 3010001000157;
AND AVG(jffse) >100000;
GROUP BY zh
---- 显 然, 通 过 WHERE 子 句 来 构 造 的 筛 选 条 件, 其 必 须 通 过 表 达 式 对 日 均 发 生 额 进 行 重 复 计 算, 对 查 询 效 率 有 很 大 的 影 响。
---- 第 四, 对 相 同 字 段 名 构 造 相 同 的 筛 选 条 件 时, 使 用 WHERE 子 句 较 之 使 用 HAVING 子 句 构 造 条 件 执 行 效 果 更 佳。 譬 如 如 下 语 句:
SELECT zh,;
AVG(jffse) AS借方日均发生额,
SUM(jffse) AS借方总发生额,;
AVG(dffse) AS贷方日均发生额,
SUM(dffse) AS贷方总发生额;
From Bankdata!fhz ;
WHERE fhz.zh=2010001000149 ;
GROUP BY zh
和语句:
SELECT zh,;
AVG(jffse) AS借方日均发生额,SUM(jffse) AS借方总发生额,;
AVG(dffse) AS贷方日均发生额,SUM(dffse) AS贷方总发生额;
From Bankdata!fhz ;
GROUP BY zh ;
HAVING zh=2010001000149
---- 两 者 的 筛 选 条 件 分 别 是 用 WHERE 子 句 和 HAVING 子 句 完 成 的, 都 是 用 于 从 银 行 会 计 分 户 明 细 帐 上 统 计 帐 号 2010001000149 有 关 发 生 额 的 信 息 的。 但 是 两 者 的 执 行 效 率, 前 者 效 果 更 佳 !
---- 因 此, 在 实 际 设 计 SELECT - SQL 语 句 时, 必 须 根 据 自 己 的 需 要, 有 针 对 性 的 使 用 WHERE 子 句 和 HAVING 子 句。
---- 7、 两 表 连 接 的 五 种 连 接 方 式 的 使 用
---- 在 Visual FoxPro 3.0 以 前 版 本,SELECT - SQL 语 句 只 提 供 了 无 连 接 和 连 接 两 种 方 式。 现 在 在 Visual FoxPro 5.0 开 始,SELECT - SQL 为 两 表 以 上 的 连 接 提 供 了 五 种 连 接 方 式: 无 连 接、 内 连 接、 左 连 接、 右 连 接、 满 连 接。 它 们 到 底 有 些 什 么 区 别 呢 ?
---- 假 设 我 们 具 有 如 下 两 个 表:
表
表1:table1
表2:table2
字 段 名
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
3
a31
a32
b31
b32
---- 通 过SELECT-SQL 命 令 对 两 个 或 两 个 以 上 的 数 据 表 进 行 连 接 查 询 时, 如 果 没 有 设 置 数 据 表 之 间 的 连 接 条 件, 即 无 连 接 方 式, 则 会 造 成 查 询 结 果 中 记 录 条 数 为 数 据 表 记 录 数 相 乘。 譬 如, 如 下 语 句:
SELECT * FROM table1,table2
---- 将 得 到 如 下 一 个 记 录 集:
---- 无 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a11
a12
a21
b22
3
a11
a12
b31
b32
4
a21
a22
a11
b12
5
a21
a22
a21
b22
6
a21
a22
b31
b32
7
a31
a32
a11
b12
8
a31
a32
a21
b22
9
a31
a32
b31
b32
---- 表1 三 条 记 录 与 表2 三 条 记 录 交 叉 连 接 产 生 了9 条 记 录 出 来。
---- 如 果 使 用SELECT - SQL 语 句 的 内 连 接(INNER JOIN), 两 个 连 接 的 数 据 表 中 必 须 同 时 存 在 连 接 条 件 中 设 置 的 字 段 或 字 段 表 达 式 中 的 字 段。 它 将 两 个 数 据 表 中 满 足 指 定 连 接 条 件 的 记 录 筛 选 出 来。 内 连 接 实 质 就 是 以 前 版 本 的 连 接 方 式, 它 是 默 认 的 连 接 方 式。 譬 如, 用 如 下 语 句 基 于 表1 的 fld1 字 段 和 表2 的 fld3 字 段 的 内 连 接:
SELECT * FROM table1 INNER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 内 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
fld2
fld3
fld4
1
a11
a12
a11
b12
2
a21
a22
a21
b22
---- 内 连 接 方 式 将 连 接 的 两 个 表 中 都 满 足 指 定 条 件 的 记 录 过 滤 出 来。
---- 使 用 左 连 接(LEFT OUTER JOIN), 它 以 左 边 表 为 主, 用 于 对 连 接 条 件 左 边 字 段 所 在 的 表 进 行 全 部 记 录 查 询, 并 连 接 条 件 右 边 字 段 所 在 表 满 足 连 接 条 件 的 记 录 进 行 查 询。 当 左 边 数 据 表 中 有 记 录 而 右 边 数 据 表 中 无 相 应 连 接 条 件 的 记 录 时, 则 输 出 的 右 边 数 据 表 字 段 内 容 呈 现 空 值(NULL)。 譬 如 如 下 语 句:
SELECT * FROM table1 LEFT OUTER JOIN table2 ;
ON table1.fld1=table2.fld3
---- 将 得 到 如 下 一 个 记 录 集:
---- 左 连 接 时 产 生 的 结 果 记 录 集
字 段 名
记 录 号
fld1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -