第四章:检索数据

在需要迅速获得答案时,可以使用 Visual FoxPro 的“查询设计器”来检索存储在表和视图中的信息。例如,您可能想知道以下问题的答案:

使用“查询设计器”可以搜索那些满足指定条件的记录,也可以根据需要对这些记录排序和分组,并根据查询结果创建报表、表及图形。

本章介绍如何创建和使用基于表(.dbf 文件)或视图的简单的只读查询。有关使用多表本地查询或远程数据的内容,请参阅第六章“查询和更新多表”。有关创建视图的详细内容,请参阅第五章“使用视图更新数据”

本章要点:

创建查询

在很多情况下都需要建立查询,例如为报表组织信息、即时回答问题或者查看数据中的相关子集。无论目的是什么,建立查询的基本过程是相同的。

利用“查询设计器”,首先选择想从中获取信息的表或视图,指定从这些表或视图中提取记录的条件,然后按照想得到的输出类型定向查询结果,诸如浏览、报表、表、标签等等。若要保存创建的查询,可以给它指定一个名称,将查询文件保存为带 .qpr 扩展名的文件。

查询的设计过程

当确定了要查找的信息,以及这些信息存贮在哪些表和视图中后,可以通过以下几个步骤来建立查询:

  1. 使用“查询向导”或“查询设计器”开始建立查询。

  2. 选择出现在查询结果中的字段。

  3. 设置选择条件来查找可给出所需结果的记录。

  4. 设置排序或分组选项来组织查询结果。

  5. 选择查询结果的输入类型:表、报表、浏览等等。

  6. 运行查询。

利用“查询向导”

若要快速创建查询,可以利用 Visual FoxPro“查询向导”。“查询向导”将询问您从哪些表或视图中搜索信息,并根据您对一系列提问的回答来建立查询。

有关“查询向导”的详细内容,只要在使用向导时按 F1 键就可以获得联机帮助。

若要用向导建立查询

  1. 在“项目管理器”中选择“数据”选项卡,然后选择“查询”。

  2. 选择“新建”。

  3. 选择“查询向导”按钮。

  4. 选择所建查询的类型。

  5. 按照向导屏幕上的指令进行操作。

您也可以从“工具”菜单中选择“向导”命令来启动向导。

启动“查询设计器”

如果不想使用“查询向导”,可以使用“查询设计器”建立查询。从“项目管理器”或“文件”菜单中,都可以启动“查询设计器”。

若要启动“查询设计器”

  1. 在“项目管理器”中选择“数据”选项卡。

  2. 选择“查询”。

  3. 选择“新建”。

  4. 选择“新建查询”。

您也可以从“文件”菜单中选择“新建”来启动“查询设计器”,选择“查询”选项,然后选择“新建文件”。

在创建新查询时,系统会提示您是否从当前数据库或自由表中选择表或视图。

选择要查询的表或视图

选择了表或视图后,Visual FoxPro 将显示“查询设计器”窗口。

“查询设计器”窗口

不同的表或视图之间可以很方便地进行切换。

若要使用不同的表或视图

  1. 选择当前表,再选择“查询设计器”工具栏上的“移去表”按钮。

  2. 从“查询设计器”工具栏上选择“添加表”按钮,再选择想要的表或视图。

定义结果

打开“查询设计器”,选择包含想要信息的表或视图后,就可定义输出结果。至少需要选择所需的字段,也可设置选定字段的显示顺序和设置过滤器来筛选需要显示的记录,以此定义输出结果。

选择所需字段

在运行查询之前,必须选择表或视图,并选择要包括在查询结果中的字段。在某些情况下,您可能需要使用表或视图中的所有字段。但在另一些情况下,也许只想使查询与选定的部分字段相关,比如要加到报表中的字段。

如果想用某些字段给查询结果排序或分组,一定要确保在查询输出中包含这些字段。选定这些字段后,可以为它们设置顺序作为输出结果。

使用“查询设计器”底部窗格中的“字段”选项卡来选取需要包含在查询结果中的字段。

“查询设计器”中的“字段”选项卡

若要在查询输出中添加字段

选择输出全部字段

可使用名称或通配符选择全部字段。如果使用名字选择字段,查询中要包含完整的字段名。此时若向表中添加字段后,再运行查询,则输出结果不包含新字段名。

如果使用通配符,则通配符包含在查询中,并包含当前查询的表中的全部字段。如果创建查询后,表结构改变了,新字段也将出现在查询结果中。

若要在查询中一次添加所有可用的字段

显示字段的别名

若要使查询结果易于阅读和理解,可以在输出结果字段中添加说明标题。例如,您可在结果列的顶部显示“SumMaxOrd”来代替字段名或表达式 SUM(MaxOrdAmount)。

若要给字段添加别名

  1. 在“函数和表达式”框,键入字段名,接着键入“AS”和别名,例如:
    SUM(maxorderamt) AS SumMaxOrd
    
  2. 选择“添加”在“选定字段”框中放置带有别名的字段。

设置输出字段的次序

在“字段”选项卡中,字段的出现顺序决定了查询输出中信息列的顺序。

设置输出的列顺序

若要改变查询输出的列顺序

如果想改变信息行的排序次序,请使用“排序依据”选项卡

选定所需的记录

选取需要查找的记录是决定查询结果的关键。用“查询设计器”中的“筛选”选项卡,可以构造一个带有 WHERE 子句的选择语句,来通知 Visual FoxPro 想要搜索并检索的记录。

您可能需要查找一个特定的数据子集,并将其包含在报表或其它输出形式中。例如,所有要延期支付的顾客、在某个特定地区或具有特定邮编的所有顾客等等。若只想查看所需的记录,可以输入一个值或值的范围与记录进行比较。

在 Visual FoxPro 中,使用“筛选”选项卡可以确定用于选择记录的字段、选择比较准则以及输入与该字段进行比较的示例值。

定义查询结果的条件

若要指定过滤器

  1. 从“字段名”列表中选取用于选择记录的字段。

    注释 通用字段和备注字段不能用于过滤器中。

  2. 从“条件”列表中选择比较的类型。

  3. 在“实例”文本框中,输入比较条件。
  4. 在搜索字符型数据时,如果想忽略大小写匹配,请选择“大小写”下面的按钮。

若想对逻辑操作符的含义取反,请选择“否”下面的按钮。例如,您想查找除了华盛顿地区以外所有地区的顾客,可使用下面示例中的选择表达式:

Customer.region Not Like WA

若要更进一步搜索,可在筛选选项卡中添加更多的筛选项。有关的详细内容,请参阅本章稍后的“精确搜索”部分。

如果查询中使用了多个表或视图,按选取的联接类型扩充所选择的记录。有关详细内容,请参阅《程序员指南》中的第八章“创建视图”

组织输出结果

定义查询输出后,可组织出现在结果中的记录,方法是对输出字段排序和分组。也可筛选出现在结果中的记录组。

排序查询结果

排序决定了查询输出结果中记录或行的先后顺序。例如,可以将州名列在城市名的前面,或以升序方式根据未付款额的大小对记录排序。

利用“排序依据”选项卡设置查询的排序次序,排序次序决定了查询输出中记录或行的排列顺序。

首先,从“选定字段”框中选取要使用的字段,并把它们移到“排序条件”框中,然后根据查询结果中所需的顺序排列这些字段。

若要设置排序条件

  1. 在“选定字段”框中选定字段名。

  2. 选择“添加”。

若要移去排序条件

  1. 选定一个或多个想要移去的字段。

  2. 选择“移去”。

字段在“排序条件”框中的次序决定了查询结果排序时的重要性次序,第一个字段决定了主排序次序。

例如,在“排序条件”框中的第一个字段是 Customer.region,第二个字段为 Customer.city,查询结果将首先以 Customer.region 进行排序,如果客户表中有多个记录具有同样的 region 字段值,这些记录再根据 Customer.city 进行排序。

用“排序依据”选项卡设置排序次序

为了调整排序字段的重要性,可以在“排序条件”框中,将字段左侧的按钮拖到相应的位置上:

通过设置“排序选项”区域中的按钮,可以确定升序或降序的排序次序。在“排序依据”选项卡的“排序条件”框中,每一个排序字段都带有一个上箭头或下箭头,该箭头表示按此字段排序时,是升序排序还是降序排序。

分组查询结果

所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可以完成基于一组记录的计算。例如,若想找到某一特定地区所有订货的总和,不用单独查看所有的记录,可以把来自相同地区的所有记录合成为一个记录,并获得来自该地区的所有订货的总和。若要控制记录的分组,可使用“查询设计器”中的“分组依据”选项卡

分组在与某些合计函数联合使用时效果最好,诸如 SUM、COUNT、AVG 等等。

例如,若想看到订单表中具有特定 ID 号的客户订货的金额总值,只需将具有相同 Customer ID 号的订货记录合成为一个记录,同时寻找订货总量即可。

首先在“字段”选项卡中,把表达式 SUM(Orders.order_net) 添加到查询输出中,然后利用“分组依据”选项卡,根据 Customer ID 号分组,输出结果显示了每个客户的净订货总量:

设置“分组依据”选项

若要设置分组选项

  1. 在“字段”选项卡中,在“函数和表达式”框中键入表达式。

    – 或者 –

    选择弹出“表达式生成器”的对话按钮,在“表达式”框中键入表达式。

  2. 选择“添加”按钮,在“选定字段”框中放置表达式。

  3. 在“分组依据”选项卡中,加入分组结果依据的表达式。

也可以在已分组的结果上设置选定条件。

选择分组

若要对已进行过分组或压缩的记录而不是对单个记录设置筛选,可在“分组依据”选项卡中选定“满足条件”按钮。您可使用字段名,字段名中的合计函数,或者“字段名”框中其余的表达式。

基于上述示例,您可以使用按客户号码显示总销售额的查询,进一步利用“满足条件”按钮,限制查询的结果为那些净订货量超过 50000 美元的顾客:

为一个组设置条件

为一个组设置条件

  1. 在“分组依据”选项卡上,选择“满足条件”按钮。

  2. 在“满足条件”对话框中,选定一个函数,并在“字段名”域中选定字段名。

  3. 选择“确定”按钮。

运行查询

在完成了查询设计并指定了输出目的地后,可以用“运行”按钮启动该查询。Visual FoxPro 执行用“查询设计器”产生的 SQL Select 语句,并把输出结果送到指定的目的地。若尚未选定输出目的地,结果将显示在“浏览”窗口中。

若要运行查询

如果想使结果输出到不同的目的文件,可将结果定向输出到表单、表、报表或其他目的文件。如果想了解 SQL 语句,可查看生成的 SQL 语句。

有关详细内容,请参阅 SELECT - SQL Command

定向输出查询结果

可以把查询结果输出到不同的目的地。如果没有选定输出目的地,查询结果将显示在“浏览”窗口中。

从“查询”菜单中选择“查询去向”,或在“查询设计器”工具栏中选择“查询去向”按钮,此时将显示一个“查询去向”对话框,您可以在其中选择将查询结果送往何处。

若要选择查询结果的去向

  1. 从“查询设计器”工具栏中选择“查询去向”。

  2. 在“查询去向”对话框中选择输出去向,并填写所需的其他选项。

    选择查询去向

使用下表选择查询输出的去向。

若要 选择的输出选项
在“浏览”窗口中显示查询结果 浏览
将查询结果存贮在一个命名的临时只读表中 临时表
使查询结果保存为一个命名的表
使查询结果可用于 Microsoft Graph(Graph 是包含在 Visual FoxPro 中的一个独立的应用程序) 图形
在 Visual FoxPro 主窗口或当前活动输出窗口中显示查询结果 屏幕
将输出送到一个报表文件(.frx) 报表
将输出送到一个标签文件(.lbx) 标签

许多选项都有一些可以影响输出结果的附加选择。例如,“报表”选项可以打开报表文件,并在打印之前定制报表,您也可以选用“报表向导”帮助自己创建报表。有关详细内容,请参阅第七章“设计报表和标签”

验证查询

如果您要确认查询的定义是否正确,可查看使用“查询设计器”生成的 SQL 语句。也可添加注释来说明查询的目的。添加的注释出现在 SQL 窗口里。

查看查询的 SQL 语句

在建立查询时,从“查询”菜单中选择“查看 SQL”,或从工具栏上选择“显示 SQL 窗口”按钮,可以查看查询生成的 SQL 语句。

SQL 语句显示在一个只读窗口中,您可以复制此窗口中的文本,并将其粘贴到“命令”窗口或加入到程序中。

若要查看查询的 SQL 语句

查询的 SQL 语句

在查询中添加注释

如果想以某种方式标识查询,或对它作一些注释说明,可以在查询中添加备注,这对以后确认查询及其目的很有帮助。

若要给查询添加注释

  1. 从“查询”菜单中选择“备注”。

  2. 在“加入备注”框中,键入与查询有关的注释。

  3. 选择“确定”。

    在查询中添加注释

键入的注释将出现在 SQL 窗口的顶部,并且前面有一个 * 号表明其为注释。

定制查询

利用“查询设计器”中其他可用的选项,很容易进一步定制查询。可使用过滤器扩充或缩小搜索。也可以添加表达式计算字段中的数据。

精确搜索

您可能需要对查询所返回的结果做更多的控制,例如,查找满足多个条件的记录,象来自某个指定州而且未付款额超过 1000 美元的顾客,或者搜索满足两个条件之一的记录,如来自华盛顿或俄勒冈的顾客。在这些情况下,您都需要在“筛选”选项卡中加进更多的语句。

在 Visual FoxPro 中,如果在“筛选”选项卡中连续输入选择条件表达式,那么这些表达式自动以逻辑“与”(.AND.)的方式组合起来,如果您想使待查找的记录满足二个以上条件中的任意一个时,您可以使用“添加‘或’”按钮在这些表达式中间插入逻辑“或”(.OR.)操作符。

缩小搜索

如果想使查询检索同时满足一个以上条件的记录,只需在“筛选”选项卡中的不同行上列出这些条件,这一系列条件自动以“与”(AND)的方式组合起来,因此只有满足所有这些条件的记录才会检索到。

例如,假设您正在搜索一个雇员表,想查看所有在英国的销售代理,则可以在不同的行上输入两个搜索条件:

组合两个过滤器

若要设置“与”(AND)条件

扩充搜索

若要使查询检索到的记录满足一系列选定条件中的任意一个时,可以在这些选择条件中间插入“或”(OR)操作符将这些条件组合起来。

例如,若想搜索那些住在华盛顿或加利福尼亚的顾客:

在两个过滤器之间添加一个“或”(OR)操作符

若要设置“或”(OR)条件

组合条件

您可以把“与”(AND)和“或”(OR)条件组合起来以选择特定的记录集。

例如,若想检索来自华盛顿或加利福尼亚,同时最大订货量超过 5000 美元的顾客:

组合不同的过滤器

在查询中删除重复记录

重复记录是指其中所有字段值均相同的记录。如果想把查询结果中的重复记录去掉,只需选中“杂项”选项卡中的“无重复记录”复选框。否则,应确认“无重复记录”框已被清除。

注释 如果选中了“无重复记录”复选框,在 SELECT 命令的 SELECT 部分,字段前会加上 DISTINCT。

查询一定数目或一定百分比的极值记录

您可使查询返回包含指定数目或指定百分比的特定字段的记录。例如,查询可显示含 10 个指定字段最大值或最小值的记录,或者显示含有 10% 的指定字段最大值或最小值的记录。

利用“杂项”选项卡的顶端设置,可设置一定数目或一定百分比的记录。若要设置是否选取最大值或最小值,可设置查询的排序顺序。降序可查看最大值记录,升序可查看最小值记录。

若要检索一个数目或一定百分比的极值记录

  1. 在“排序依据”选项卡中,选择要检索其极值的字段,接着选取“降序”显示最大值或“升序”显示最小值。如果还要按其它字段排序,可按列表顺序将其放在极值字段的后面。

  2. 在“杂项”选项卡中,在“记录个数”框中,键入想要检索的最大值或最小值的数目。若要显示百分比,请选中“百分比”复选框。

  3. 如果不希望数目或百分比中含有重复的记录,请选中“无重复记录”复选框。

在查询输出中添加表达式

使用“字段”选项卡底部的方框,可以在查询输出中加入函数和表达式。

在结果中添加表达式

可以显示列表来查看可用的函数,或者直接向框中键入表达式。如果希望字段名中包含表达式,可以添加别名。

例如,若要使查询结果包括别名为 Total 的 order 量值的总和,请键入:

SUM(orders.order_amt) AS Total

创建包括在查询结果中的表达式

可直接在对话框中键入一个表达式或使用“字段”选项卡中的“表达式生成器”

若要在查询输出中添加表达式

  1. 在“字段”选项卡的“函数和表达式”框中键入表达式。

    – 或者 –

    选择对话按钮使用“表达式生成器”,再在“表达式”框中键入一个表达式。

  2. 选择“添加”按钮,在“选定字段”框中放入表达式。

    注释 计算中将忽略 null 值,有关表达式中 null 值的详细内容,请搜索“Null 值”。

用表达式筛选

不同于简单搜索与一个或多个字段相匹配的记录,使用一个表达式可以组合两个字段,或基于一个字段执行某计算并且搜索匹配该组合或计算字段的记录。

可直接在示例框中键入表达式。如需帮助,可使用“表达式生成器”,“表达式生成器”可从字段选项卡的“函数和表达式”框旁边的对话按钮中得到。

例如,使用 Orders 表时,需要检查某客户的总折扣,如下所示在表达式中组合订单的数量和订单的折扣:

Orders.order_amt * Orders.order_dsc

在“表达式生成器”中创建一个表达式