SELECT - SQL 命令

从一个或多个表检索数据。

Visual FoxPro ODBC 驱动程序支持此命令的本机 Visual FoxPro 语言语法。 有关特定于驱动程序的信息,请参阅 驱动程序备注

语法

  
SELECT [ALL | DISTINCT]  
   [Alias.] Select_Item [AS Column_Name]  
   [, [Alias.] Select_Item [AS Column_Name] ...]   
FROM [DatabaseName!]Table [Local_Alias]  
   [, [DatabaseName!]Table [Local_Alias] ...]   
[WHERE 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,必须用括号括起来。 在同一级别最多可以有两个子查询, (WHERE 子句中不嵌套) 。 (请参阅 arguments.) 子查询的该部分可以包含多个联接条件。

[ALL |DISTINCT] [Alias.] Select_Item [AS Column_Name] [, [Alias.] Select_Item [AS Column_Name] ...]
SELECT 子句指定查询结果中显示的字段、常量和表达式。

默认情况下,ALL 显示查询结果中的所有行。

DISTINCT 从查询结果中排除任何行的重复项。

注意

每个 SELECT 子句只能使用 DISTINCT 一次。

Alias。 限定匹配的项名称。 使用 Select_Item 指定的每个项都会生成查询结果的一列。 如果两个或更多项具有相同的名称,请包括表别名和项名称前的句点,以防止列重复。

Select_Item 指定要包含在查询结果中的项。 项可以是下列项之一:

  • FROM 子句中表中字段的名称。

  • 一个常量,指定相同的常量值将显示在查询结果的每一行中。

  • 一个表达式,可以是用户定义函数的名称。

使用 SELECT 的用户定义函数

尽管在 SELECT 子句中使用用户定义的函数有明显的好处,但还应考虑以下限制:

  • 使用 SELECT 执行的操作的速度可能会受到此类用户定义函数的执行速度的限制。 使用 API 和以 C 或汇编语言编写的用户定义函数可以更好地完成涉及用户定义的函数的大容量操作。

  • 将值传递给从 SELECT 调用的用户定义函数的唯一可靠方法是在调用函数时传递给函数的参数列表。

  • 即使你试验并发现了在 FoxPro 的某个版本中正常运行的所谓禁止操作,也不能保证它在更高版本中继续工作。

除了这些限制外,SELECT 子句中还接受用户定义的函数。 但请记住,使用 SELECT 可能会降低性能。

以下字段函数可用于作为字段或涉及字段的表达式的选定项:

  • AVG (Select_Item) - 计算数值数据列的平均值。

  • COUNT (Select_Item) 对列中选择项的数目进行计数。 COUNT (*) 对查询输出中的行数进行计数。

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

  • MAX (Select_Item) - 确定列中 Select_Item 的最大值。

  • SUM (Select_Item) - 汇总一列数值数据。

不能嵌套字段函数。

AS Column_Name
指定查询输出中列的标题。 当 Select_Item 是表达式或包含字段函数,并且你想要为列指定有意义的名称时,这非常有用。 Column_Name 可以是表达式,但不能包含 (例如,表字段名称中不允许的空格) 字符。

FROM [DatabaseName!] [Local_Alias] [, [DatabaseName!] [Local_Alias] ...]
Lists包含查询检索的数据的表。 如果没有打开表,Visual FoxPro 将显示“ 打开 ”对话框,以便您可以指定文件位置。 打开表后,查询完成后,表将保持打开状态。

DatabaseName! 指定数据库的名称,而不是使用数据源指定的数据库的名称。 如果未使用数据源指定数据库,则必须包含表的数据库的名称。 在数据库名称后和表名之前添加感叹号 (!) 分隔符。

Local_Alias指定表中名为 的表的临时名称。 如果指定本地别名,则必须在整个 SELECT 语句中使用本地别名而不是表名。 本地别名不会影响 Visual FoxPro 环境。

WHERE JoinCondition [AND JoinCondition ...][AND |OR FilterCondition [AND |OR FilterCondition ...]]
指示 Visual FoxPro 在查询结果中仅包含某些记录。 需要 WHERE 才能从多个表检索数据。

JoinCondition 指定链接 FROM 子句中的表的字段。 如果在查询中包含多个表,则应在第一个表之后为每个表指定联接条件。

重要

创建联接条件时,请考虑以下信息:

  • 如果在查询中包含两个表,但未指定联接条件,则只要满足筛选条件,第一个表中的每条记录就会联接到第二个表中的每条记录。 此类查询可能会生成冗长的结果。

  • 联接包含空字段的表时要小心,因为 Visual FoxPro 与空字段匹配。 例如,如果在 CUSTOMER.ZIP 和 INVOICE.ZIP 联接,并且 CUSTOMER 包含 100 个空邮政编码,而 INVOICE 包含 400 个空邮政编码,则查询输出将包含 40,000 条由空字段生成的额外记录。 使用 EMPTY ( ) 函数从查询输出中消除空记录。

  • 必须使用 AND 运算符来连接多个联接条件。 每个联接条件具有以下形式:

    FieldName1 比较 FieldName2

    FieldName1 是一个表中字段的名称, FieldName2 是另一个表中字段的名称, Comparison 是下表中描述的运算符之一。

运算符 比较
= 等于
== 完全相等
LIKE SQL LIKE
<>, !=,# 不等于
> 超过
>= 大于或等于
< 小于
<= 小于或等于

将 = 运算符与字符串一起使用时,其行为会有所不同,具体取决于 SET ANSI 的设置。 当 SET ANSI 设置为 OFF 时,Visual FoxPro 会以 Xbase 用户熟悉的方式处理字符串比较。 当 SET ANSI 设置为 ON 时,Visual FoxPro 遵循 ANSI 标准进行字符串比较。 有关 Visual FoxPro 如何执行字符串比较的详细信息,请参阅 SET ANSISET EXACT

FilterCondition 指定记录必须满足的条件才能包含在查询结果中。 可以在查询中包含任意数量的筛选条件,并使用 AND 或 OR 运算符连接它们。 还可以使用 NOT 运算符反转逻辑表达式的值,也可以使用 EMPTY ( ) 为空字段检查。 FilterCondition 可以采用以下示例中的任何形式:

示例 1FieldName1 比较 FieldName2

customer.cust_id = orders.cust_id

示例 2FieldName 比较表达式

payments.amount >= 1000

示例 3fieldName 比较 所有 (子查询)

company < ALL ;

(SELECT company FROM customer WHERE country = "USA")

当筛选条件包含 ALL 时,字段必须满足子查询生成的所有值的比较条件,然后才能将其记录包含在查询结果中。

示例 4FieldName 比较 ANY |某些 (子查询)

company < ANY ;

(SELECT company FROM customer WHERE country = "USA")

当筛选条件包括 ANY 或 SOME 时,字段必须满足子查询生成的至少一个值的比较条件。

以下示例检查字段中的值是否在指定的值范围内:

示例 5FieldName [NOT] 在Start_RangeEnd_Range之间

customer.postalcode BETWEEN 90000 AND 99999

以下示例检查是否至少有一行符合子查询中的条件。 当筛选条件包含 EXISTS 时,除非子查询的计算结果为空集,否则筛选条件的计算结果为 True (.T.) 。

示例 6 [NOT] EXISTS (子查询)

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

示例 7FieldName [NOT] IN Value_Set

customer.postalcode NOT IN ("98052","98072","98034")

当筛选条件包含 IN 时,字段必须包含其中一个值,然后才能将其记录包含在查询结果中。

示例 8FieldName [NOT] IN (Subquery)

customer.cust_id IN ;

(SELECT orders.cust_id FROM orders WHERE orders.city="Seattle")

此处,字段必须包含子查询返回的值之一,然后子查询的记录才会包含在查询结果中。

示例 9FieldName [NOT] LIKE cExpression

customer.country NOT LIKE "USA"

此筛选条件搜索与 cExpression 匹配的每个字段。 可以将百分号 (%) 和下划线 ( _ ) 通配符用作 cExpression 的一部分。 下划线表示字符串中的单个未知字符。

GROUP BY GroupColumn [, GroupColumn ...]
根据一列或多列中的值对查询中的行进行分组。 GroupColumn 可以是以下选项之一:

  • 常规表字段的名称。

  • 包含 SQL 字段函数的字段。

  • 指示列在结果表中的位置的数值表达式。 (最左边的列号是 1.)

HAVING FilterCondition
指定组必须满足的筛选条件才能包含在查询结果中。 HAVING 应与 GROUP BY 一起使用,并且可以包含任意数量的筛选条件,由 AND 或 OR 运算符连接。 还可以使用 NOT 来反转逻辑表达式的值。

FilterCondition 不能包含子查询。

不带 GROUP BY 子句的 HAVING 子句的行为类似于 WHERE 子句。 可以在 HAVING 子句中使用本地别名和字段函数。 如果 HAVING 子句不包含字段函数,请使用 WHERE 子句提高性能。

[UNION [ALL] SELECTCommand]
将一个 SELECT 的最终结果与另一个 SELECT 的最终结果组合在一起。 默认情况下,UNION 会检查合并的结果并消除重复行。 使用括号合并多个 UNION 子句。

ALL 可防止 UNION 从组合结果中消除重复行。

UNION 子句遵循以下规则:

  • 不能使用 UNION 来合并子查询。

  • 两个 SELECT 命令在其查询输出中必须具有相同的列数。

  • 一个 SELECT 的查询结果中的每个列的数据类型和宽度必须与另一个 SELECT 中的相应列相同。

  • 只有最终的 SELECT 可以具有 ORDER BY 子句,该子句必须按数字引用输出列。 如果包含 ORDER BY 子句,它将影响完整结果。

还可以使用 UNION 子句来模拟外部联接。

在查询中联接两个表时,只有联接字段中具有匹配值的记录才会包含在输出中。 如果父表中的记录在子表中没有相应的记录,则父表中的记录不会包含在输出中。 外部联接允许在输出中包含父表中的所有记录,以及子表中的匹配记录。 若要在 Visual FoxPro 中创建外部联接,必须使用嵌套 SELECT 命令,如以下示例所示:

SELECT customer.company, orders.order_id, orders.emp_id ;  
FROM customer, orders ;  
WHERE customer.cust_id = orders.cust_id ;  
UNION ;  
SELECT customer.company, 0, 0 ;  
FROM customer ;  
WHERE customer.cust_id NOT IN ;  
(SELECT orders.cust_id FROM orders)  

注意

请确保包含紧靠每个分号前面的空格。 否则,将收到错误。

UNION 子句之前的 命令部分从两个表中选择具有匹配值的记录。 不包括没有关联发票的客户公司。 UNION 子句后面的 命令部分选择客户表中在 orders 表中没有匹配记录的记录。

关于命令的第二部分,请注意以下事项:

  • 首先处理括号中的 SELECT 语句。 此语句在订单表中创建所有客户编号的选择。

  • WHERE 子句查找客户表中不在订单表中的所有客户编号。 由于命令的第一部分提供了订单表中具有客户编号的所有公司,因此客户表中的所有公司现在都包含在查询结果中。

  • 由于 UNION 中包含的表的结构必须相同,因此第二个 SELECT 语句中有两个占位符表示第一个 SELECT 语句 的orders.order_idorders.emp_id

    注意

    占位符的类型必须与它们所表示的字段的类型相同。 如果字段是日期类型,则占位符应为 { / / }。 如果字段是字符字段,则占位符应为空字符串 (“”) 。

ORDER BY Order_Item [ASC |DESC] [, Order_Item [ASC |DESC] ...]
根据一列或多列中的数据对查询结果进行排序。 每个 Order_Item 都必须对应于查询结果中的列,并且可以是以下项之一:

  • FROM 表中的字段,该字段也是main SELECT 子句中的选择项, (子查询) 。

  • 指示列在结果表中的位置的数值表达式。 (最左侧的列是数字 1.)

ASC 根据一个或多个订单项指定查询结果的升序,是 ORDER BY 的默认值。

DESC 指定查询结果的降序。

如果未使用 ORDER BY 指定订单,则查询结果显示为无序。

注解

SELECT 是内置于 Visual FoxPro 中的 SQL 命令,就像任何其他 Visual FoxPro 命令一样。 使用 SELECT 来构成查询时,Visual FoxPro 会解释查询并从表中检索指定的数据。 可以从命令提示符窗口或 Visual FoxPro 程序 (创建 SELECT 查询,就像任何其他 Visual FoxPro 命令) 一样。

注意

SELECT 不遵循使用 SET FILTER 指定的当前筛选条件。

驱动程序备注

当应用程序将 ODBC SQL 语句 SELECT 发送到数据源时,Visual FoxPro ODBC 驱动程序会将命令转换为 Visual FoxPro SELECT 命令,而无需转换,除非命令包含 ODBC 转义序列。 包含在 ODBC 转义序列中的项将转换为 Visual FoxPro 语法。 有关使用 ODBC 转义序列的详细信息,请参阅 时间和日期函数 ;在 Microsoft ODBC 程序员参考中,请参阅 ODBC 中的转义序列

另请参阅

CREATE TABLE - SQL
INSERT - SQL
SET ANSI
SET EXACT