SELECT – S Q L 命 令
从一个或多个表中检索数据
语 法
SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]]
[ Alias.] Select_Item [AS Column_Nam e ]
[, [ Alias.] Select_Item [AS Column_Nam e ] ...] FROM [FORCE]
[ DatabaseNam e!] Table [[AS] Local_Alias ]
[[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN
DatabaseNam e !]Table [[AS] Local_Alias ] [ON JoinCondition … ]
[[INTO Destination ]
| [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT]
| TO SCREEN]]
[PREFERENCE PreferenceNam e] [NOCONSOLE]
[PLAIN] [NOWAIT]
[ W H E R E JoinCondition [AND JoinCondition ...]
[AND | OR FilterCondition [AND | OR FilterCondition ...]]] [GROUP BY GroupColumn [, GroupColumn ...]]
[HAVING FilterCondition ]
[UNION [ALL] SELECTCommand ]
[ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]
参 数 描 述
SELECT

在
SELECT 子 句 中 指 定 在 查 询 结 果 中 包 含 的 字 段 常 量 和 表 达
式
ALL

查
询 结 果 中 包 含 所 有 行 ( 包 括 重 复 值 ) ALL 是 默 认 设 置
DISTINCT
在 查
询 结 果 中 剔 除 重 复 的 行
注
意 每 一 个 SELECT 子 句 只 能 使 用 一 次 DISTINCT
TOP nExpr [PERCENT]

在
符 合 查 询 条 件 的 所 有 记 录 中 选 取 指 定 数 量 或 百 分 比 的
记 录 TOP 子 句


必
须 与 ORDER B Y 子 句 同 时 使 用 ORDER BY 子 句 指 定 查 询 结 果 中
包 含的 列 上 由 Top 字 句 决 定 的 行 数 TOP 子 句 根 据 此 排 序 选
定 最 开 始 的 nExpr 个 或 nExpr % 的 记 录









您可以指定选取
1 到 32767 个记录 使用 ORDER BY 子句指定的字段进行排序
会产生并列的情况 比如 可能有多个记录 它们在选定的字段上相同 所以
如果您指定 nExpr 为 10 在查询结果中可能多于 10 个记录
因为可能有几个记录位置并列




如果包含
PERCENT 关键字指定查询结果中的记录数 得到记录数的可能是小数
这时进行取整 包含 PERCENT 关键字时 nExpr 的范围是 0.01 到 99.99
Alias.




限
定 匹 配 项 的 名 称 Select_Item 指 定 的 每 一 项 在 查 询 结 果
中 都 生 成 一 列如 果 多 个 项 具 有 相 同 的 名 称 则 应 在 这 些 项
名 前 加 上 表 的 别 名 和 一 个 句 点以 防 止 出 现 重 复 的 列

Select_Item
指 定 包 括 在 查 询 结 果 中 的 项 一 个 项 可 以 是
FROM
子句所包含的表中的字段名称



一个常量
查询结果中每一行都出现这个常量值一个表达式 可以是用户自定义函数名
AS Column_Name



指
定 查 询 结 果 中 列 的 标 题 当 Select_Item 是 一 个 表 达 式 或
一 个 字 段 函 数 时 如 果 要 给 此 列 取 一 个 有 含 义 的 名 称 一
般 可 以 使 用 这 个 子 句 Column_Name


可
以 是 一 个 表 达 式 但 不 能 包 含 那 些 表 字 段 名 称 中 不 允 许
出 现 的 字 符 如 空格

FROM






列
出 所 有 从 中 检 索 数 据 的 表 如 果 没 有 打 开 表 Visual FoxPro 显
示 打 开对 话 框 以 便 指 定 文 件 位 置 表 打 开 以 后 直 到 查 询 结
束 时 才 关 闭






如
果 您 包 含 FORCE 关 键 字 Visual FoxPro 在 建 立 查 询 时 会 严 格 按
照 您 在FROM 子句中声明的顺序 连 接 表 若 不 包 含 FORCE 关 键 字
Visual FoxPro 会试 图 对 查 询 进 行 优 化 使 用 FORCE 子 句 避 免 了
优 化 过 程 可 能 加 快 查 询 执行的速度
DatabaseName!






当
包 含 表 的 数 据 库 不 是 当 前 数 据 库 时 DatabaseNam e! 指 定 这
个 数 据 库 的 名称 如 果 数 据 库 不 是 当 前 数 据 库 就 必 须 指 定
包 含 表 的 数 据 库 名 称 应 在 数据 库 名 称 之 后 表 名 之 前 加 上
感 叹 号 ! 分 隔 符
[AS] Local_Alias






为
Table 中 的 表 指 定 一 个 临 时 名 称 如 果 指 定 了 本 地 别 名 那
么 在 整 个SELECT 语 句 中 必 须 都 用 这 个 别 名 代 替 表 名 本 地
别 名 不 影 响 V isual FoxPro 环 境 INNER JOIN 只 有 在 其 他 表 中 包
含 对 应 记 录 一 个 或 多 个 的 记 录 才出 现 在 查 询 结 果 中




LEFT
[OUTER] JOIN 在 查 询 结 果 中 包 含 JOIN 左 侧 表 中 的 所 有 记 录
以 及JOIN 右 侧 表 中 匹 配 的 记 录 OUTER 关 键 字 可 被 省 略 包 含
OUTER 强 调这 是 一 个 外 连 接 (outer join)




RIGHT
[OUTER] JOIN 在 查 询 结 果 中 包 含 JOIN 右 侧 表 中 的 所 有 记 录
以及 JOIN 左 侧 表 中 匹 配 的 记 录 OUTER 关 键 字 可 被 省 略 包 含
OUTER 强调 这 是 一 个 外 连 接 接 (outer join)



FULL
[OUTER] JOIN 在 查 询 结 果 中 包 含 JOIN 两 侧 所 有 的 匹 配 记 录
和 不匹 配 的 记 录 包 含 OUTER 强 调 这 是 一 个 外 连 接 (outer
join)
O N
JoinCondition 指 定 连 接 条 件
INTO Destination







指定在何处保存查询结果
如果在同一个查询中同时包括了 INTO 子句和 TO 子句则 TO 子句不起作用
如果没有包括 INTO 子句 查询结果显示在 浏览 窗口中也可以用 TO
将查询结果定向输出到打印机或文件
Destination
可以是下列子句之一



ARRAY
ArrayName 将查询结果保存到变量数组中
如果查询结果中不包含任何记录则不创建这个数组








CURSOR
CursorName 将 查 询 结 果 保 存 到 临 时 表 中 如 果 指 定 了 一 个
已 打开 表 的 名 称 则 Visual FoxPro 产 生 错 误 信 息 执 行 完 SELECT
语 句 后临 时 表 仍 然 保 持 打 开 活 动 但 只 读 一 旦 关 闭 临 时 表
则 自 动 删 除 它 临时 表 作 为 SORTWORK 指 定 驱 动 器 上 的 一 个 临
时 文 件 存 在
包 含
NOFILTER 是 为 了 创 建 一 个 能 用 在 后 来 的 询 问 中 的 指 针 在
Visual
FoxPro 以 前 的 版 本 需 要 一 个 额 外 的 常 量 或 表 达 式 作 为 过
滤 器 去 创 建一 个 能 用 在 后 来 的 询 问 中 的 指 针
SELECT *, .T. FROM customers INTD CURSOR myquery


包含
NOFILTER 能够减少询问的发生是因为临时表是建立在磁盘上的 当临时表被删除
指针就要被关闭








DBF
TableName | TABLE TableName 将查询结果保存到一个表中
如果指定的表已经打开 并 且 SET SAFETY 设置为 OFF 则 Visual FoxPro
在不给出警告的情况下改写该表 如果没有指定扩展名 Visual FoxPro
指定表的扩展名是 .DBF SELECT 语句执行结束后 表仍然保持打开活动状态

包
含 DATABASE DatabaseName 以 指 定 添 加 了 表 的 数 据 库 包 含 NAME
LongTableName 可以为该表命一个最多可包括 128
个字符的并且可以在数据库中代替短名字的长名
TO FILE FileName

如
果 命 令 中 包 括 了 TO 子 句 但 没 有 包 括 INTO 子 句 则 查 询 结 果
定 向 输 出 到 名 为

FileName
的 ASCII 码文件 打印机或 Visual FoxPro 主窗口
ADDITIVE
把查询结果定向输出到由 TO FILE FileNam e 指 定 的 文 本 文 件 的 现
存 目录 上


TO
PRINTER [PROMPT] 使 查 询 结 果 定 向 输 出 到 打 印 机 在 打 印 开
始 之 前 使 用 可 选 的 PROMPT 子 句 显 示 一 个 对 话 框 您 可 以 根
据 当 前 安 装 的 打 印 机

驱
动 程 序 调 整 打 印 机 的 设 置 将 PROMPT 子 句 放 置 在 紧 跟 TO
PRINTER 之后
TO
SCREEN 使查询结果定向输出到 Visual FoxPro
主窗口或活动的用户自定义窗口中
PREFERENCE PreferenceName



如
果 查 询 结 果 送 往 浏 览 窗 口 就 可 以 使 用 PREFERENCE 保 存 浏 览
窗 口 的 属 性 和 选 项以 备 后 用 PREFERENCE 把 特 征 属 性 或 参 数
选 项 长 期 保 存 在 FOXUSER 的 资 源 文 件中
任何时侯都可以对它们进行检索



第一次执行有
PREFERENCE PreferenceName 的 SELECT 命令时创建参数选项
以后执行有相同参数选项名的 SELECT
命令时便将浏览窗口恢复到原来的参数选项状态 当浏览窗口关闭时
更新参数选项





如果您按下
CTRL+Q+W 键退出 浏览 窗口 您 对 浏览
窗口所做的更改不会保存到资源文件中
NOCONSOLE

不
显 示 送 到 文 件 打 印 机 或 Visual FoxPro 主 窗 口 的 查 询 结 果
PLAIN
防 止
列 标 题 出 现 在 显 示 的 查 询 结 果 中 不 管 有 无 TO 子 句 都 可
使 用 PLAIN


子
句 如 果 SELECT 语 句 中 包 括 INTO 子 句 则 忽 略 PLAIN 子 句
NOWAIT


打开浏览窗口并将查询结果输出到这个窗口后继续程序的执行
程序并不等待关闭浏览窗口 而是立即执行紧接在 SELECT 语句后面的程序行










SELECT
命令中包括 TO SCREEN 可以把查询结果定向输出到 Visual FoxPro
主窗口或用户自定义窗口 如果显示时 Visual FoxPro
主窗口或用户自定义窗口中写满了一 屏 就暂停输出
按任意键可以查看查询结果后面的内容 但是 如果命令中包括了NOWAIT 子句
显示查询结果时就不会暂停 等待按键 而是在 Visual FoxPro
主窗口或用户自定义窗口中连续滚过所有内容 如果命令中包含有 INTO 子句
忽略NOWAIT 子句
W H E R E


通
知 Visual FoxPro 在 查 询 结 果 中 仅 包 含 一 定 数 目 的 记 录 如 果
要 从 多 个 表中 检 索 数 据 W H E R E 子 句 是 必 需 的
JoinCondition



指
定 一 个 字 段 该 字 段 连 接 F R O M 子 句 中 的 表 如 果 查 询 中 包
括 不 止 一 个 表就 应 该 为 第 一 个 表 后 的 每 一 个 表 指 定 连 接
条 件

连
接 多 个 查 询 条 件 必 须 使 用 操 作 符 A N D 每 个 连 接 条 件 都
有 下 面 的 形 式
FieldName1 Comparison FieldName2

其
中 FieldName1 是 一 个 表 中 的 字 段 名 FieldName2 是 另 一 表 中
的 字 段 名
Comparison
是 下 表 中 列 出 的 某 一 操 作 符
操 作 符 比 较 关 系
= 相等
== 完全相等
LIKE SQL LIKE
<> , !=, # 不相等
> 大于
>= 大于等于
< 小于
<= 小于等于







对字符串使用
= 操作符时 所得结果与 SET ANSI 的设置有关 当 SET ANSI 设 置为 OFF 时
Visual FoxPro 比较字符串的方式与 Xbase 的用户相同 当 SET ANSI 的设置为
ON 时 Visual FoxPro 比较字符串时遵守 ANSI 标准 有 关 Visual FoxPro
字符比较方法的详细内容 请参阅 SET ANSI 和 SET EXACT

WHERE
子句支持 ESCAPE 操作符 允许执行对包含有 SELECT – SQL %
和通配符的数据的有意义的查询



ESCAPE
子句允许指定一个可以看作文字字符的 SELECT – SQL 通配符 ESCAPE
子句允许指定一个字符 一旦它被放到通配符字符之前
就表示这个通配符被看作一个文字字符
FilterCondition






指
定 将 包 含 在 查 询 结 果 中 记 录 必 须 符 合 的 条 件 使 用 A N D
或 OR 操 作 符您 可 以 包 含 随 意 数 目 的 过 滤 条 件 您 还 可 以 使
用 NOT 操 作 符 将 逻 辑 表 达 式的 值 取 反 或 使 用 EMPTY 函 数 以
检 查 空 字 段
FilterCondition
可以是下面示例中的任何一种形式
示 例 1
事 例 1 显 示 FieldName1 Comparison FieldName 窗 体 中 的 Fliter Condition
customer.cust_id = orders.cust_id
示 例 2
事 例 1 显 示 FieldName Comparison Expression 窗 体 中 的 Fliter Condition
payments.amount >= 1000
示 例 3
事 例 3 显 示 FieldName Comparison ALL ( Subquery ) 窗 体 中 的 Fliter Condition


当筛选条件包括
ALL 时 只有指定字段满足所有子查询结果后
它所在的记录才能添加到查询结果中
company < ALL ;
(SELECT company FROM customer WHERE country = “ UK")
示 例 4
事 例 4 显 示 FieldName Comparison ANY | SOME ( Subquery ) 窗 体 中 的 Fliter Condition

当筛选条件包含
ANY 或 SOME 时 字段必须至少满足一个由子查询产生的值所决定的比较条件
company < ANY ;
(SELECT company FROM customer WHERE country = “ UK")
示 例 5
事 例 5 显 示 FieldName [NOT] BETWEEN Start_Range AND End_Range 窗 体 中的 Fliter Condition
customer.postalcode BETWEEN 90000 AND 99999
上 面
的 示 例 检 查 字 段 中 的 值 是 否 在 指 定 范 围 内
示 例 6
事 例 6 显 示 [NOT] EXISTS ( Subquery ) 窗 体 中 的 Fliter Condition
EXISTS ;
(SELECT * FROM orders WHERE customer.postalcode = orders.postalcode)





上
面 的 示 例 检 查 是 否 至 少 有 一 行 满 足 子 查 询 中 的 条 件 当
筛 选 条 件 包 括 EXISTS 时只要子查询不为空集 筛选的条件就为 真 (.T.)
示 例 7
事 例 7 显 示 FieldName [NOT] IN Value_Set 窗 体 中 的 Fliter Condition
customer.postalcode NOT IN ("98052 ” ,” 98072 ” , ” 98034")
当 筛
选 条 件 中 包 含 IN 时 把 字 段 所 在 记 录 添 加 到 查 询 结 果 中
的 条 件 是 字 段 必
须 包
含 值 集 合 的 一 个 元 素
示 例 8
事 例 8 显 示 FieldName [NOT] IN ( Subquery ) 窗 体 中 的 Fliter Condition
customer.cust_id IN ;
(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")


这
里 记 录 包 含 在 查 询 结 果 中 的 条 件 是 字 段 必 须 包 含 一 个
子 查 询 的 返 回 值
示 例 9
事 例 9 显 示 FieldName [NOT] LIKE cExpression 窗 体 中 的 Fliter Condition
customer.country NOT LIKE “ UK ”


这个筛选条件查找每个与字符串表达式相匹配的字段
在字符串表达式中可以使用百分号 (%) 和下划线 ( _ ) 通配符
下划线表示字符串中一个任意字符
GROUP BY GroupColumn [, GroupColumn ...]





按
列 的 值 对 查 询 结 果 的 行 进 行 分 组 GroupColumn 可 以 是 常 规
的 表 字 段 名也 可 以 是 一 个 包 含 SQL 字 段 函 数 的 字 段 名 还
可 以 是 一 个 数 值 表 达 式 指定 查 询 结 果 表 中 的 列 位 置 最 左
边 的 列 编 号 为 1

HAVING FilterCondition




指
定 包 括 在 查 询 结 果 中 的 组 必 须 满 足 的 筛 选 条 件 H AVING 应
该 同 GROUP BY 一 起 使 用 它 能 包 含 数 量 不 限 的 筛 选 条 件 筛
选 条 件 用 A N D 或 OR 连 接 还可 以 使 用 NOT 来 对 逻 辑 表 达 式
求 反
FilterCondition
不 能 包 括 子 查 询
使 用
HAVING 子 句 的 命 令 如 果 没 有 使 用 GROUP BY 子 句 则 它 的 作 用
与



W
H E R E 子 句 相 同 可 以 在 HAVING 子 句 中 使 用 本 地 别 名 和 字
段 函 数 如 果H AVING 子 句 不 包 含 字 段 函 数 的 话 使 用 W H E R E
子 句 可 以 获 得 较 快 的 速 度[UNION [ALL] SELECT 命 令 ]




把
一 个 SELECT 语 句 的 最 后 查 询 结 果 同 另 一 个 SELECT 语 句 最 后
查 询 结 果 组合 起 来 默 认 情 况 下 UNION 检 查 组 合 的 结 果 并 排
除 重 复 的 行 要 组 合 多 个UNION 子 句 可 使 用 括 号
ALL 防
止 UNION 删 除 组 合 结 果 中 重 复 的 行
UNION
子 句 遵 守 下 列 规 则
不 能
使 用 UNION 来 组 合 子 查 询
两 个
SELECT 命 令 的 查 询 结 果 中 的 列 数 必 须 相 同
两 个
SELECT 查 询 结 果 中 的 对 应 列 必 须 有 相 同 的 数 据 类 型 和 宽
度



只
有 最 后 的 SELECT 中 可 以 包 含 ORDER BY 子 句 而 且 必 须 按 编 号
指 出 所输 出 的 列 如 果 包 含 了 一 个 ORDER B Y 子 句 它 将 影 响
整 个 结 果
ORDER BY Order_Item

根
据 列 的 数 据 对 查 询 结 果 进 行 排 序 每 个 O rder_Item 都 必
须 对 应 查 询 结 果 中的 一 列
它 可
以 是 下 列 之 一



F
R O M 子 句 中 表 的 字 段 同 时 也 是 SELECT 主 句 不 在 子 查 询 中
的 一 个 选择 项

一
个 数 值 表 达 式 表 示 查 询 结 果 中 列 的 位 置 最 左 边 列 编 号
为 1


ASC
指 定 查 询 结 果 根 据 排 序 项 以 升 序 排 列 它 是 ORDER B Y 的 默
认 选 项
DESC 指
定 查 询 结 果 以 降 序 排 列

如果不使用
ORDER BY 指定查询结果的排列顺序 则查询结果不排序
说 明





同其他
Visual FoxPro 命令一样 SELECT 是 Visual FoxPro 的一个内部 SQL
命令当使用 SELECT 进行查询时 Visual FoxPro 先解释查询要求
然后从表中查询并检索指定数据 可以在下列环境内建立 SELECT 查询
-
命 令 窗 口
-

一个 Visual FoxPro 程 序 与 使 用 其 他 Visual FoxPro 命 令 一 样
-
查 询 设 计 器


如果执行了
SET TALK ON 命令后再执行 SELECT 命令 则 Visual FoxPro
显示出执行查询所用的时间和查询结果中记录的数目 _TALLY
包含了查询结果中记录的数目
SET
FILTER 设置的筛选条件对 SELECT 命令不起作用




下面部分将多次提到子查询
(subquery) 子查询是指在 SELECT 命令中包含的SELECT 命令 在 SELECT
命令的 WHERE 子句中可以包含最多两个平级的 非嵌套 的子查询
子查询中可以有多个 连 接条件 (join conditions)

创建查询输出时
列的命名遵循如下规则
-

如果 选 择 项 是 具 有 唯 一 名 称 的 字 段 则 用 字 段 名 作 为 输 出 列 名
-

如果 多 个 选 择 项 具 有 相 同 名 称 例 如 如 果 名 为 Customer 的 表 有 一 个

STREET
字 段 而 名 为 Employees 的 表 也 有 一 个 STREET 字 段 则 输 出





列
命 名 为 Extension _A 和 Extension _B STREET_A 和 STREET_B
如果 选 择 项 名 称 有 10 字 符 长 可 以 将 名 称 截 短 后 再 加 下 划
线 和 字 母 例 如DEPARTMENT 变 为 DEPARTME_A

如
果 选 择 项 是 表 达 式 它 的 输 出 列 命 名 为 EXP_A 其 他 表 达 式 分 别 命 名 为


EXP_B
EXP_C 依 此 类 推


如
果 选 择 项 包 含 诸 如 COUNT 这 样 的 字 段 函 数 则 输 出 列 命 名 为



CNT_A
如 果 另 一 个 选 择 项 包 含 SUM
它 的 输 出 列 命 名 为 SUM_B
SELECT
子 句 中 的 用 户 自 定 义 函 数

在
SELECT 子句中使用用户自定义函数有明显优点 但使用时应考虑以下限制
-




SELECT 子 句 的 运 行 速 度 会 受 用 户 自 定 义 函 数 执 行 速 度 的 影 响 因 此 如果 使 用 户 自 定 义 函 数 的 操 作 量 很 大 则 这 些 函数 的 功 能 最 好 调 用 C 语 言 或汇编 语 言 编 写 的 API 或 用 户 自 定 义 函 数 来 完 成
-
在SELECT 激 活 的 用 户 自 定 义 函 数 中 很 难 预 测 Visual FoxPro 输 入 / 输 出






I/O
和 表 的 环 境 一 般 来 说 不 知 道 选 择 的 工 作 区 是 哪 一 个 不
知 道 当前 表 的 名 称 甚 至 不 知 道 正 在 处 理 的 字 段 名 这 些 变
量 的 值 完 全 取 决 于 用 户自 定 义 函 数 在 优 化 过 程 的 什 么 地
方 激 活
-



在 SELECT 子 句 调 用 的 用 户 自 定 义 函 数 中 修 改 Visual FoxPro I/O 或 表 的 环境 是 很 不 安 全 的 一 般 来 说 这 样 做的 结 果 难 以 预 料
-


从 SELECT 将 值 传 递 给 用 户自 定 函 数 唯 一 可 靠 的 方 法 是 激 活 用 户 自 定 义函 数 时 以 参 数 的 形 式 传 递
-



经 过 实 践 有 可 能 发 现 某 种 被认 为 是 违 法 的 操 作 在 某 种 FoxPro 版 本 中 运 行正 确 但 这 并 不 保 证 它 在 以 后 的 版 本 中 也 能 正 确 运 行


抛开这些限制不说
用户自定义函数在 SELECT 语句中还是可接受的 但 不 要 忘 记 使用 SELECT
可能要降低性能

下列字段函数可以与选定项一起使用
选定项可以是一个字段或包含字段的表达式
-

AV G (Select_Item ) 计 算 列 中 数 值 的 平 均 值
-


COUNT( Select_Item ) 计 算 列 中 选 定 项 的 数 目 计 算 查 询 输 出 的 行 数
-

MIN ( Select_Item ) 确 定 列 中 Select_Item 的 最 小 值
-

MA X ( Select_Item ) 确 定 列 中 Select_Item 的 最 大 值
-


SU M (Select_Item ) 计 算 列 中 数 值 的 和字 段 函 数 不 能 嵌 套 使 用
连 接 (Join)





Visual
FoxPro 支持 ANSI SQL '92 连接 (Join) 语法 通过比较两个或多个表中的字
段 将它们的记录连接到一起 生成查询 例如 内部连接 (inner join)
是将两个表中连接字段 (joined field) 值相同的记录选取到查询中 Visual
FoxPro 支持嵌套连接(nested joins)
重 要 事 项

创建连接条件时
请记住如下几点




如 果 在 查 询 中 包 括 两 个 表 又 没 有 指 定 连 接 条 件 那 么 第 一 个 表 中 每 一 个 记录 同 第 二 个 表 中 每 一 记 录 之 间 只 要 满 足筛 选 条 件 就 连 接 起 来 这 种 查 询
产 生
的 结 果 很 长








在
连 接 条 件 中 使 用 DELETED EOF FOUND RECCOUNT














和
RECNO 等 支 持 可 选 别 名 或 工 作 区 的 函 数 时 要 小 心 在 这 些函
数 中 包 括 别 名 或 工 作 区 可 能 导 致 不 可 预 料 的 结 果 SELECT
不 使 用 工 作区 它 执 行 与 USE ... AGAIN 相 同 的 操 作 在 不 带 可
选 别 名 和 工 作 区 的 情况 下 使 用 这 些 函 数 进 行 单 表 查 询 时
可 得 到 正 确 的 结 果 但 是 使 用 这 些 函数 进 行 多 表 查 询 时 即
使 不 带 可 选 别 名 或 工 作 区 也 可 能 得 到 一 些 莫 明 其 妙的 结
果




当 连 接 含 有 空 字 段 (empty field) 的 表 时 也 要 注 意 这 是 因 为 Visual FoxPro 匹 配 空 字 段 例 如 连 接 CUSTOMER.ZIP 和 INVOICE.ZIP 两 个 表 如 果CUSTOMER 表 中 的 100 条 记 录 中 没 有 给 出 邮 政 编 码 INVOICE 表 中 也 有


400
条 记 录 没 有 给 出 邮 政 编 码 那 么 查 询 结 果 中 将 会 由 于 空
字 段 的 匹 配 而 出现 40000 条 多 余 的 记 录 要 去 除 查 询 结 果 中
的 空 记 录 可 以 使 用 EMPTY


函 数





有
关 连 接 的 其 它 情 况 请 参 阅 M icrosoft Visual FoxPro 6.0 中 文 版
程 序 员 指 南第 八 章 创 建 视 图
示 例
以下 示例 说明了使用 SELECT – SQL 用户自定义函数的用法 :
示 例 1


示例
1 显示了 customer 表中所有的公司名称 来自一个表的一个字段
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT customer.company ;
FROM customer
示 例 2

示例
2 显示了来自两个表中三个字段的内容及两个表基于 cust_id 字段的连接
两个表均使用了本地别名
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT a.company, b.order_date, b.shipped_on ;
FROM customer a, orders b ;
WHERE a.cust_id = b.cust_id
示 例 3
示例 3
显示了在指定字段只有唯一数据的记录
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT DISTINCT a.company, b.order_date, b.shipped_on ;
FROM customer a, orders b ;
WHERE a.cust_id = b.cust_id
示 例 4

示例
4 以升序次序显示了 country postalcode 和 company 字段
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT country, postalcode, company ;
FROM customer ;
ORDER BY country, postalcode, company
示 例 5
示例 5
将来自两个表的字段内容存储在第三个表中
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT a.company, b.order_date, b.shipped_on ;
FROM customer a, orders b ; WHERE a.cust_id = b.cust_id ; INTO TABLE custship.dbf
BROWSE
示 例 6
示例 6
显示订单 (order) 日期早于 1994 年 2 月 16 日的记录
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT a.company, b.order_date, b.shipped_on ;
FROM customer a, orders b ;
WHERE a.cust_id = b.cust_id ;
AND b.order_date < {^1994-02-16}
示 例 7
示例 7
显示 customer 表中邮政编码与 orders 表的邮政编码相匹配的所有公司名
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT company FROM customer a WHERE ;
EXISTS (SELECT * FROM orders b WHERE a.postalcode = b.postalcode)
示 例 8

示例
8 显示 customer 表中公司名以大写的 C 开头 但长度未定的所有记录
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer a WHERE a.company LIKE "C%"
示 例 9
示例 9
显示 customer 表中国家名以大写的 U 开头其后跟着未知字母的所有记录
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT * FROM customer a WHERE a.country LIKE "U_"
示 例 10

示例
10 以大写方式 输出列为 CityList 显示所有城市名
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata')
SELECT UPPER(city) AS CityList FROM customer
示 例 11


示例
11 演示了您可以执行在包含百分比符号 (%) 数据上查询的方式
在百分比之前放置的反斜线 (\) 表示应该将百分比符号当作字符处理 而
ESCAPE 子句中的反斜线指定为转义字符

因为在
Visual FoxPro 的示例表中不包含百分比符号 所以查询没有返回结果
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata') SELECT * FROM customer;
WHERE company LIKE "%\%%" ESCAPE "\"
示 例 12


示例
12 演示了您可以执行在包含下划线符号 (_) 数据上查询的方式
在下划线之前放置的反斜线 (\) 表示应该将下划线符号当作字符处理 而
ESCAPE 子句中的反斜线指定为转义字符

因为在
Visual FoxPro 的示例表中不包含下划线符号 所以查询没有返回结果
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata') SELECT * FROM customer;
WHERE company LIKE "%\_%" ESCAPE "\"
示 例 13



在
示例 13 中 转义字符使用它自身的含义
短划线既是转义字符同时也是具有意义字符
查询返回公司名包含百分号后跟着短划线的所有行

因为在
Visual FoxPro 的示例表中不包含百分比符号 所以查询没有返回结果
CLOSE ALL
CLOSE DATABASES
OPEN DATABASE (HOME(2) + 'data\testdata') SELECT * FROM customer;
WHERE company LIKE "%-%--%" Escape "-"
请 参 阅
CREATE QUERY , CREATE TABLE – S Q L , INSERT – S Q L , MODIFY QUERY , SET ANSI , SET EXACT , SET PATH , _TALLY
