第6章 如何获取数据库中的数据教学内容:6.1 案例引入——从商品信息管理数据库中获取数据6.2 查询商品信息管理数据库6.3 应用SELECT—SQL命令进行“查询”6.4 用“视图”方法查看商品信息管理数据库教学时间: 第九、十周教学方法: 演示文稿演示教学和实际操作演示教学相结合教学目的: 本章介绍数据库及自由表一个重要应用——查询和视图。查询和视图是根据用户的需要从数据库或自由表中按一定要求选择出部分数据及计算统计组成一个虚拟数据表。查询(Query)是从数据库或自由表中检索或统计出所需数据。视图(View)除具有查询所有的检索、统计功能外,还可以改变视图中记录值以及源数据库或自由表的值。教学重点难点: 1、建立、使用、修改查询2、应用SELECT—SQL命令进行“查询”3、建立、使用、修改视图教学过程: Visual FoxPro 提供了查询和视图的工具: 查询设计器和视图设计器。通过查询设计器和视图设计器进行设计,使用户很方便地从数据库或自由表中检索及统计出所需要的数据。查询(Query)是从数据库或自由表中检索或统计出所需数据。视图(View)除具有查询所有的检索、统计功能外,还可以改变视图中记录值以及源数据库或自由表的值。6.1 案例引入——从商品信息管理数据库中获取数据建立数据库表或自由表后,在数据表中保存了大量数据,如何灵活使用这些数据,是充分利用数据资源、提高管理水平的一个重要问题。在实际应用中用户常常需要根据要求选择其中一部分数据构成所需的新的数据组合。如员工表yg.dbf,表中有6个字段: 员工编号ygbh、姓名xm、性别xb、基本工资jbgz、职务zw和密码mm。员工表中的部分记录内容显示在表6-1中。<参见教材P167表6--1>利用员工表yg.dbf中的记录数据,选择其中的部分数据构成各种不同的表。如选择员工编号ygbh、员工姓名ygxm、性别xb、职务zw等字段列出表6-2所示数据。<参见教材P168表6--2>又如选择列出所有女职工的数据表6-3。<参见教材P168表6--3>还可以用多个表中的数据构成新的表,使用员工表yg.dbf和销售情况表xsqk.dbf构成员工的销售情况表ygxsqk.dbf,如表6-4所示。表中选择了员工表的员工编号yg.ygbh、姓名字段yg.xm,选择了销售情况表的商品编号xsqk.spbh、销售数量xsqk.xssl和总金额xsqk.zje等字段。多表之间的数据通过表之间的关系联接。如列出员工的销售情况,计算出每个员工的销售总金额作为一输出项。<参见教材P169表6--4>从上面几个表格的例子可知,开发人员可以灵活使用数据库中各表的数据组成不同需要的数据表,除了选择字段还可以设置条件,如选择性别是“女”的记录;也可以进行统计计算,如计算出每位职工销售商品的总的金额等。Visual FoxPro 为用户提供了从数据表中按一定的条件获取部分数据的工具,有“查询”和“视图”两种。“查询”和“视图”都是对数据表进行检索及统计出所需的数据。用“视图”构成的表可以视为一数据表保存在数据库中,可对源数据表记录进行修改或直接被作为数据表引用。而用“查询”构成的表不能直接对源表进行操作。“查询”和“视图”对多个相关的数据表进行检索统计时显得特别方便。“查询”是通过“查询设计器”、“视图”通过“视图设计器”进行设计操作,在后面的几节中将详细介绍“查询”和“视图”的操作方法。6.2 查询商品信息管理数据库用“查询设计器”对数据表进行各种查询操作,获得用户所需要的不同结果。本节中通过对商品信息管理数据库进行查询来介绍“查询设计器”的操作。6.2.1 单表“查询”日销售商品情况对单个数据表进行查询,这里以商品信息管理数据库中的销售情况表xsqk.dbf获得某一天的商品销售情况为例,查询日销售情况。所要选取的字段有:商品编号spbh、销售数量xssl、总金额zje。 获得某日商品销售情况的操作如下:1. 打开“查询设计器”从项目管理器打开“查询设计器”。打开项目管理器,在“数据”选项栏列表中选择“查询”项。再单击“新建”按钮,出现“新建查询”对话框。在对话框中选择“新建查询”即打开“查询设计器”。如图6-1所示。随“查询设计器”打开的有“查询”菜单和“查询设计器”工具栏,如图6-2所示。2. 添加数据表打开“查询设计器”后,一般将出现“添加表或视图”对话框,如未出现“添加表或视图”对话框时,可选择“查询设计器”工具栏或执行“查询”菜单中的“添加表”命令打开。“添加表或视图”对话框如图6-3所示。在对话框内的“数据库”栏和“数据库中的表”栏中选择所需的数据库sp和销售情况表xsqk.dbf。选择了数据表xsqk.dbf后,单击“添加”按钮。将所需的表添加到“查询设计器”,再单击“关闭”按钮,进入“查询设计器”。图6-3 “添加表或视图”对话框3. 选择所需的输出字段“查询设计器”的下半部有多个选项卡,选择“字段”选项卡。“字段”选项卡上包含了“可用字段”列表、“选定字段”列表和将字段从“可用字段”列表调入“选定字段”列表中的“添加”和“全部添加”按钮,以及将选定输出的字段从“选定字段”列表中释放回“可用字段”列表中的“移去”和“全部移去”按钮。“可用字段”列表中列出了可供选用的数据表字段,每个字段前面标出了字段所属的数据表。在“查询设计器”的“可用字段”列表中分别选择商品编号xsqk.spbh、销售数量xsqk.xssl、总金额xsqk.zje等字段,每选定一个字段后单击“添加”按钮,则将选定的字段一一添加到“选定字段”列表中。4. 设置筛选日期的条件案例中要求选择某日的销售情况,筛选条件通过“筛选”选项卡进行设置,如图6-4所示。在此选项卡中建立“销售日期xsqk.xsrq”字段的筛选关系: xsqk.xsrq=日期。如选择2003年10月29日的销售情况。表达式则为:xsqk.xsrq={^2003/10/29}在“筛选”选项卡中设置筛选条件的方法是: 表达式等号左边的内容列在选项卡的“字段名”栏中,单击“字段名”右边的下拉箭头,出现所有的可选字段和一个<表达式…>项。如果表达式左边选用的是字段,可直接在列表中单击选用。如果还要构成一定的表达式关系,则可选择<表达式…>项。本例中的xsqk.xsrq可直接从“字段名”栏中选出。表达式等号右边的内容列在“实例”栏中。在“条件”栏中选择“=”关系符号。5. 运行查询结果单击工具栏中的“运行”按钮或选择“查询”菜单中的“运行查询”命令,以默认的浏览状态显示出日销售情况表,如图6-5所示。6.2.2 多表“查询”日销售商品情况上面的查询日销售商品情况是应用一个数据表进行查询的,如果希望销售商品情况表表达得更完善,这里可增加一个商品信息表spxx.dbf参与查询,从中获得商品名称.spxx.spmc字段,使查询结果更加直观,如图6-6所示。现介绍多表的“查询”操作。1. 打开“查询设计器”单击“文件”菜单中的“新建”命令,在“新建”对话框中选择“查询”选项,单击“新建文件”按钮,打开“查询设计器”。2. 添加数据表按工具栏“添加表”按钮,打开“添加表或视图”对话框,在“数据库”栏中选择数据库sp。从“数据库中的表”栏中分别选择商品信息表spxx.dbf和销售情况表xsqk.dbf添加到“查询设计器”中。3. 建立两表的联接关系在“查询设计器”中选择“联接”选项卡,建立商品信息表spxx和销售情况表xsqk两表的联接关系: spxx.spbh=xsqk.spbh,如图6-7所示。如果两表在数据库中已建立了永久关联的关系,“联接”选项卡中会自动建立起联接关系。4. 选择输出字段选择“字段”选项卡。“可用字段”列表中列出了商品信息表spxx.dbf和销售情况表xsqk.dbf两表的全部字段。在其中分别选择商品信息表spxx.dbf的商品编号spxx.spbh、商品名称spxx.spmc字段和销售情况表xsqk.dbf的销售数量xsqk.xssl、总金额xsqk.zje字段添加到“选定字段”列表中。5. 设置筛选日期的条件在“筛选”选项卡中建立销售日期xsqk.xsrq字段的日筛选关系。同样选择表达式:xsqk.xsrq={^2003/10/29}6. 运行查询结果单击工具栏中的“运行”按钮或选择“查询”菜单中的“运行查询”命令,出现如图6-6所示的日商品销售查询情况表。6.2.3 查询员工销售业绩情况通过查询每个员工的销售情况,表现每个员工的工作业绩。本例中以月为时间单位查询员工在某一月的销售情况,需要用到销售情况表xsqk.dbf和员工表yg.dbf。查询操作如下:(1) 打开查询设计器,添加销售情况表xsqk.dbf和员工表yg.dbf。(2) 选择输出字段。选择的字段应该有: 员工编号xsqk.ygbh、姓名yg.xm、销售金额小计。其中销售金额小计是对每一个员工的当月销售总值进行统计。“销售金额小计”的设置: 销售金额小计是按员工编号xsqk.ygbh对销售总金额xsqk.zje字段进行求和,求和计算表达式为SUM(xsqk.zje),并按员工编号分组计算。销售金额小计的设置是使用查询设计器“字段”选项卡中的“函数和表达式”生成。具体操作为:① 单击“函数和表达式”栏右边的按钮,出现“表达式生成器”对话框。② 在对话框的“表达式”栏中生成表达式: SUM(xsqk.zje) AS “销售金额小计”。 SUM()求和符号从“表达式生成器”的函数“数据”栏中选择获得,在函数“数学”栏中寻找到“SUM()”求和符号,双击该求和符号,符号立即显示到“表达式”栏中。③ 在“来源于表”栏中选择销售情况表xsqk。在“字段”栏中选择总金额xsqk.zje字段并双击,xsqk.zje(总金额)字段显示在“表达式”栏中的SUM()的括号中间。④ 用AS引出该字段的标题“销售金额小计”,完成表达式SUM(xsqk.zje) AS “销售金额小计”的设置。⑤ 按“表达式生成器”的“确定”按钮,退出表达式生成器。表达式SUM(xsqk.zje) AS “销售金额小计”显示在“函数和表达式”栏中。⑥ 单击“添加”按钮将表达式添加到“选定字段”栏中。(3) 分组统计的控制。“销售金额小计”项是对每一个员工的销售情况求和。这里按员工编号分组对每个员工的销售情况进行统计。分组统计通过查询设计器的“分组依据”选项卡进行设置。在“可用字段”栏中选择员工编号xsqk.ygbh添加到“分组字段”中,如图6-8所示。根据分组依据的设置,则可分别按照员工编号对总金额字段进行分组求和统计出每个员工的“销售金额小计”值。(4) 设置筛选月份条件。案例中要求的统计某月的销售情况通过“筛选”选项卡进行。在此项中获得销售日期xsqk.xsrq字段的年份和月份筛选关系:YEAR(xsqk.xsrq)=年 AND MONTH(xsqk.xsrq)=月份例如这里选择2003年及9月份,表达式则为:YEAR(xsqk.xsrq)=2003 AND MONTH(xsqk.xsrq)=9在“筛选”选项卡中获得表达式的方法是: 等号左边的内容置于“筛选”选项卡中的“字段名”栏中,单击“字段名”栏右边的下拉箭头,出现所有可选字段和一个<表达式…>项。如果表达式左边选用的是字段,可直接在列表中单击选择。如果还要构成一定的表达式关系,则可选择<表达式…>项进行设计。本例中的YEAR(xsqk.xsrq)和MONTH(xsqk.xsrq)都须通过<表达式…> 项进行设置。等号右边的内容在“实例”栏中输入。关系符等于号在“条件”栏中选择。第一个表达式YEAR(xsqk.xsrq) =2003设置在第1行,第2个表达式MONTH(xsqk.xsrq)=9设置在第2行,两个表达式之间的“与”关系在第1行表达式后的“逻辑”项中选择。“筛选”选项卡显示在图6-9所示。(5) 运行查询结果。单击工具栏中的“运行”按钮,运行上面设置的“查询”,得到每个员工在9月份中的销售情况表,如图6-10所示。6.2.4 “查询设计器”的各功能设计方法掌握了查询的作用和基本操作后,我们来全面了解一下“查询设计器”的各种功能的设计方法。1. 打开“查询设计器”的方法① 用“文件”菜单中的“新建”命令打开“查询设计器”。单击“文件”菜单中的“新建”命令,在出现“新建”对话框中选择“查询”,并单击“新建文件”按钮,打开“查询设计器”。② 从项目管理器打开“查询设计器”。打开项目管理器,如图6-11所示。在“数据”选项栏列表中选择“查询”项。再单击“新建”按钮,出现“新建查询”对话框。在对话框中选择“新建查询”即打开“查询设计器”。打开“查询管理器”后的同时在菜单栏上出现“查询”菜单,在查询设计器窗口出现“查询设计器”工具栏。如果“查询设计器”工具栏未出现,可选择“显示”菜单中的“工具栏”命令,从“工具栏”对话框中选择“查询设计器”打开“查询设计器”工具栏。2. 添加或移除数据库表或自由表选择“查询”菜单中的“添加表”或单击“查询设计器”工具栏中的“添加表”按钮,调出图6-3的“添加表或视图”对话框。在“添加表或视图”对话框中选择所要添加的数据库和数据表,按“确定”按钮,将选定的表添加到“查询设计器”中。要添加多个数据表时,则重复进行上述操作。如果所需要的表在数据表栏中未列出,可按“其他”按钮,从“打开”对话框中寻找所需的表。所需添加的表加到“查询设计器”中后,按“关闭”按钮,退出“添加表”对话框,完成添加表的操作。从“查询设计器”中移除数据表的方法是: 先选定要移去的表,再按“查询”菜单中的“移去表”命令或“查询设计器”工具栏的“移去表”按钮,即可移去选择的表。3. 选择“查询”输出字段选择“查询设计器”的“字段”选项卡,该选项卡上的“可用字段”列表框中列出了“查询设计器”中数据表的全部字段,从中单击选择要输出的字段。选择所需要的字段后单击“添加”按钮,将选定的字段添加到“选定字段”中。“全部添加”可将“可用字段”列表中的所有字段同时添加到“选定字段”中。“移去”按钮将“选定字段”列表框中选择的字段移回到“可用字段”列表框中。“全部移去”按钮将“选定字段”列表中的全部字段移回到“可用字段”列表框中。利用“函数和表达式”栏构成一定的表达式作为一个字段,用AS引导该表达式的标题。单击“添加”按钮将表达式添加到“选定字段”栏中。4. 建立多表联接关系如果使用多个相关的数据表须建立联接关系,建立联接关系的方法是: 单击“联接”选项卡,如图6-12。在“联接”选项卡的“字段名”中选择第一个数据表的一个字段,在“值”中选择另一个数据表与第一个数据表所选的字段相关联的字段。选项中的“条件”是确定所选两表的字段以什么条件关联。关联的条件有多种,关联条件在表6-5中列出。选项卡中的“否”表示与所选择的条件相反。选项中“类型”确定关联的关系类型,关联的类型有内联接(Inner Join)、左联接(Left Outer Join)、右联接(Right Outer Join)和完全联接(Full Join)四种。四种联接类型的关系列在表6-6中。5. 确定查询条件选择查询的数据需要满足一定的条件时,在“查询设计器中”使用“筛选”选项卡。“筛选”选项卡如图6-13所示。查询条件根据字段满足的条件来确定,在“筛选”卡中设置字段符合的条件。“字段名”中选择所设计的字段,“实例”中输入满足的条件值。可选择的“条件”与表6-5中列出的条件相同。6. 设置查询的排序当需要对查询结果按某一字段进行排序时,选择“查询设计器”的“排序依据”选项卡。“排序依据”选项卡如图6-14所示。在此选择卡中,“选定字段”列表框中列出可选择的字段,其字段是前面选定的输出字段。在“选定字段”列表中选择需要排序的字段,按“添加”按钮将其添加到“排序条件”列表中。同时在“排序选项”栏中确定排序的字段是升序还是降序。7. 确定查询的分组在查询时有时需要对记录的某些数据进行分组统计计算,如对销售出的商品按相同的商品进行销售量的统计。对此使用“分组依据”选项卡。“分组依据”选项卡在如图6-15中显示。8. 其他项目的设定应用“查询设计器”的“杂项”选项卡对查询结果排除重复记录、选择查询范围等操作。“杂项”选项卡如图6-16所示。(1) 查询结果排除重复数据的记录当记录中的某一字段有相同记录时,查询使用“无重复记录”选项可以使查询结果排除该字段的重复记录,只显示排在最前面的一个记录。(2) 设置查询的记录范围使用查询“杂项”选项卡中的“列在前面的记录”选项,可以选择查询范围。查询的范围有下面几种情况:① 全部: 查询全部记录。② 部分记录: 查询记录中前n个记录。在“记录个数”选项中设定记录的前面n个记录。③ 前n%个记录: 按百分比选择记录的范围,选择n值后,再选定“百分比”项确定选择记录的百分比。选择后两种情况时,需要先对记录进行排序。9. 查询结果的输出方向查询设置完成后,其查询结果可有多个去向。查询结果主要去向有: 浏览、临时表、表、图形、屏幕、报表、标签。查询输出去向的设置通过“查询”工具栏中的“查询去向”按钮或“查询”菜单中的“查询去向”命令。单击“查询去向”按钮或命令后出现“查询去向”对话框,如图6-17所示。在对话框中选择查询输出结果的去向后,按“确定”完成设置。设置查询结果去向后执行查询,将以设定的去向产生查询结果,如设置了查询结果去向为“表”,则查询的输出结果存入指定的数据表中,而不显示在“浏览”框中。10. 运行查询使用“查询设计器”完成查询设置后,用“查询”菜单中的“运行查询”命令或“常用”工具栏的“运行”按钮来运行“查询”结果。查询文件的扩展名为.qpr,编译后的查询文件扩展名为.qpx。使用命令执行查询,使用 DO 查询文件名.qpr 命令进行查询。6.2.5 部门月销售情况交叉表的设计月销售情况表的记录如表6-7中所示,表中反映了各销售部门每个月的销售情况,从表中查看部门各月份销售情况时不够直观,Visual FoxPro 提供了一种更直观查看这类表的设计方法: 交叉表设计。交叉表将两个字段的值分作为表格的行标题和列标题,如将月份字段的值作为行标题、部门字段的值作为列标题。另一个字段作为前两个字段交叉单元的值,查询结果构成一种三维表,如表6-7所示。设计交叉表应用“交叉表向导”工具,“交叉表向导”设计方法如下:① 选择“文件”菜单中的新建命令,打开“新建”对话框。在对话框中选择“查询”项,并单击“向导”按钮,打开“向导选取”对话框。在“向导选取”对话框中选择“交叉表向导”,即打开“交叉表向导”。② 字段选择。在交叉表设计步骤1中选择数据表和设计交叉表所需的字段,如字段选择 : 部门、月份和销售额。③ 定义布局。交叉表设计步骤2中设计查询表的行标题、列标题和数据栏内容,如图6-18所示。将“部门”字段拖到“行”框中,把“月份”字段拖到“列”框中,“销售额”拖到“数据”框中。④ 加入总结信息。交叉表设计步骤3是加入总结信息,总结信息为查询增加一个统计计算列,对查询的数据进行总结计算。总结计算的类型分别有: 求和、计数、平均值、最大值、最小值等。汇总分类有数据求和、包含数据的单元格数目、占整张表的总计的百分比、不统计等各项。加入总结信息设计对话框如图6-19所示。计算各部门的销售总金额时总结项选择“求和”,分类汇总项选择“数据求和”。⑤ 完成设计。在保存交叉表查询、保存并运行交叉表查询和保存交叉表查询并在查询设计器中修改该查询中选择一项,完成交叉表设计。部门月销售情况交叉表的运行结果如图6-20所示。6.3 应用SELECT—SQL命令进行“查询”使用“查询设计器”工具对数据表进行的查询也可以使用SELECT—SQL命令实现。实质上使用“查询设计器”的查询设计最终也是生成一组SELECT—SQL命令。6.3.1 SELECT—SQL查询命令SELECT—SQL查询命令的格式如下:SELECT [ALL / DISTINCT] [TOP nExpr [PERCENT]][Alias.]Select-Item [AS Column-Name][,[Alias.]Select-Item [AS Column-Name]…]FROM [FORCE][DatabaseName!] table [lacal-Alias][INNER/LEFT/[OUTER]/RIGHT[OUTER]/FULL[OUTER]JOIN [DatabaseName!]Table [Local-Alias] ON JoinCondition [[INTO Destination] /[TO FILE FileName[ADDITIVE]/TO PRINTER [PROMPT]/TO SCREEN]][PREFERENCE PreferenceName][NOCONSOLE] [PLAIN][NOWAIT][WHERE JoinCondition [AND JoinCondition…] [AND/ORFilterCondition [AND /OR FilterCondition….]]][GROUP BY GroupColumn [,GroupColumn…]][HAVING FilterCondition UNION[ALL] SELECTCommand][ORDER BY Order-Item [ASC/DESE] [,Order-Item [ASC/DESC]…]]SELECT—SQL命令可以分解为多个部分,每一部分分别对应“查询设计器”的一种操作。SELECT—SQL命令主要分为下列各部分:1. 指定输出字段SELECT [ALL / DISTINCT] [TOP nExpr [PERCENT]][Alias.]Select-Item [AS Column-Name][,[Alias.]Select-Item [AS Column-Name]…]命令中的参数:[Alias.]Select-Item: 指定查询结果的输出字段、常量或表达式。Alias表示数据表别名。如果选择一个数据表的全部字段可用“*”表示。[AS Column-Name]: 设置查询输出字段或表达式项的标题。[ALL / DISTINCT]: 确定有无重复记录。ALL表示所有记录,ALL可以省略。DISTINCT表示当有重复记录时只输出重复记录中第一个记录。[TOP nExpr [PERCENT]]: 确定记录范围。TOP nExpr表示记录数,TOP nExpr PERCENT表示记录的百分数。2. 指定查询的数据表FROM [DatabaseName!] table [lacal-Alias]table: 指定查询的数据表。[DatabaseName!]: 当数据源是数据库表时的数据库名。[lacal-Alias]: 本地表的别名。如数据表取自sp数据库的xsqk表表示为: FROM sp!xsqk。例: 显示sp数据库中xsqk表的所有记录,输出商品编号spbh和销售数量xssl字段。SELECT xsqk.spbh, xsqk.xssl FROM sp! xsqk3. 确定多表间的联接[INNER / LEFT [OUTER] / RIGHT[OUTER] / FULL[OUTER]JOIN DatabaseName!]Table [Local-Alias] ON JoinCondition命令中的参数:[INNER/LEFT [OUTER]/RIGHT [OUTER]/FULL[OUTER]: 确定是内联接、左联接、右联接还是完全联接。INNER OUTER: 内联接LEFT OUTER: 左联接RIGHT OUTER: 右联接FULL OUTER: 完全联接。DatabaseName!]Table: 指定被联接的数据库和数据表名。JoinCondition: 确定联接条件。例: 查询数据库源sp的spxx表和xsqk表。其中spxx表和xsqk表以内联接方式联接。FROM sp!spxx INNER JOIN sp!xsqk ON spxx.spbh= xsqk.spbh4. 确定查询输出去向[[INTO Destination] / [TO FILE FileName [ADDITIVE] / TO PRINTER [PROMPT] / TO SCREEN]]命令中的参数:INTO Destination中Destination代表下列输出去向:① ARRAY ArrayName: 将查询结果保存到内存变量数组中。ArrayName表示内存变量名。② CURSOR CursorName: 将查询结果保存到临时表中。CursorName表示临时表名。③ DBF TableName / TABLE TableName: 将查询结果保存到一数据表中。TableName是数据表名。TO FILE FileName [ADDITIVE] / TO PRINTER [PROMPT] / TO SCREEN]: 输出到文件、打印机或屏幕。ADDITIVE表示数据输入到文件时不删除原有数据,而是从数据后面增加记录。如果没有ADDITIVE,则数据输入到文件中时不保留原数据,原数据被新数据覆盖。5. 筛选源表记录条件[WHERE JoinCondition [AND JoinCondition….][AND/OR FilterCondition [AND /OR FilterCondition….]]]命令中的参数:FilterCondition: 筛选条件。JoinCondition: 多表查询时的联接条件,作用同JOIN ON JoinCondition语句中的JoinCondition。例如: 筛选员工表yg.dbf中性别为“男”的子命令: WHERE yg.xb = ″男″6. 定义记录的分组[GROUP BY GroupColumn [,GroupColumn…]]GroupColumn: 分组的列或字段。例如: 以员工表中的员工编号分组的子命令: GROUP BY yg.ygbh。7. 指定分组满足条件[HAVING FilterCondition UNION [ALL] SELECTCommand]指定包含在查询结果中的组必须满足的筛选条件。8. 指定输出记录的排序顺序[ORDER BY Order—Item [ASC/DESE] [,Order-Item [ASC/DESC]…]]Order—Item: 排序的字段等项目ASC: 升序DESE: 降序例如: 以销售情况表中销售数量xssl字段以降序排序命令:ORDER BY xsqk.xssl DESC6.3.2 SELECT—SQL查询命令应用举例SELECT—SQL查询命令比较复杂,下面通过一些例子介绍SELECT—SQL查询命令的应用。1. 单表查询【例6-1】查询销售商品管理数据库sp.dbc中商品信息表spxx.dbf的商品编号spbh、商品名称spmc和销售单价xsdj。SELECT spxx.spbh, spxx.spmc, spxx.xsdj FROM sp!spxx【例6-2】查询商品信息表spxx.dbf销售单价大于1000元的商品,输出商品编号spbh、商品名称spmc和销售单价xsdj等字段。SELECT spxx.spbh, spxx.spmc, spxx.xsdj FROM sp!spxx ;WHERE spxx.xsdj > 1000【例6-3】按商品编号顺序从小到大查询商品信息表spxx.dbf的商品编号spbh、商品名称spmc和销售单价xsdj。SELECT spxx.spbh, spxx.spmc, spxx.xsdj ;FROM sp!spxx ORDER BY spxx.spbh【例6-4】将库存表kc.dbf的查询输出到库存情况表kcqk.dbf中。查询的字段为: 商品编号spbh、进货日期jhrq和库存数量kcsl。SELECT kc.spbh, kc.jhrq, kc.kcsl FROM sp!kc;INTO TABLE kcqk.dbf2. 多表查询【例6-5】查询销售商品管理数据库sp.dbc的员工表yg.dbf和销售情况表xsqk.dbf的员工编号yg.ygbh、员工姓名yg.xm、销售金额xsqk.zje和销售日期xsqk.xsrq等字段。SELECT yg.ygbh, yg.xm, xsqk.zje, xsqk.xsrq ;FROM sp!yg INNER JOIN sp!xsqk ;ON yg.ygbh = xsqk.ygbh【例6-6】查询某一日销售情况表xsqk.dbf和商品信息表spxx.dbf的商品销售情况,输出字段有: 商品编号xsqk.spbh、商品名称spxx.spmc、销售单价spxx.xsdj、销售数量xsqk.xssl、总金额xsqk.zje和销售日期xsqk.xsrq等字段。SELECT xsqk.spbh, spxx.spmc, spxx.xsdj, xsqk.xssl, xsqk.zje, xsqk.xsrq;FROM sp!spxx INNER JOIN sp!xsqk ON spxx.spbh = xsqk.spbh;WHERE xsqk.xsrq = {^2003/10/29}3. 包含计算字段的查询【例6-7】查询销售情况表xsqk.dbf中各种销售商品的总金额小计,输出为商品编号spbh、以商品编号分组统计的总金额小计。SELECT xsqk.spbh , SUM(xsqk.zje) AS 销售金额小计 FROM sp!xsqk;GROUP BY xsqk.spbh【例6-8】查询销售情况表xsqk.dbf中同一种销售商品成交价最高的商品交易情况。输出字段有: 成交编号xsqk.cjbh、商品编号xsqk.spbh、以商品编号分组查找的同商品交易中最高成交金额的记录。SELECT xsqk.cjbh, xsqk.spbh, MAX(xsqk.zje) AS 交易最高价FROM sp!xsqk;GROUP BY xsqk.spbh6.4 用“视图”方法查看商品信息管理数据库在数据库中,可以建立与“查询”相同功能的“视图”,通过“视图”从数据表中查询所需的数据信息,组成新的数据集合表存放于数据库中,所以“视图”也称为“虚表”。“视图”与“查询”很相似,在数据表的基础上,构成一组检索和计算结果。支持“视图”的数据表称为“源数据表”,也称为“基表”。“查询”不能改变源数据表中数据,而与“查询”不同的是,通过“视图”可以改变源数据表中的记录值。“视图”是在“数据库设计器”中建立的。“视图”分为“本地视图”和“远程视图”。“本地视图”使用Visual FoxPro SQL语法从数据表或视图中选择信息;“远程视图”使用远程SQL语法从远程ODBC数据源表中选择信息。这里主要介绍“本地视图”的设计方法。6.4.1 建立员工销售业绩情况视图用建立“视图”的方法来构成每一员工某月的销售情况。销售情况表(xsqk.dbf)和员工表(yg.dbf)作为源数据源。建立员工销售视图的操作如下:1. 打开“视图设计器”“视图”是在“数据库设计器”中建立的,所以首先打开数据库:① 打开sp商品信息管理数据库。② 选择“数据库设计器”工具栏中的“新建本地视图”按钮或“数据库”菜单中的“新建本地视图”命令,出现“新建本地视图”对话框,单击对话框中的“新建视图”打开“视图设计器”。视图设计器与查询设计器的结构基本相同,视图设计器如图6-21所示。打开“视图设计器”同时出现“视图设计器”工具栏和“查询”菜单,供设计视图时使用。视图的设计方法也与查询的设计方法基本一致。2. 添加数据表单击“视图设计器”工具栏的“添加表”按钮或“查询”菜单中的“添加表”命令,打开“添加表或视图”对话框,添加销售情况表xsqk.dbf和员工表yg.dbf。3. 选择输出字段在“字段”选项卡中的“可用字段”栏中选择员工编号xsqk.ygbh、姓名yg.xm、销售总值SUM(xsqk.zje)等字段。添加到“选定字段”栏中。“销售总量”通过“函数和表达式”栏设置。4. 分组统计按员工编号xsqk.ygbh分组进行统计的设计是通过视图设计器的“分组依据”选项卡。在“可用字段”栏中选择员工编号xsqk.ygbh添加到“分组字段”栏中,根据分组依据的设置,求总金额的和按照员工编号分组进行统计。5. 月份的筛选单击“筛选”选项卡,建立表达式关系: YEAR(xsqk.xsrq) =2003(年)和MONTH(xsqk.xsrq)=9(月份)。单击“字段名”栏右边的下拉箭头,出现所有的可选字段和一个“表达式”项。选择“表达式”项,在“表达式生成器”中组成YEAR(xsqk.xsrq),在“实例”栏输入要设置的年份2003,在“条件”栏中选择等于号。MONTH(xsqk.xsrq)=9表达式的设计以同样的方法设计。6. 运行“视图”单击工具栏中的“运行”按钮或“查询”菜单中的“运行查询”命令,运行上面设置的“视图”,得到每个员工某个月份的销售总值表,如图6-22所示。与“查询”的结果表6-10比较两个结果是相同的。7. 更新视图与源数据表数据在默认情况下,是不能更新视图与源数据表中的记录的。为了能更新视图与源数据表,可通过设置“更新条件”选项卡上的参数来确定。操作方法如下:① 选择“更新条件”选项卡,如图6-23显示。② 选择可更新的表在“表”下拉列表中选择需要更新的数据表。如员工表yg.dbf。③ 设置关键字“字段名”列表中列出了可使用的字段,单击关键字段员工编号yg.ygbh前“钥匙”下面的位置,出现一个“√”符号,设定该字段为关键字。关键字应该在数据表的主关键字段或候补关键字段中选择。设置关键字后,如果要重新设置关键字,可单击“重置关键字”按钮后再重新设置关键字。④ 设置可更新字段在要更新的字段即员工姓名yg.xm前面单击可更新列(笔形标志),确定字段可修改。如果要使表中的所有字段可更新,将全部字段设置成可更新的。可用“全部更新”按钮设置,但用“全部更新”不影响关键字。因为一般不会直接修改关键字段。⑤ 更新源数据表设置了可更新字段后可以对视图进行更改,但还不能对源数据表直接更新。如需通过视图对源数据源表进行更改时,要进一步选择设置“发送SQL更新”项。⑥ 设置“SQL WHERE 子句包括”项如果在一个多用户环境中工作,用户使用的数据表也可以被别的用户访问或修改。为了检查数据表是否被其他用户修改过,对“SQL WHERE 子句包括”进行设置。各选项的功能为:关键字: 当源表中的关键字段被修改时,更新失败。关键字和可更新字段: 当远程表中可更新的字段被改变时,更新失败。关键字和已修改字段: 当在本地改变的字段在源表中被改变时,更新失败。关键字和时间戳: 当远程表上记录的时间戳在首次检索之后被改变时,更新失败。⑦ 设置“使用更新”项确定视图更新源表记录时使用的方法。第一项“SQL DELETE 然后 INSERT”是选删除原始记录,再插入新记录。另一项“SQL UPDATE”是直接更新已经存在的记录。6.4.2 创建供货商参数化视图参数化视图是根据某个参数的不同值分别查询对应的有关数据,这种视图称为参数化视图,如供货商表ghs.dbf按供货商的编号分别查看出对应每一编号的供货商情况。变化的参数是供货商编号ghs.ghsbh字段。如采用前面介绍的视图设计方法,对每个供货商编号,将建立起一个视图。表中有多个供货商,就必须建立多个相对应的视图。而参数化视图则可根据改变供货商编号获得不同的视图结果,操作和使用十分方便。供货商参数化视图的设计方法如下:① 打开“视图设计器”,添加数据表,选择输出的字段。操作方法同前面的介绍。② 在“筛选”选项卡中建立一个筛选关系: 字段名 = ?<提示符>。如: ghs.ghsbh =?供货商编号,见图6-24。③ 从“查询”菜单中选择“视图参数”,出现“视图参数”对话框,在其中定义参数名和参数类型,在“参数名”项中输入“供货商编号”,在“类型”项中选择“字符型”,如图6-25所示。④ 运行视图。参数化视图设置完成后,每当运行该视图时,会先出现提示输入参数对话框,如图6-26所示,在对话框中输入相应的供货商编号ghsbh字段的参数值后,查询对应的视图。用参数化视图可不需建立多个视图的情况下获得各个与参数相对应的视图。视图建立后,对视图的使用可以视为一个数据库表,很多情况下对视图的操作与对数据库表的操作方法相同。如打开视图、修改视图和关闭视图等操作。在程序中,打开视图和关闭视图的命令与打开数据库表与关闭数据库表的命令相同。打开视图时系统在其他工作区自动打开该视图的源数据表,但关闭视图后,视图的源数据表不能随视图的关闭而自动关闭,必须另外用命令关闭数据表。打开sp数据库的“员工销售情况”视图的命令为:OPEN DATABASE spUSE 员工销售情况在打开“员工销售情况”视图的同时,系统自动打开“员工销售情况”视图的源数据表kc.dbf。课后总结:本章介绍数据库及自由表一个重要应用——查询和视图。查询和视图是根据用户的需要从数据库或自由表中按一定要求选择出部分数据及计算统计组成一个虚拟数据表。Visual FoxPro 提供了查询和视图的工具: 查询设计器和视图设计器。通过查询设计器和视图设计器进行设计,使用户很方便地从数据库或自由表中检索及统计出所需要的数据。查询(Query)是从数据库或自由表中检索或统计出所需数据。视图(View)除具有查询所有的检索、统计功能外,还可以改变视图中记录值以及源数据库或自由表的值。作业:第五章习题 第五章上机实验题(书写相应实验报告) |
|