?? 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 + -