新手必看 SELECT--SQL语法 别乱提问了,先看看
<P>从一个或多个表中检索数据。SELECT SQL 命令是与其它 Visual FoxPro 一样的内置的 Visual FoxPro 命令。当你使用 SELECT 来生成查询时, Visual FoxPro 翻译查询并从表中获取指定数据。你可以从以下地方创建 SELECT 查询: </P><P>“命令”窗口中 <BR>带有其它任何 Visual FoxPro 命令的 Visual FoxPro 程序中 <BR>查询设计器中 <BR>SELECT [ALL | DISTINCT] [TOP nExpr [PERCENT]] [Alias.] Select_Item <BR> [[AS] Column_Name] [, [Alias.] Select_Item [[AS] Column_Name] ...] <BR> FROM [FORCE] [DatabaseName!] Table [[AS] Local_Alias] <BR> [ [INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN DatabaseName!] <BR> Table [[AS] Local_Alias] [ON JoinCondition ...]<BR> [[INTO Destination] | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] <BR> [PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT]<BR> [WHERE JoinCondition [AND JoinCondition ...] [AND | OR FilterCondition [AND | OR FilterCondition ...]]]<BR> [Group By GroupColumn [, GroupColumn ...]] [HAVING FilterCondition] [UNION [ALL] SELECTCommand] <BR> [Order By Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]]<BR>参数<BR>SELECT <BR>在 SELECT 子句中指定在查询结果中包含的字段、常量和表达式。 <BR>ALL <BR>查询结果中包含所有行 ( 包括重复值 )。ALL 是默认设置。 <BR>DISTINCT <BR>在查询结果中剔除重复的行。每一个 SELECT 子句只能使用一次 DISTINCT。 <BR>TOP nExpr [PERCENT] <BR>在符合查询条件的所有记录中,选取指定数量或百分比的记录。TOP 子句必须与 ORDER BY 子句同时使用。ORDER BY 子句指定查询结果中包含的列上由Top字句决定的行数, TOP 子句根据此排序选定最开始的 nExpr个或 nExpr% 的记录。</P>
<P>您可以指定选取 1 到 32767 个记录。使用 ORDER BY 子句指定的字段进行排序,会产生并列的情况,比如,可能有多个记录,它们在选定的字段上相同;所以,如果您指定 nExpr 为 10,在查询结果中可能多于 10 个记录,因为可能有几个记录位置并列。</P>
<P>如果包含 PERCENT 关键字指定查询结果中的记录数,得到记录数的可能是小数,这时进行取整。包含 PERCENT 关键字时,nExpr 的范围是 0.01 到 99.99。 </P>
<P>[Alias.] Select_Item <BR>限定匹配项的名称。Select_Item 指定的每一项在查询结果中都生成一列。一个项可以是以下一个 <BR>FROM 子句所包含的表中的字段名称。 <BR>一个常量,查询结果中每一行都出现这个常量值。 <BR>一个表达式,可以是用户自定义函数名。 <BR>关于使用用户定义函数的详细信息, 参见注释节中的带用户定义函数的 SELECT。</P>
<P>你用 Select_Item 指定的各项生成一个查询结果列。</P>
<P>如果两个或更多的项具有相同的名称, 在项名前包含表别名和一个句点来避免列重复。 </P>
<P>[AS] Column_Name <BR>为查询输出中的列指定显示名。Column_Name 可以是表达式但不能包含不允许的字符, 如, 字段名中的空格。 <BR>当 Select_Item 是一个表达式或包含一个字段函数而且你想给该列一个有意义的名字时该选项是有用的。 </P>
<P>FROM [FORCE] DatabaseName! <BR>列出所有从中检索数据的表。<BR>FORCE 指定连接表时按它们出现在 FROM 子句中的顺序。如果省略 FORCE, Visual FoxPro 会试图对查询进行优化。但是, 使用 FORCE 子句,避免了优化过程,可能加快查询执行的速度。 </P>
<P>当包含表的数据库不是当前数据库时,DatabaseName! 指定这个数据库的名称。如果数据库不是当前数据库,就必须指定包含表的数据库名称。应在数据库名称之后表名之前加上感叹号(!)分隔符。 </P>
<P>[[AS] Local_Alias] <BR>为 Table 中的表指定一个临时名称。如果指定了本地别名,那么在整个SELECT 语句中必须都用这个别名代替表名。本地别名不影响 Visual FoxPro环境。INNER JOIN 只有在其他表中包含对应记录(一个或多个)的记录才出现在查询结果中。 <BR>INNER JOIN 只有在其他表中包含对应记录(一个或多个)的记录才出现在查询结果中。</P>
<P>LEFT [OUTER] JOIN 在查询结果中包含:JOIN 左侧表中的所有记录,以及JOIN 右侧表中匹配的记录。OUTER 关键字可被省略;包含 OUTER 强调这是一个外连接 (outer join)。</P>
<P>RIGHT [OUTER] JOIN 在查询结果中包含:JOIN 右侧表中的所有记录,以及 JOIN 左侧表中匹配的记录。OUTER 关键字可被省略;包含 OUTER 强调这是一个外连接接 (outer join)。</P>
<P>FULL [OUTER] JOIN 在查询结果中包含:JOIN 两侧所有的匹配记录,和不匹配的记录;包含 OUTER 强调这是一个外连接 (outer join)。</P>
<P>关于连接的详细信息, 参见备注段中的 Joins。 </P>
<P>ON JoinCondition 指定连接条件。 </P>
<P>INTO Destination <BR>指定在何处保存查询结果。Destination 可以是下列子句之一: <BR>ARRAY ArrayName ,将查询结果保存到变量数组中。 <BR>如果查询结果中不包含任何记录,则不创建这个数组。 </P>
<P>CURSOR CursorName [NOFILTER | READWRITE] 将查询结果保存到临时表中。<BR>要创建一个查用于子查询中的游标, 用 NOFILTER。关于 NOFILTER 的详细信息, 参见备注节。</P>
<P>要指定游标是临时的和可修改的, 使用 READWRITE。如果源表或表使用 autoincrementing, 该设置不会被 READWRITE 游标继承。 </P>
<P>DBF | TABLE TableName [DATABASE DatabaseName [NAME LongTableName]] 保存查询结果到一个表中。 <BR>包含 DATABASE DatabaseName 以指定添加了表的数据库。 </P>
<P>包含 NAME LongTableName 可以为该表命一个最多可包括 128 个字符的并且可以在数据库中代替短名字的长名。 </P>
<P>如果没有包括 INTO 子句, 查询结果显示在一个“浏览”窗口中。也可以用 TO FILE 子句来定向查询结果到打印机或一个文件。 <BR></P> <P>TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN <BR>定向查询结果到打印机或一个文件。<BR>ADDITIVE 添加查询输出到 TO FILE FileName 中指定的已存在的文本文件内容中。</P>
<P>TO PRINTER 定向查询输出到一个打印机。在打印开始之前,使用可选的 PROMPT 子句显示一个对话框。您可以根据当前安装的打印机驱动程序调整打印机的设置。将 PROMPT 子句放置在紧跟 TO PRINTER 之后。 </P>
<P>TO SCREEN 使查询结果定向输出到 Visual FoxPro 主窗口或活动的用户自定义窗口中。 </P>
<P>PREFERENCE PreferenceName <BR>如果查询结果送往浏览窗口,就可以使用 PREFERENCE 保存浏览窗口的属性和选项以备后用。关于 PREFERENCE 功能的详细信息, 参见备注节。 <BR>NOCONSOLE <BR>不显示送到文件、打印机或 Visual FoxPro 主窗口的查询结果。 <BR>PLAIN <BR>防止列标题出现在显示的查询结果中。不管有无 TO 子句都可使用 PLAIN子句。如果 SELECT 语句中包括 INTO 子句,则忽略 PLAIN 子句。 <BR>NOWAIT <BR>打开浏览窗口并将查询结果输出到这个窗口后继续程序的执行。程序并不等待关闭浏览窗口,而是立即执行紧接在 SELECT 语句后面的程序行。关于如何使用 NOWAIT 的说明, 参见备注节。 <BR>WHERE JoinCondition <BR>指定 Visual FoxPro 的查询结果中只包括符合指定条件的记录。JoinCondition 指定位于 FROM 子句中的字段连接表。关于指定连接条件的详细信息, 参见备注节。<BR>WHERE 支持 JoinCondition 的 ESCAPE 操作符, 让你可以执行包含有百分号 (%) 和下划线 (_) 通配符的 SELECT SQL 命令查询。ESCAPE 允许你指定一个按原字样处理的 SELECT SQL 命令通配符。在 ESCAPE 子句中, 一旦一个字符被放到通配符字符之前,就表示这个通配符被看作一个文字字符。 </P>
<P>FilterCondition <BR>指定将包含在查询结果中记录必须符合的条件。使用 AND 或 OR 操作符,您可以包含随意数目的过滤条件。您还可以使用 NOT 操作符将逻辑表达式的值取反,或使用 EMPTY() 函数以检查空字段。<BR>SELECT SQL 命令在筛选条件中支持 "<field> IS / IS NOT NULL"。要学习如何使用 FilterCondition, 参见示例节。 </P>
<P>Group By GroupColumn [, GroupColumn ...] <BR>按列的值对查询结果的行进行分组。GroupColumn 可以是常规的表字段名,也可以是一个包含 SQL 字段函数的字段名,还可以是一个数值表达式,指定查询结果表中的列位置(最左边的列编号为 1 )。 <BR>HAVING FilterCondition <BR>指定包括在查询结果中的组必须满足的筛选条件。HAVING 应该同 GROUP BY一起使用。它能包含数量不限的筛选条件,筛选条件用 AND 或 OR 连接,还可以使用 NOT 来对逻辑表达式求反。可以在 HAVING 子句中使用本地别名和字段函数。 关于你可以使用的字段函数的详细信息, 参见备注节。FilterCondition 不能包含子查询。<BR>可以使用带 HAVING 子句的 Group By。使用 HAVING 子句的命令如果没有使用 GROUP BY 子句,则它的作用与WHERE 子句相同。如果 HAVING 子句不包含字段函数的话,使用 WHERE 子句可以获得较快的速度。</P>
<P>HAVING 子句应该出现在 INTO 子句前否则产生错误。 </P>
<P>[UNION [ALL] SELECTCommand] <BR>把一个 SELECT 语句的最后查询结果同另一个 SELECT 语句最后查询结果组合起来。默认情况下,UNION 检查组合的结果并排除重复的行。要组合多个UNION 子句,可使用括号。可以用 UNION 子句模拟一个外部联接。 <BR>ALL 防止 UNION 删除组合结果中重复的行。</P>
<P>当一个列是备注或通用型时, 不允许连接不同类型的列。</P>
<P>在 Visual FoxPro 8.0 以前的版本中, 当在两个不同类型的字段上执行 UNION 操作时你需要执行明确的转换。Visual FoxPro 现在对支持它的数据类型支持隐含数据类型转换。关于隐含数据类型转换和数据类型优先, UNION 子句允许的规则, 以及其它信息的详细内容, 参见备注节中的数据类型转换和优先。 </P>
<P>Order By Order_Item [ASC | DESC] <BR>根据列的数据对查询结果进行排序。每个 Order_Item 都必须对应查询结果中的一列。它可以是下列之一: <BR>FROM 子句中表的字段,同时也是 SELECT 主句(不在子查询中)的一个选择项。 <BR>一个数值表达式,表示查询结果中列的位置(最左边列编号为 1 )。 <BR>ASC 指定查询结果根据排序项以升序排列。它是 ORDER BY 的默认选项。 </P>
<P>DESC 指定查询结果以降序排列。 </P>
<P>备注<BR>在使用 FROM 子句时如果没有打开表, Visual FoxPro 显示“打开”对话框让你指定文件位置。一但打开后, 表在查询完成后仍然保持打开。 </P>
<P>当在 Destination 参数中使用 CURSOR 子句时, 如果你指定了一个打开的表的名字, Visual FoxPro 产生一条错误信息。在 SELECT 执行后, 临时游标保持打开并是活动的和只读的除非你指定了 READWRITE 选项。当你关闭该临时游标时, 它被删除。游标可以指定 SORTWORK 而成为存在于驱动器或卷上的临时文件。</P>
<P>当在 Destination 参数中使用 CURSOR 子句时, 你现在可以使用 NOFILTER 来创建一个可用于后来的查询的游标。在早期版本的 Visual FoxPro 中, 你需要包括一个额外的常数或表达式作为筛选。例如, 添加一个逻辑 true 作为筛选表达式来创建一个可用于后来的查询的查询:</P>
<P>SELECT *, .T. FROM customers INTO CURSOR myquery<BR>但是, 包括 NOFILTER 会降低查询性能因为要在磁盘上创建一个临时表。临时表在游标关闭时从磁盘上删除。</P>
<P>当在 Destination 参数中使用 DBF | TABLE 子句时, 如果你指定了一个已经打开的表, 而且 SET SAFETY 是设置为 OFF, Visual FoxPro 不警告地复写该表。如果你没有指定一个扩展名, Visual FoxPro 给表一个 .dbf 扩展名。在 SELECT 执行后表保持打开并且是活动的。</P>
<P>如果你在相同查询中包括 INTO 和 TO 子句, Visual FoxPro 忽略 TO 子句。如果你包括 TO 子句但没有包括 INTO 子句, 你可以定向查询结果到一个名为 FileName 的 ASCII 文本文件, 到打印机, 或到 Visual FoxPro 主窗口。</P>
<P>PREFERENCE 把特征, 属性或参数选项长期保存在 FoxUser.dbf 资源文件中。Preferences 可以在任何时候获取。第一次执行有 PREFERENCE Preference Name 的 SELECT 命令时创建参数选项。以后执行有相同参数选项名的 SELECT 命令时便将浏览窗口恢复到原来的参数选项状态。当浏览窗口关闭时,更新参数选项。如果您按下 CTRL+Q+W 键退出“浏览”窗口,您对“浏览”窗口所做的更改不会保存到资源文件中。</P>
<P>SELECT 命令中包括 TO SCREEN 可以把查询结果定向输出到 Visual FoxPro 主窗口或用户自定义窗口。如果显示时 Visual FoxPro 主窗口或用户自定义窗口中写满了一屏,就暂停输出。按任意键可以查看查询结果后面的内容。但是,如果命令中包括了 NOWAIT 子句,显示查询结果时就不会暂停,等待按键,而是在 Visual FoxPro 主窗口或用户自定义窗口中连续滚过所有内容。如果命令中包含有 INTO 子句,忽略 NOWAIT 子句。</P>
<P>在一个 SQL 查询的 WHERE 子句中包括 EVALUATE() 函数会返回不正确的数据。</P>
<P>如果包括一个以上的表在查询中, 你应该在第一个以后为每一个表指定一个连接条件。连接条件可以包含筛选条件。</P>
<P>注意 每一个 SELECT 语句的最大连接数是 9.<BR>必须用 AND 操作符来连接多个连接条件。各连接条件具有以下格式:</P>
<P>FieldName1 Comparison FieldName2</P>
<P>FieldName1 是一个表中的字段名, FieldName2 是另一个表中的字段名, Comparison 是以下一个操作符:</P>
<P>操作符 比较 <BR>= 等于 <BR>== 全等 <BR>LIKE SQL LIKE <BR><>, !=, # 不等于 <BR>> 大于 <BR>>= 大于或等于 <BR>< 小于 <BR><= 小于或等于 </P>
<P>当你在串中使用 = 操作符时, 它的动作根据 SET ANSI 的设置会不同。当 SET ANSI 设置为 OFF 时, Visual FoxPro 只比较串到较短串结束。当 SET ANSI 设置为 ON 时, Visual FoxPro 遵循 ANSI 标准的字符串比较。关于 Visual FoxPro 如果执行字符串比较的额外信息, 参见 SET ANSI 和 SET EXACT。</P>
<P>下列字段函数可以与选定项一起使用,选定项可以是一个字段或包含字段的表达式: </P>
<P>AVG(Select_Item), 计算列中数值的平均值。 <BR>COUNT(Select_Item), 计算列中选定项的数目。计算查询输出的行数。COUNT(*) 计算查询输出中的行数。 <BR>MIN(Select_Item), 确定列中 Select_Item 的最小值。 <BR>MAX(Select_Item), 确定列中 Select_Item 的最大值。 <BR>SUM(Select_Item), 计算列中数值的和。 <BR>字段函数不能嵌套使用。</P>
<P>UNION 子句遵守下列规则: </P>
<P>不能使用 UNION 来组合子查询。 <BR>两个 SELECT 命令的查询结果中的列数必须相同。 <BR>两个 SELECT 查询结果中的对应列必须有相同的数据类型和宽度。 <BR>只有最后的 SELECT 中可以包含 ORDER BY 子句,而且必须按编号指出所输出的列。如果包含了一个 ORDER BY 子句,它将影响整个结果。 <BR>当你用 UNION 连接查询中的两个表时, 仅匹配连接字段值的记录会出现在查询结果中。如果在父表中的记录在子表中没有相应的记录, 父表中的记录不会出现在查询结果中。一个外部联接允许你包括父表中的所有记录到输出结果中, 连同子表中的匹配记录一起。要在 Visual FoxPro 中创建一个外部联接, 你需要要使用一个嵌套的 SELECT 命令, 如下例所示:</P>
<P>SELECT customer.company, orders.order_id, orders.emp_id ;<BR> FROM customer, orders ;<BR> WHERE customer.cust_id = orders.cust_id ;<BR>UNION ;<BR> SELECT customer.company, 0, 0 ;<BR> FROM customer ;<BR> WHERE customer.cust_id NOT IN ;<BR> (SELECT orders.cust_id FROM orders)<BR>注意 确信在每一个分号前包括一个空格。否则, Visual FoxPro 产生一个错误。<BR>上例中, 在 UNION 子句前的部分的命令从两个表中选择具有匹配值的记录。不包括没有相关的发票的客户公司。命令中 UNION 子句后的部分选择客户表中的在订单表中无匹配记录的记录。</P>
<P>关于第二部分的命令, 注意以下几点: </P>
<P>包括在园括号中的 SELECT 语句首先处理。该语句的结果是选择订单表中的所有客户编号。 <BR>WHERE 子句找出 customer 表中的在 orders 表没有相关记录的所有客户编号。由于第一节中的命令提供了所在 orders 表中有客户编号的公司, Customer 表中的所有公司现在都包含在查询结果中了。 <BR>因为在 UNION 中的表的结构必须相同, 有两个占位符在第二个 SELECT 语句中来代表第一个 SELECT 语句中的 orders.order_id 和 orders.emp_id。 <BR>注意 占位符必须与它们所代表的字段有相同类型。如果字段是日期型, 占位符应该是 { / / }。如果字段是一个字符字段, 占位符应该是一个空串 ("")。<BR></P> <P>在特定情况下, 可能会发生自动数据转换, 如以下两个示例: </P>
<P>CREATE CURSOR table1 (field1 c(1))<BR>CREATE CURSOR table2 (field1 c(2))<BR>SELECT field1 来源于表1 UNION SELECT NVL(field1,' ') 来源于表2 </P>
<P>CREATE CURSOR table1 (field1 n(20,5))<BR>CREATE CURSOR table2 (field1 i)<BR>SELECT field1 来源于表1 UNION SELECT field1 来源于表2 <BR>如果你没有在 Order By 子句中指定排序, 查询结果显示为未排序。</P>
<P>当你发出 SET TALK ON 并执行 SELECT 时, Visual FoxPro 显示查询使用的时间和结果中的记录数。 _TALLY 包含了在查询结果中的记录数。</P>
<P>SET FILTER 设置的筛选条件对 SELECT 命令不起作用。</P>
<P>注意 下面部分提到的子查询, 是指在 SELECT 命令中包含的 SELECT 命令。子查询必须包括在园括号中。在 SELECT 命令的 WHERE 子句中可以包含最多两个平级的(非嵌套)的子查询。子查询中可以有多个连接条件 (join conditions)。<BR>在你创建查询输出时, 列的命名遵循如下规则: </P>
<P>如果选择项是具有唯一名称的字段,则用字段名作为输出列名。 <BR>如果多个选择项具有相同名称。例如,如果名为 Customer 的表有一个STREET 字段,而名为 Employees 的表也有一个 STREET 字段,则输出列命名为 Extension_A 和 Extension_B (STREET_A 和 STREET_B)。如果选择项名称有 10 字符长,可以将名称截短后再加下划线和字母。例如,DEPARTMENT 变为 DEPARTME_A。 <BR>如果选择项是表达式,它的输出列命名为 EXP_A。其他表达式分别命名为EXP_B、EXP_C,依此类推。 <BR>如果选择项包含诸如 COUNT() 这样的字段函数,则输出列命名为CNT_A。如果另一个选择项包含 SUM(),它的输出列命名为 SUM_B。 <BR>用户定义函数和 在 SELECT 子句中使用用户自定义函数有明显优点,但使用时应考虑以下限制: </P>
<P>SELECT 子句的运行速度会受用户自定义函数执行速度的影响。因此,如果使用户自定义函数的操作量很大,则这些函数的功能最好调用 C 语言或汇编语言编写的 API 或用户自定义函数来完成。 <BR>在 SELECT 激活的用户自定义函数中,很难预测 Visual FoxPro 输入/输出(I/O)和表的环境。一般来说,不知道选择的工作区是哪一个,不知道当前表的名称,甚至不知道正在处理的字段名。这些变量的值完全取决于用户自定义函数在优化过程的什么地方激活。 <BR>在 SELECT 子句调用的用户自定义函数中修改 Visual FoxPro I/O 或表的环境是很不安全的。一般来说,这样做的结果难以预料。 <BR>从 SELECT 将值传递给用户自定函数唯一可靠的方法,是激活用户自定义函数时以参数的形式传递。 <BR>经过实践,有可能发现某种被认为是违法的操作在某种 FoxPro 版本中运行正确,但这并不保证它在以后的版本中也能正确运行。 <BR>抛开这些限制不说,用户自定义函数在 SELECT 语句中还是可接受的。但不要忘记使用 SELECT 可能要降低性能。要学习如何在 SELECT 中使用用户定义函数, 参见示例节。</P>
<P>连接 Visual FoxPro 支持 ANSI SQL '92 连接 (Join) 语法,通过比较两个或多个表中的字段,将它们的记录连接到一起,生成查询。例如,内部连接 (inner join) 是将两个表中连接字段 (joined field) 值相同的记录选取到查询中。Visual FoxPro 支持嵌套连接(nested joins)</P>
<P>由于 SQL 是派生于数学集合理论, 各表可以代表一个环。指定连接条件的 ON 子句确定交接点, 它代表匹配的行集合。对于一个内部联接, 交接发生在两个环的内部或 "inner" 部分。一个外联接不仅仅包括这些表内部的交叉区域匹配的行, 也包括环的外面的左或右部的交集的行。</P>
<P>注意 创建连接条件时,请记住如下几点:<BR>如果在查询中包括两个表,又没有指定连接条件,那么第一个表中每一个记录同第二个表中每一记录之间,只要满足筛选条件,就连接起来。这种查询产生的结果很长。 <BR>在连接条件中使用 DELETED(),EOF(),FOUND(),RECCOUNT(),和 RECNO() 等支持可选别名或工作区的函数时要小心。在这些函数中包括别名或工作区可能导致不可预料的结果。SELECT 不使用工作区,它执行与 USE ... AGAIN 相同的操作。在不带可选别名和工作区的情况下使用这些函数进行单表查询时,可得到正确的结果。但是,使用这些函数进行多表查询时,即使不带可选别名或工作区,也可能得到一些莫明其妙的结果。 <BR>连接含有空字段 (empty field) 的表时也要注意。这是因为 Visual FoxPro匹配空字段。例如,连接 CUSTOMER.ZIP 和 INVOICE.ZIP 两个表。如果CUSTOMER 表中的 100 条记录中没有给出邮政编码,INVOICE 表中也有400 条记录没有给出邮政编码,那么查询结果中将会由于空字段的匹配而出现 40000 条多余的记录。要去除查询结果中的空记录,可以使用 EMPTY() 函数。 <BR>每一个 SELECT 语句可以使用的连接数的限制是 9 个。 <BR>有关连接的其它情况,请参阅 创建视图 中的 定义多个连接条件。</P>
<P>数据类型转换和优先 明确的数据类型转换要求你使用 Visual FoxPro 的转换函数, 如 CTOD(), 而隐含的转换不要求你使用这些转换函数。Visual FoxPro 支持对它所支持的数据类型进行隐含的数据类型转换。下表是 Visual FoxPro 表数据类型所允许的所有明确的和隐含的数据类型转换:</P>
<P>数据类型 隐含转换 明确转换 <BR>字符 字符 (二进制) CTOD(), CTOT(), VAL(), CTOBIN() <BR>字符 (二进制) <BR>货币 MTON() <BR>日期 日期时间 DTOC(), DTOS(), DTOT() <BR>日期时间 TTOC(), TTOD() <BR>双精度 STR(), VAL() <BR>浮点 数值 NTOM(), STR(), INT() <BR>整型 数值, 浮点, 双精度, 货币 BINTOC() <BR>逻辑 <BR>数值 浮点 NTOM(), STR(), INT() </P>
<P>下表指明 SELECT...UNION 操作两个字段时的隐含的转换结果:</P>
<P>数据类型 1 数据类型 2 期待的数据类型 <BR>字符 (N) 字符 (X) 字符 (MAX(N,X)) <BR>字符 (N) 字符 二进制 (X) 字符 二进制 (MAX(N,X)) <BR>字符 (N) 备注 备注 <BR>字符 二进制 (N) 字符 二进制 (X) 字符 二进制 (MAX(N,X)) <BR>字符 二进制 (N) 备注 备注 <BR>货币 货币 货币 <BR>日期 日期 日期 <BR>日期 日期时间 日期时间 <BR>日期时间 日期时间 日期时间 <BR>双精度 (N) 浮点 (X,Y) 浮点 (MAX(MAX(8,Y),2)) <BR>双精度 (N) 整型 双精度 (N) <BR>双精度 (N) 数值 (X,Y) 双精度 (MAX(MAX(8,Y),2)) <BR>双精度 (X) 双精度 (Y) 双精度 (MAX(X,Y)) <BR>浮点 (N,M) 双精度 (X) 浮点 (20, MAX(M,X)) <BR>浮点 (N,M) 浮点 (X,Y) 浮点 (MAX(N,M), MAX(X,Y)) <BR>浮点 (N,M) 数值 (X,Y) 浮点 (MAX (N,X), MAX(M,Y)) <BR>整型 货币 货币 <BR>整型 双精度 (X) 双精度 (X) <BR>整型 浮点 (X,Y) 浮点 (MAX(11,X), Y) <BR>整型 整型 整型 <BR>整型 数值 (X,Y) 数值 (MAX(11,X), Y) <BR>逻辑 逻辑 逻辑 <BR>数值 (N,M) 双精度 (X) 数值 (20, MAX(M,X)) <BR>数值 (N,M) 浮点 (X,Y) 浮点 (MAX(N,X), MAX(M,Y)) <BR>数值 (N,M) 数值 (X,Y) 数值 (MAX(N,X), MAX(M,Y)) </P>
<P>当 Visual FoxPro 在 SELECT...UNION 操作中组合两个不同类型的列时, 低精度的数据类型转换为高精度的数据类型。下面从最高到最低列出数据精度: </P>
<P>日期时间 <BR>日期 <BR>双精度 <BR>货币 <BR>数值/浮点 <BR>整型 <BR>备注(二进制) <BR>备注 <BR>字符(二进制) <BR>字符 <BR>逻辑 <BR>通用 <BR>注意 这些值代表一般数据类型精度并仅适用于两种类型间的隐含的或明确的转换尚不存在时。<BR>对于字段属性, NULL 精度高于 NOT NULL。 </P>
示例<BR>下例说明 FilterCondition 参数可以使用多种格式:<BR>示例 1<BR>示例 1 以 FieldName1 Comparison FieldName2 格式显示 FilterCondition:<BR>customer.cust_id = orders.cust_id<BR>示例 2<BR>示例 2 以 FieldName Comparison Expression 格式显示 FilterCondition:<BR>payments.amount >= 1000<BR>示例 3<BR>示例 3 以 FieldName Comparison ALL (Subquery) 格式显示 FilterCondition。当筛选条件包括 ALL 时, 在记录被包含进查询结果前, 字段的所有值必须符合由子查询生成的比较条件。<BR>company < ALL (SELECT company FROM customer WHERE country = "UK")<BR>示例 4<BR>示例 4 以 FieldName Comparison ANY | SOME (Subquery) 格式显示 FilterCondition。当筛选条件包括 ANY 或 SOME 时, 字符至少有一个值必须符合由子查询生成的比较条件。<BR>company < ANY (SELECT company FROM customer WHERE country = "UK")<BR>示例 5<BR>示例 5 以 FieldName [NOT] BETWEEN Start_Range AND End_Range 格式显示 FilterCondition。该示例检查是否字段值在指定的范围内。<BR>customer.postalcode BETWEEN 90000 AND 99999<BR>示例 6<BR>示例 6 以 [NOT] EXISTS (Subquery) 格式显示 FilterCondition。该示例检查是否至少有一个行符合子查询的条件。当筛选条件包括 EXISTS 时, 筛选条件求值为真 (.T.) 除非子查询求值为一个空集。<BR>EXISTS ; <BR>(SELECT * FROM orders WHERE customer.postalcode = orders.postalcode)<BR>示例 7<BR>示例 7 以 FieldName [NOT] IN Value_Set 格式显示 FilterCondition。当筛选条件包括 IN 时, 在字段进入查询结果前, 字段必须包含一个值.<BR>customer.postalcode NOT IN ("98052","98072","98034")<BR>注意 在值集合中最多可以包括 24 个项。如果集合中包含了过多的项, SELECT-SQL 语句将因结果太复杂而失败。<BR>示例 8<BR>示例 8 以FieldName [NOT] IN (Subquery) 格式显示 FilterCondition。这里, 在记录出现在查询结果中之前字段必须包含一个由子查询返回的值。<BR>customer.cust_id IN ; <BR>(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")<BR>示例 9<BR>示例 9 以 FieldName [NOT] LIKE cExpression 格式显示 FilterCondition。<BR>customer.country NOT LIKE "UK"<BR>这些筛选条件搜索匹配 cExpression 的各字段。可以用百分号 (%) 和下划线 (_) 通配符作为 cExpression 的一部分。百分号代表串中任何长度的不知道的字符。下划线代表串中的单个的不知道的字符。<BR>以下示例说明如何在 SELECT SQL 命令中使用用户定义函数:<BR>示例 1<BR>示例 1 显示了 customer 表中所有的公司名称(来自一个表的一个字段)。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT customer.company ;<BR> FROM customer<BR>示例 2<BR>示例 2 显示两个表中的三个字段的内容并根据 cust_id 字段连接表。它使用两个表的本地别名。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT x.company, y.order_date, y.shipped_on ;<BR> FROM customer x<BR> INNER JOIN orders y ON x.cust_id = y.cust_id<BR>示例 3<BR>示例 3 显示了在指定字段只有唯一数据的记录。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT DISTINCT x.company, y.order_date, y.shipped_on ;<BR> FROM customer x, orders y ;<BR> WHERE x.cust_id = y.cust_id<BR>示例 4<BR>示例 4 以升序次序显示了 country、postalcode 和 company 字段。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT country, postalcode, company ;<BR> FROM customer ;<BR> Order By country, postalcode, company<BR>示例 5<BR>示例 5 将来自两个表的字段内容存储在第三个表中。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT x.company, y.order_date, y.shipped_on ;<BR> FROM customer x, orders y ;<BR> WHERE x.cust_id = y.cust_id ;<BR> INTO TABLE custship.dbf<BR>BROWSE<BR>示例 6<BR>示例 6 显示订单 (order) 日期早于 1994 年 2 月 16 日的记录。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT x.company, y.order_date, y.shipped_on ;<BR> FROM customer x, orders y ;<BR> WHERE x.cust_id = y.cust_id ;<BR> AND y.order_date < {^1994-02-16}<BR>示例 7<BR>示例 7 显示订货日期早于 02/16/1994 的所有客户。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT x.company, y.order_date, y.shipped_on ;<BR> FROM customer x<BR> LEFT JOIN orders y ;<BR> ON x.cust_id = y.cust_id <BR> AND y.order_date < {^1994-02-16}<BR>示例 8<BR>示例 8 显示 customer 表中邮政编码与 orders 表的邮政编码相匹配的所有公司名。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT company FROM customer x WHERE ;<BR> EXISTS (SELECT * FROM orders y WHERE x.postalcode = y.postalcode)<BR>示例 9<BR>示例 9 显示 customer 表中公司名以大写的 C 开头,但长度未定的所有记录。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT * FROM customer x WHERE x.company LIKE "C%"<BR>示例 10<BR>示例 10 显示 customer 表中国家名以大写的 U 开头其后跟着未知字母的所有记录。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT * FROM customer x WHERE x.country LIKE "U_"<BR>示例 11<BR>示例 11 以大写方式,输出列为 citylist 显示所有城市名。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT UPPER(city) AS CityList FROM customer<BR>示例 12<BR>示例 12 演示了您可以执行在包含百分比符号 (%) 数据上查询的方式。在百分比之前放置的反斜线 (\) 表示应该将百分比符号当作字符处理,而 ESCAPE 子句中的反斜线指定为转义字符。<BR>因为在 Visual FoxPro 的示例表中不包含百分比符号,所以查询没有返回结果。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT * FROM customer;<BR>WHERE company LIKE "%\%%" ESCAPE "\"<BR>示例 13<BR>示例 13 演示了您可以执行在包含下划线符号 (_) 数据上查询的方式。在下划线之前放置的反斜线 (\) 表示应该将下划线符号当作字符处理,而 ESCAPE 子句中的反斜线指定为转义字符。<BR>因为在 Visual FoxPro 的示例表中不包含下划线符号,所以查询没有返回结果。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT * FROM customer;<BR>WHERE company LIKE "%\_%" ESCAPE "\"<BR>示例 14<BR>在示例 14 中,转义字符使用它自身的含义。短划线既是转义字符同时也是具有意义字符。查询返回公司名包含百分号后跟着短划线的所有行。<BR>因为在 Visual FoxPro 的示例表中不包含百分比符号,所以查询没有返回结果。<BR>CLOSE ALL<BR>CLOSE DATABASES<BR>OPEN DATABASE (HOME(2) + 'data\testdata')<BR>SELECT * FROM customer;<BR>WHERE company LIKE "%-%--%" Escape "-"<BR> <P>很多啊,眼花了</P> SELECT==SQL是基本的东西,功能很强大,必须懂的 我用sele dist 分类 from 表1 order by 编号<BR><BR>在VFP6.0正常使用,而在VFP9.0出错,不知是什么原因? VFP9的SELECT--SQL语句有些变化,在你的主程序中加入SET ENGINEBEHAVIOR 70试一下 真的可以了。查了资料才知道VFP9.0的SQL可设置成兼容7.0和8.0。谢谢!<BR>[em17] <P>这个图<br></P>
[align=right][color=#000066][此贴子已经被作者于2006-8-13 20:07:30编辑过][/color][/align]
SELECT我只懂得一点点对于斑竹说的这些,看得眼睛都看花了还是不怎么明白.能不能说得简单一点. 谢谢斑主。但确实看着犯晕,[em03]。不过我已打印出来,对比着学习。 <P>谢谢</P> <P>[em01]谢谢!!!</P> <P> 还需努力继续学习那,谢谢了</P> <P>thank you very much.you are a good man....</P> <P>曾学过SQL 但没学很深 貌似BZ的都看了不是很懂 自己要努力了</P> <P>正在努力,看见珍贵的资料,喜欢![em01]</P> 太详细了 最好是把这些打包一下,然后再上传上来!
页:
[1]
2
