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 子句中,最多可以有两个位于同一级别(未嵌套)的子查询。 (请参阅参数的该部分。子查询可以包含多个联接条件。

[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 执行的操作速度可能受执行此类用户定义函数的速度的限制。 使用用 C 或程序集语言编写的 API 和用户定义的函数可以更好地完成涉及用户定义函数的高批量操作。

  • 将值传递给从 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] ...]
列出包含查询检索的数据的表。 如果未打开任何表,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 是另一个表中的字段的名称, 比较 是下表中所述的运算符之一。

操作员 比较
= Equal
== 完全相等
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 可以采用以下示例中的任何窗体:

示例 1 FieldName1 比较 FieldName2

customer.cust_id = orders.cust_id

示例 2 FieldName 比较表达式

payments.amount >= 1000

示例 3 FieldName Comparison ALL (子查询

company < ALL ;

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

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

示例 4 FieldName Comparison ANY |SOME (子查询

company < ANY ;

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

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

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

示例 5 FieldName [NOT] BETWEEN Start_RangeEnd_Range

customer.postalcode BETWEEN 90000 AND 99999

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

示例 6 [NOT] EXISTS (子查询

EXISTS ;

(SELECT * FROM orders WHERE customer.postalcode =

orders.postalcode)

示例 7 FieldName [NOT] IN Value_Set

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

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

示例 8 FieldName [NOT] IN (子查询

customer.cust_id IN ;

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

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

示例 9 FieldName [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 子句后面的命令部分选择客户表中没有匹配记录的客户表中的记录。

有关命令的第二部分,请注意以下几点:

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

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

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

    注意

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

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

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

  • 一个数值表达式,指示结果表中列的位置。 (最左边的列是数字 1。

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

DESC 指定查询结果的降序。

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

注解

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

注意

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

驱动程序备注

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

另请参阅

CREATE TABLE - SQL
INSERT - SQL
SET ANSI
SET EXACT