第4章结构化查询语言SQL和报表.ppt
第4章结构化查询语言SQL和报表 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望4.1SQL语言的基本概述结构化查询语言(StructuredQueryLanguage,简称SQL)SQL是用于对存放在计算机数据库中的数据进行组织、管理和检索的工具,是一种用于和数据库进行交互通信的计算机语言。SQL是1974年由Boyce和Chamberlin提出的,并在IBM公司研制的SystemR上首次实现了这种语言,由于它的功能丰富,使用方式灵活和语言简洁易学等突出特点,很受计算机界的欢迎。现在SQL语言已成为关系型数据库操纵语言的国际标准。VFP提供了SQL语言支持2022/12/624.1.1SQL语言的基本概念SQL语言支持关系型数据库的三级模式结构,其中外模式对应于视图和部分基本表,模式对应于基本表,内模式对应于存储文件。在SQL语言中,一个关系就对应于一个表,基本表本身是独立存在的表,对应一个存储文件;存储文件的逻辑结构组成了关系型数据库的内模式。视图是从基本表或其他视图导出的表,视图只是一个虚表。在用户看来,视图和基本表都是关系,而存储文件对用户是透明的。2022/12/634.1.2SQL的基本功能SQL语言由3部分组成:数据定义语言DDL(DateDefinitionLanguage)。数据操纵语言DML(DateManipulationLanguage)。数据控制语言DCL(DateControlLanguage)。其主要命令如表4-1所示。SQL功能命令数据定义语言DDLCreate、Drop、Alter数据操纵语言DMLSelect、Insert、Update、Delete数据控制语言DCLGrant、Revoke其中,数据定义语言DDL提供了完整的定义数据库所必需的语言工具,用来创建、修改、删除数据库对象;数据操纵语言DML用于查询或者修改数据;数据控制语言DCL用来管理用户的访问权限,由于VFP没有权限管理功能,所以不支持DCL命令。2022/12/644.2 数据定义语言DDL数据定义语言是对关系模式的一级定义,用来定义被存放数据的结构和组织,以及数据项之间的关系。SQL数据定义语言可以用来定义数据表、视图和索引。Create语句:用于定义和生成数据对象,比如创建表、视图和索引。Drop语句:用于删除一个现有的数据对象,比如视图、表、索引。Alter语句:用于改变一个数据库对象。比如对一个表的字段进行删除、添加和修改,或者修改表的结构。2022/12/654.2.1 用Create语句创建基本表命令格式:CREATETABLE表名FREE(宽度,小数)NULLNOTNULLCHECKERRORDEFAULTPRIMARYKEY/UNIQUE,)命令功能:创建数据表的结构。2022/12/664.2.1用Create语句创建基本表(续)命令说明:CREATETABLE表名:指定创建表文件名。FREE:在数据库打开的情况下创建的是自由表。默认在数据库未打开时创建的是自由表,在数据库打开时创建的是数据库表。CHECK:为字段值指定约束条件;ERROR:用来指定当不满足约束条件时显示的出错信息。DFAULT:指定默认的字段值。PRIMARYKEY:指定当前字段为主索引关键字;UNIQUE:指定当前字段为候选索引关键字。NULL/NOTNULL:表示该字段是否可以为空。2022/12/674.2.1用Create语句创建基本表(续)【例4.1】在图书馆管理系统中创建dzzl(读者种类)表,包含zlbh(种类编号)、zlmc(种类名称)、jssl(借书数量)、jsqx(借书期限)、bz(备注)几个字段。OPENDATABASE图书馆管理CTEATETABLEdzzl(zlbhc(10)notnull,zlmcc(10)notnull,jsslc(8),jsqxc(8),Bzc(20)若在命令窗口执行MODIFYSTRUCTURE命令,就可以在弹出的对话框中见到dzzl表结构,如图4-2所示。图图4-2 创建的创建的dzzl表结构表结构2022/12/684.2.1用Create语句创建基本表(续)【例4.2】创建一个名为“通讯录”的自由表,包含姓名、工作单位、电话号码、家庭住址4个字段,所得的表预览如图4-3所示。CREATETABLE通讯录FREE(姓名C(10),工作单位C(20),电话号码C(12),家庭住址C(20)BROWSE由于没有向表中添加任何记录,所以在预览时看不见任何的记录。图图4-3 创建的通讯录表创建的通讯录表2022/12/694.2.1用Create语句创建基本表(续)【例4.3】创建一个“图书订单”的数据库,并在此数据库中创建一个“图书”表,图书表含有订单号、图书编号、书名、单价、数量等字段。CREATEDATEBASE图书订单CREATETABLE图书(订单号C(10);DEFAULT10001,图书编号C(10)PRIMARYKEY,;书名C(10),单价N(8,2);数量N(6)CHECK数量=100AND数量=1000;ERROR数量范围在100和1000之间)图图4-4 图书表的索引图图书表的索引图预览此表的设计器可以看见“图书编号”已经被设为主索引,如图4-4所示。2022/12/6104.2.1用Create语句创建基本表(续)【例4.4】在图书订单数据库中建立一个新表“订单”表,含有订单编号、图书编号、客户编号、订货日期、发货日期几个字段。OPENDATABASE图书订单CREATETABLE订单(订单编号C(10)PRIMARYKEY,;客户编号C(10),订货日期D,发货日期D;图书编号C(10),FOREIGNKEY图书编号;TAG图书编号REFERENCES图书)图图4-5 图书表和订单表之间的关系图书表和订单表之间的关系在命令窗口中输入“MODIFYDATABASE订数订单”命令,可在弹出的“数据库设计器”窗口中见到图书表和订单表之间已建立的关系,如图4-5所示。2022/12/6114.2.2用Alter修改基本表命令格式1:ALTER TABLE ADD/ALTERCOLUMN (字段宽度,小数位数)NULLNOT NULL CHECKERROR DEFAULT PRIMARY KEY/UNIQUE REFERENCESTAG 命令功能:修改表中原有的字段,或者在表中增加新的字段。2022/12/6124.2.2用Alter修改基本表(续)命令说明:ADDCOLUMN(字段宽度,小数位数):增加新字段,并指定新增字段的名称、类型、字段宽度及小数位数。NULLNOTNULL:指定新字段是否接受空值。ALTERCOLUMN(字段宽度,小数位数):修改原有字段,并指定修改后的字段名称、类型、字段宽度及小数位数。其他的参数含义同CREATETABLE。2022/12/6134.2.2用Alter修改基本表(续)【例4.5】修改在例4.2中创建的通讯录表,增加一个“性别”字段,SQL命令如下:ALTERTABLE通讯录ADDCOLUMN性别C(10)再把表中字段“家庭住址”修改为“工作地址”,SQL命令如下:ALTERTABLE通讯录RENAMECOLUMN家庭住址TO工作地址预览修改后的表如图4-6所示,与图4-3对比就可以发现多出了一个字段“性别”,字段“家庭住址”改为了“工作地址”。图图4-6 修改后的通讯录表修改后的通讯录表2022/12/6144.2.2用Alter修改基本表(续)【例4.6】修改例4.3中创建的图书表,将“书名”字段的宽度改为20且不准为空值。SQL命令如下:OPENDATABASE图书订单ALTERTABLE图书ALTER书名C(20)NOTNULL命令格式2:ALTERTABLEALTERCOLUMNNULLNOTNULLSETCHECKERRORSETDEFAULTDROPCHECKDROPDEFAULT 2022/12/6154.2.2用Alter修改基本表(续)命令功能:删除或者设置字段的默认值或约束条件。命令说明:SETCHECKERROR:为字段设置约束条件。SETDEFAULT:设置默认值。DROPDEFAULT:删除默认值。DROPCHECK:删除约束条件。2022/12/6164.2.2用Alter修改基本表(续)【例4.7】在例4.3创建的图书表中,为“图书编号”字段设置一个默认值200601并删除数量的约束条件,SQL命令如下:ALTER TABLE 图 书 ALTER 图 书 编 号 SETDEFAULT200601ALTERTABLE图书ALTER数量DROPCHECK2022/12/6174.2.2用Alter修改基本表(续)命令格式3:ALTERTABLEDROPCOLUMNADDPRIMARYKEYTAGDROPPRIMARYKEYADDUNIQUETAGDROPUNIQUETAGSETCHECKERRORDROPCHECKADDFOREIGNKEYTAGREFERENCESTAGDROPFOREIGNKEYTAGSAVERENAMECOLUMNTO 2022/12/6184.2.2用Alter修改基本表(续)命令功能:删除表中的字段、设置或删除表的主索引、候选索引、对字段重新命名或者删除指定的字段的约束条件。命令说明:DROPCOLUMN:删除指定的字段。ADDPRIMARYKEYTAG:建立主索引。DROPPRIMARYKEY:删除主索引。ADDUNIQUETAG:建立候选索引。DROPUNIQUETAG:删除候选索引。ADDFOREIGNKEYTAG:建立外索引。REFERENCESTAG:指定建立关联的父表。DROPFOREIGNKEYTAGSAVE:删除外索引。RENAMECOLUMNTO:对字段重新命名。2022/12/6194.2.2用Alter修改基本表(续)【例4.8】在例4.3创建的图书表中,为“书名”创建一个候选索引,并且删除“数量”字段,如图4-7所示。SQL语句如下:ALTERTABLE图书ADDUNIQUE书名;ALTERTABLE图书DROPCOLUMN数量图图4-7 例例4.8图图在图4-7中,字段“数量”被删除,并创建候选索引“书名”。2022/12/6204.2.2用Alter修改基本表(续)【例4.9】在第1章创建的“图书管理系统”的dzzl中,为jssl创建一个默认值15,当输入有错误时就会显示“值为15”,删除表中的候选索引。SQL语句如下:ALETERTABLEdzzlALTERjsslSETDEFAULT15;ERROR“值为15”;ALETERTABLEdzzlDROPUNIQUETAGzlbh 2022/12/6214.2.3用DROP命令删除一个表随着数据库设计的变化,数据库的结构也在不断的变化,新建的表就会不断地代替旧表,这时某些旧表就不再需要了,可以用DROP TABLE 命令删除它。命令格式:DROP TABLE 命令功能:删除一个表,包括在这个表上建立的索引。命令说明:指定被删除的表。【例4.10】删除在例4.2中创建的通讯录表,SQL命令如下:DROPTABLE通讯录 2022/12/6224.3数据操纵语言DML数据操纵实际上就是管理数据,这也是创建表的基本目的,主要是对关系中的具体数据进行查询、更新、删除和插入,但不能够改变数据的结构。DML命令如表4-2所示。命令功能UPDATE更新数据库中的已有数据DELETE用于从数据表中删除数据INSERT增加一个新的数据到表中SELECT数据查询表表4-2 DML的命令及功能的命令及功能2022/12/6234.3.1INSERT命令用CREATETABLE命令创建一个表后,创建的表中没有具体的数据,可以用INSERT命令向表中插入数据。命令格式:INSERTINTO表名(列名1,列名2,)VALUES(,)命令说明:INTO表名:指定接受新数据的目标表。VALUES:指明增加记录的字段值。向表中添加的数据必须与指定字段名的类型相匹配。字符串要用单引号或者双引号括起来,日期型可用CTOD函数处理或者直接引用。2022/12/6244.3.1INSERT命令(续)【例4.11】在例4.4创建的订单表中插入一个新的记录:订单编号:200601读者编号:10001订货日期:2006-02-1发货日期:2006-02-10图书编号:100012使用INSERT语句把该记录插入到订单表中,SQL语句如下:INSERTINTO订单(订单编号,读者编号,订货日期,发货日期,图书编号);VALUES(200601,10001,CTOD(02-1-06),CTOD(02-10-06),100012)2022/12/6254.3.2UPDATE命令UPDATE语句用来更新表中的记录。命令格式:UPDATESET=,=WHERE命令说明:UPDATE:指明要修改的记录的表的名称。SET:指明更新的字段名和字段值。WHERE:限定要修改的行,如果没有WHERE子句,该字段下的所有字段值都将被新值替换。2022/12/6264.3.2UPDATE命令(续)【例4.12】把第1章中创建的SJ表中“价格”大于30元且“页数”大于300的图书的“备注”改为“珍贵图书”,SQL命令如下:UPDATESJSETBZ=珍贵图书WHEREJG30ANDYS300若把价格大于30元的或页数大于300页的图书的备注(bz)改为珍贵图书,SQL命令如下:UPDATESJSETBZ=珍贵图书WHEREJG30ORYS300 2022/12/6274.3.3DELETE命令DELETE命令用来删除一行或者多行记录。命令格式:DELETEFROMWHERE命令说明:FROM子句:指出将删除的目标表。WHERE:指明被删除的记录满足的条件,若没有WHERE子句则删除所有记录。【例4.13】在第1章创建的SJ表中,把“价格”大于30元且“页数”大于300的图书记录删掉,SQL语句如下:DELETEFROMSJWHEREJG30ANDYS3002022/12/6284.4查询和SELECT命令SELECT是数据查询命令。SELECT命令虽然属于数据操纵范围,但它是SQL的核心,在SQL命令中使用的是最多的,我们将它和查询单独作为一节。VFP6.0的查询设计器或SELECT-SQL语句可用来方便地检索存储在表或者视图中的信息。利用查询设计器可以搜索满足条件的记录,并且可将查询保存在.qpr文件中。2022/12/6294.4.1创建和添加查询1启动查询设计器若要打开查询设计器,应首先打开一个要查询的数据库,然后采用以下方式之一:(1)“文件”菜单启动查询设计器(2)从“工具”菜单启动查询设计器(3)使用CREATEQUERY命令打开查询设计器2022/12/630(1)“文件”菜单启动查询设计器从“文件”菜单中选择“打开”命令,启动“打开”对话框,并在对话框的“文件类型”中选择“项目”类型,再选取要打开的项目名称,最后单击“确定”按钮,出现项目管理器对话框。在项目管理器中选择“数据”选项卡,再选取“查询”选项。单击“新建”按钮,此时出现“添加表或视图”对话框,然后从数据库下拉列表框中选择待查询的数据库名称。再从“选定”栏中选择“表”或“视图”,本例选择了“表”。从“数据库中的表”列表框中选择要添加的表。重复这一步骤,直到选取了所需要的全部表。单击“关闭”按钮,返回“查询设计器”窗口,如图4-8所示。2022/12/631(1)“文件”菜单启动查询设计器(续)图4-8查询设计器2022/12/632(2)从“工具”菜单启动查询设计器在VFP6.0主菜单中,选择“工具”,指向“向导”,选择“查询”,弹出“向导选取”对话框,再选择“查询向导”,可根据查询向导的提示创建查询。(3)使用CREATEQUERY命令打开查询设计器在命令窗口中输入CREATEQUERY即可打开查询设计器。2022/12/6332创建查询(1)查询设计器查询设计器的窗口如图4-8所示。在查询设计器上半部分的窗口中,列出用户已选定的要查询的表或视图。表或视图之间的连线表示表之间的连接关系。查询设计器下半部分的窗口中有6个选项卡:“字段”:选定包含在查询结果中的字段。“联接”:确定各数据表或视图之间的连接关系。“筛选”:相当于命令SETFILTERTO,利用过滤的方法查找一个特定的数据子集。“排序依据”:决定查询结果输出中记录或行的排列顺序“分组依据”:所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可以完成基于一组的计算。“杂项”:指定是否要对重复记录进行检索,同时是否对记录(返回记录的最大数目或最大百分比)做限制。2022/12/634(2)创建查询的步骤1)按上面介绍的方法打开查询设计器。2)添加出现在查询结果中的表或视图。如本例已打开“图书馆管理”数据库,并已选择添加了Dz.dbf、Jy.dbf和Sj.dbf三个表。3)选定要包含在查询结果中的字段。在“字段”选项卡中,从可用字段列表框中选择需要的字段,即单击需要的字段,再单击“添加”按钮;或者双击需要的字段。4)如果要“可用字段”列表框中的全部字段都包含在查询结果中,可单击“全部添加”按钮;单击“全部移去”按钮,则将已选定的字段(列于选定字段列表框中)全部作废。此时单击“运行”按钮即可看到查询结果。5)保存查询。从“文件”菜单中选择“保存”命令,打开如图4-9所示的“另存为”对话框中,在“保存类型”下拉框中选择“查询”类型,在“保存文档为:”文本框中输入查询文件名,本例取名为“读者借阅”,然后单击“保存”按钮即可。2022/12/635(2)创建查询的步骤(续)图4-9“另存为”对话框2022/12/636(2)创建查询的步骤(续)【例4.14】查询书籍表中的部分信息。将Sj.dbf表添加到查询设计器中,即只对Sj.dbf表操作。操作如下:1)首先打开“图书馆管理”数据库,然后打开查询设计器,添加表Sj.dbf。2)选定要包含在查询结果中的字段。方法是在“字段”选项卡中,从可用字段列表框中选择需要的字段,即单击需要的字段,再单击“添加”按钮;或者双击需要的字段。图4-10列出了本例选择的全部字段。3)单击“运行”按钮得到查询结果,如图4-11所示。2022/12/637(2)创建查询的步骤(续)4)保存查询结果。单击“文件”菜单的“保存”命令,打开“保存”对话框,将查询结果保存。图图4-10 例例4.14图图图图4-11 例例4.14的查询结果的查询结果2022/12/638(2)创建查询的步骤(续)【例4.15】统计表Sj.dbf中记录书籍的价格、页数和书名等信息。为完成统计所有书籍的价格和页数的查询,应将Sj.dbf表添加到查询设计器中。由于本例只要求统计所有书籍的价格和页数,因此只需要选择书籍名称、价格和页数三个字段即可。选择所需的字段后,单击“查询”按钮即可看到查询结果,如图4-12所示。图图4-12 例例4.15 的的“书籍价格书籍价格”查询结果查询结果2022/12/6393创建SELECT-SQL语句(1)认识SELECT-SQL语句利用查询设计器可以方便地创建查询而SELECT-SQL则是一个功能更强大的查询工具,它可直接从一个或多个表中检索数据,其查询结果可用于创建报表、BROWSE或新的数据库表或是临时表,并且SELECT-SQL语句可直接加入到程序中。利用查询设计器创建查询时,系统会自动创建相应的SQL查询语句。单击“查询设计器工具栏”上的“显示SQL窗口”按钮,如图4-13所示,可打开SQL窗口,窗口中所列出的语句就是刚刚利用查询设计器创建的与查询相对应的SQL语句。2022/12/6403创建SELECT-SQL语句(续)表4-3所列是上两例使用查询设计器创建查询得到的SQL语句。在命令窗口中键入MODIFYCOMMANDexample命令,打开程序编辑窗口,再输入下述命令,可得到与使用查询设计器相同的查询结果。1)在命令窗口中输入任一SELECT-SQL语句,然后按Ctrl+W键保存所输入的内容。2)DOexample例例4.14的的SELECT SQL语句语句例例4.15的的SELECT SQL语句语句 SELECT sj.sjbh,sj.sjmc,sj.sjzz,sj.cbs;FROM 图书馆管理图书馆管理!sjSELECT sj.sjmc,sj.jg,sj.ys;FROM 图书馆管理图书馆管理!sj表表4-3 查询设计器创建的查询设计器创建的SELECT SQL语句语句图图4-13 查询设计器查询设计器工具栏工具栏2022/12/641(2)SELECT-SQL语句的语法格式SELECT ALL|DISTINCT TOP nExpr PERCENTAlias.Select_Item AS Column_Name,Alias.Select_Item AS Column_Name.FROM FORCEDatabaseName!Table AS Local_AliasINNER|LEFT OUTER|RIGHT OUTER|FULL OUTER JOIN DatabaseName!Table AS Local_Alias ON JoinCondition INTO Destination|TO FILE FileName ADDITIVE|TO PRINTER PROMPT|TO SCREENPREFERENCE PreferenceNameNOCONSOLEPLAINNOWAITWHERE JoinCondition AND JoinCondition.AND|OR FilterCondition AND|OR FilterCondition.GROUP BY GroupColumn,GroupColumn.HAVING FilterConditionUNION ALL SELECTCommandORDER BY Order_Item ASC|DESC,Order_Item ASC|DESC.2022/12/642(2)SELECT-SQL语句的语法格式(续)SELECT-SQL语句相当复杂,它既可以用于单表的查询,也可以用于多表的查询。1)SELECT子句:在SELECT子句中指定在查询结果中包含的字段、表达式。2)FROM子句:指定所有从中检索数据的表。如果表没有打开,VFP6.0显示“打开”对话框,以便指定文件位置。表打开以后,直到查询结束时才关闭。如果包含FORCE关键字,则在建立查询时会严格按照FROM子句中描述的顺序连接表;若不包含FORCE关键字,则对查询进行优化。使用FORCE关键字,可加快查询速度。DatabaseName!用来指定数据的名称。当包含表的数据库不是当前数据库时,必须指定数据库名称,并且应在数据库名称之后表名之前加上感叹号(!)分隔符。例如,“图书馆管理!sj”表示数据管理数据库的sj表。2022/12/643(2)SELECT-SQL语句的语法格式(续)【例4-16】对图书馆管理数据库,使用FROM子句,查看所有读者的编号、姓名和性别。其中,SELECT子句指定要查询的字段名称,dz.dzbh、dz.dzxm和dz.dzxb分别对应dz表中的编号、姓名和性别。FROM子句表示要查询的字段来自“图书馆管理”数据库的dz表。SELECTdz.dzbh,dz.dzxm,dz.dzxb;FROMdz注意:下面的SELECT语句和上面的语句具有相同的效果:SELECTdz.dzbh,dz.dzxm,dz.dzxb;FROM图书馆管理!dz 2022/12/6444.定义查询结果(1)使用排序选项排序能决定查询输出结果中记录或行的顺序。例如,可按书籍的价格以升序或降序方式对书籍记录进行排序。利用排序依据选项卡可设置查询的排序次序。在“排序依据”选项卡中,“选定字段”可选择要用来排序的关键字段。选定后,添加到“排序条件”框,“排序条件”框中字段的次序决定了查询结果排序时的条件,第一个字段决定了主排序次序,其余字段决定了第二排序次序。例如,在“排序条件”框中的字段顺序是sj.jg、sj.ys,则查询结果将首先按sj.jg进行排序,如果sj表中有一个以上的记录具有同样的jg字段值,这些记录则再按ys进行排序。2022/12/6454.定义查询结果(续)【例4.17】建立查询按书籍价格从低到高排序。观察例4.15的查询结果,可以发现其结果并没有完全按书籍价格的高低输出,若要使输出按书籍价格从低到高排列,可按以下步骤操作:1)打开查询设计器,首先选择“排序依据”选项卡。其中,“选定字段”列出了可用来排序的字段,供用户选择,“排序条件”是用户已选择好的用来排序的字段。2)从“选定字段”框中选定用来排序的字段,由于本例要按书籍价格从小到大的顺序排序,所以应选择字段sj.jg,然后单击“添加”按钮,把它移到“排序条件”框中。3)从“排序选项”的两个单选按钮“升序”和“降序”中选择一个,本例选择“升序”。4)单击常用工具栏中的“运行”按钮。将查询结果同例4.15比较。2022/12/6464.定义查询结果(续)对查询结果进行排序时,在对应的SELECT-SQL命令中可包括ORDERBY子句,它的格式如下:ORDERBYOrder_itemASC|DESC其中,Order_item是排序条件框中选定的排序字段,字段间用逗号(,)分隔。另外,Order_item也可以是一个数字表达式,表示查询结果中列的位置(最左边列的编号为1)。ASC指定查询结果根据排序以升序排序,DESC指定以降序排列,缺省时为升序。如果不使用ORDERBY子句指定查询结果的排列顺序,则查询结果不排序。例4.17对应的SELECT-SQL语句如下:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjORDERBYsj.jg2022/12/647(2)给字段添加说明标题为使查询结果易于阅读和理解,可以给字段添加说明标题,又称别名。给前面设计的“书籍价格”添加说明标题,操作步骤如下:1)打开“书籍价格”查询。2)在“函数和表达式”文本框中键入字段名,接着输入AS和说明标题,如下所示:sj.sjmcAS书籍名称3)单击“添加”按钮,在“选定字段”框中放置带有别名的字段。4)重复步骤2)、3),分别给sj.jg和sj.ys添加说明标题“书籍价格”和“书籍页数”。5)单击“运行”按钮,查询结果中各字段名称已变成相应的汉字说明。对应的SELECT语句如下:SELECTsj.sjbhAS书籍编号,sj.jgAS书籍价格,sj.ysAS书籍页数;FROM图书馆管理!sj2022/12/648(3)使用选择条件选择数据库或表中符合条件的一部分记录而不是全部记录是查询的重要任务。例如,要查询一定日期范围内的借书记录、查询所有女性读者的基本情况等。在查询设计器中,“筛选”选项卡可确定用于选择记录的字段和比较准则,以及输入与该字段进行比较的示例值。设置筛选条件是指设置筛选的逻辑表达式,这个表达式由字段、操作符和数值组成。逻辑表达式主要有下述形式:字段操作符表达式其中,字段是要查询的表中的字段。操作符的含义及使用示例如表4-4所示。2022/12/649(3)使用选择条件(续)在表4-4中,Like筛选操作符的含义是查找每个与字符表达式相匹配的字段。在字符串表达式中可使用百分号“%”和下划线“_”通配符,下划线表示字符串中的任意一个字符,百分号表示任意长度的字符串。操作符操作符比较关系比较关系举例举例=相等相等xk.cj=60,xk.kcbm=02=完全相等完全相等xk.cj=60,xk.kcbm=02Like不精确匹配不精确匹配xk.xh LIKE 19964%,查查询询所所有有学学号号前前五五位位是是“19964”的的学学生生大于大于xk.cj 60,xk.kcbm 02=大于等于大于等于xk.cj=60,xk.kcbm=02小于小于xk.cj 60,xk.kcbm 02=小于等于小于等于xk.cj=60,xk.kcbm=30,选择“否”按钮后,变为sj.jg=操作符。4)在“实例”文本框中输入30。对应的SELECT语句如下:SELECTsj.sjmcAS书籍名称,sj.jgAS书籍价格,sj.ysAS书籍页数;FROM图书馆管理!sj;WHEREsj.jg=302022/12/652(3)使用选择条件(续)【例4.19】在例4.15创建的“书籍价格”查询中,使用LIKE操作符,筛选出书籍名为软件工程的记录。1)打开“统计学生成绩”查询,并选择“筛选”选项卡。2)在“字段”下拉列表中选择sj.sjmc字段。3)在“条件”下拉列表中选择LIKE操作符。4)在“实例”文本框中输入“软件工程”。对应的SELECT语句如下:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.sjmcLIKE软件工程2022/12/653(4)多个筛选条件的组合使用实际使用中,经常需要查询某一范围内的记录。例如,书籍价格在30元以下或者50元以上的所有书籍,或者书籍页数在300页以上且价格在40元以上的书籍等。由于可能同时需要输入两个筛选条件,因此需要考虑筛选条件之间的关系问题。在VFP中,筛选条件间共有三种关系,即与(and)、或(or)和否(not)。例如,“书籍价格在30元以下或者50元以上”可写成sj.jg=50,而“书籍页数在300页以上且价格在40元以上的书籍”可写成sj.ys=300andsj.jg=40。在“筛选”选项卡中,可同时输入多个筛选条件,每一个筛选条件占一行,行与行之间的缺省逻辑关系是“与”(AND),当选择其他关系时,可通过逻辑项对应行的列表来选择。2022/12/654(4)多个筛选条件的组合使用(续)【例4.20】设置“与”筛选条件。前面已经分析过,“书籍页数在300页以上且价格在40元以上的书籍”,可看成两个筛选条件的组合,即sj.ys=300andsj.jg=40。首先建立筛选条件sj.ys=300,然后再建立另一个筛选条件sj.jg=40。由于两个筛选条件之间是“与”的关系,因此不用设置“逻辑”选项。对应的SELECT语句如下:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.ys=300andsj.jg=40 2022/12/655(4)多个筛选条件的组合使用(续)【例4.21】设置“或”(OR)筛选条件。统计“书籍价格在30元以下或者50元以上”的所有书籍,其筛选条件可写成sj.jg=50。在“筛选”选项卡中首先建立两个筛选条件,第一个是sj.jg=50。由于两个筛选条件是“或”关系,因此,还要在第一个筛选条件对应的“逻辑”下拉列表中选择OR运算符。对应的SELECT语句如下:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.jg=502022/12/656(4)多个筛选条件的组合使用(续)【例4.22】设置“非”(NOT)筛选条件。查询“所有书名不是软件工程的书籍”。考察“所有书名不是软件工程的书籍”和“所有书名是软件工程的书籍”是互为否定的。“所有书名是软件工程的书籍”可写成“LIKE”软件工程“”,可先设置筛选条件“LIKE”软件工程“”,然后单击该筛选条件行对应的“否”按钮。对应的SELECT语句是:SELECTsj.sjmc,sj.jg,sj.ys;FROM图书馆管理!sjWHEREsj.sjmcNOTlike软件工程2022/12/6575定向输出查询结果VFP允许查询结果以不同的形式输出。例如,可输出到文件、打印机、临时表和屏幕等。缺省形式是将查询结果显示在浏览窗口中。选择查询结果输出形式的方法是:(1)从“查询”菜单中选择“查询去向”命令,打开“查询去向”对话框,如图4-14所示。打开该对话框的另一个方法是在“查询设计器”工具栏中单击“查询去向”按钮。(2)“查询去向”对话框中列出了7个查询结果的输出形式,且均以按钮形式给出。选择需要的按钮,并单击“确定”按钮即可。图图4-14 “查询去向查询去向”对话框对话框2022/12/6585定向输出查询结果(续)定向输出对应的SELECT子句是INTODestination子句。表4-5为该子句常用格式。如输出到临时表“学生成绩清单”中可写成“INTOCURSOR学生成绩清单”,输出到活动窗口中,可写成TOSCREEN。如果只想暂时保存结果,可将它们发送到数组或临时表中。若要永久保存结果,将它发送到一个表中。查询结果输出形式SELECT子句格式独立的表INTOTABLE表名称数组INTOARRAY数组名称临时表INTOCURSOR临时表名称活动窗口TOSCREEN浏览窗口系统缺省值表表4-5 定向输出查询结果子句形式定向输出查询结果子句形式2022/12/6594.4.2运行查询1运行查询在完成了查询设计并指定了输出目的地后,可以单击“运行”按钮启动该查询,也可以在命令窗口使用DO命令。例如,运行“数籍价格”查询,可在命令窗口输入:DO书籍价格.qpr 2022/12/6602分组查询(1)分组查询。所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可以完成基于一组记录的计算。【例4.23】将读者按家庭住址分组。操作步骤如下:1)新建一个“按读者住址查询”,选择读者表的所有字段。2)选择“分组依据”选项卡,选择dz.jtzz,并单击“添加”按钮。3)为保证分组正确,在“排序依据”选项卡中设置排序条件。例如dz.dzbh。4)运行查询,结果如图4-15所示。2022/12/661(1)分组查询(续)【例4.24】统计在书籍表中每个出版社出版的书籍的数目。操作步骤如下:1)建立一个查询,选择sj表中的所有字段,在“分组依据”选项卡中选择sj.cbs,在“排序依据”选项卡中选择sj.sjbh。2)在“字段”选项卡中,在“函数和表达式”框中输入“count(sj.cbs)as数量”,并单击“添加”按钮。3)运行查询,其结果如图4-16所示。图图4-16 统计出版社的出版数量统计出版社的出版数量2022/12/662(2)为查询增加计算字段【例4.25】统计每个出版社的所出书中价格最低的书籍,可按如下步骤操作:1)创建一个查询,选择书籍表中的sj.sjmc、sj.sjzz、sj.jg,sj.ys。2)选择“字段”选项卡,在“函数和表达式”文本框中输入“MIN(sj.jg)AS最便宜的图书”。3)单击“添加”按钮。4)选择“分组依据”选项卡,选择sj.cbs,并单击“添加”按钮。5)若需要排序,此时可在“排序依据”选项卡中设置排序条件,如sj.ys。“MIN(sj.jg)AS最便宜的图书”是一个函数表达式,在查询结果中以“最便宜的图书”名称给出。此列不是表中原有的字段,而是在生成查询的过程中经过计算得到的,又称为计算列或计算字段。2022/12/663(2)为查询增加计算字段(续)VFP提供了“字符串、数学、逻辑和日期”4类函数。表4-6列出了在SELECT-SQL中经常使用的列函数。列函数均产生一个单值,因此以下查询求出所有图书的总价格。SELECTsj.mcsj.jgsj.sjbhSUM(sj.jg)AS总价格;FROMsj函数功能AVG(列名)求出指定列上的平均值,只适用于数字类型的列SUM(列名)求出指定列上的和。只适用于数字类型的列MIN(列名)求出指定列上的最小值。列可以是数字型、字符型或日期型MAX(列名)求出指定列上的最大值,列可以是数字型、字符型或日期型COUNT(列名)求出指定列上的值的出现个数表表4-6 常用列函数常用列函数2022/12/664(2)为查询增加计算字段(续)在“函数和表达式”文本框中输入函数可以使用表达式生成器,单击“函数和表达式”文本框旁的“.”按钮可启动表达式生