资源预览内容
第1页 / 共147页
第2页 / 共147页
第3页 / 共147页
第4页 / 共147页
第5页 / 共147页
第6页 / 共147页
第7页 / 共147页
第8页 / 共147页
第9页 / 共147页
第10页 / 共147页
亲,该文档总共147页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章 查询和视图,【本章要点】 SELECT - SQL语句 查询的创建和使用 视图的创建和使用 视图与查询的相同点与区别,查询(Qyery)和视图(View)有很多相似之处,都是定义一条SELECTSQL语句,创建视图与创建查询的步骤也非常相似。使用查询,主要是从表中检索或统计出所需数据。而视图不仅具有查询的功能,而且可以改变视图中记录的值,并把更新结果送回到源表中。,第 一 节 查询的创建和使用,一、查询的本质所谓“查询”是指向一个数据库发出检索信息的请求,它使用一些条件提取特定的记录。查询的运行结果是一个基于表和视图的动态的数据集合。查询必须基于确定的数据源。从类型上讲,数据源可以是自由表、数据库表或视图;从数量上讲,源表可以是单张表或多张相关的表。 一般地说,基于多表的查询将更能显示查询的优势并且也更有意义。,一个查询可以用一条SELECTSQL语句来完成。查询保存在一个扩展名为.qpr的文件内。文件中保存的是实现查询的SELECTSQL命令,而非查询的结果。查询和视图设计器在本质上都是SELECTSQL命令的可视化设计方法。,二、使用查询设计器建立查询创建查询的方法有多种: 用CREATE QUERY命令打开查询设计器 选择“文件/新建”菜单或“新建”工具按钮 在项目管理器的“数据”选项卡中创建 (以上三种方法均将打开查询设计器,以便用户创建查询) 直接用SELECTSQL语句编写.qpr文件 注:必须在记事本中编写,并保存为扩展名为.qpr的文件。,【例1】查询学生表(XS.DBF)中学生的学号、姓名、性别、系代号和出生日期。,【例1】查询教师表中年龄在35岁以上(含35岁)的教师的工号、姓名、系代号和年龄情况,按系代号升序排序,同一个系的教师按年龄的降序排序。 1、打开查询设计器并选择数据源查询设计器的打开方法如上述。在新建查询时,系统会提示从当前数据库或自由表中选择表或视图,即选择查询的数据源。如果查询的数据源是多表,则需确定它们之间的联接条件。如果两表间存在永久关系,则将此永久关系作为两表联接的条件。,查询设计器窗口中,上半部为数据表显示区,下半部包括6个选项卡:字段、联接、筛选、排序依据、分组依据和杂项。 字段 用于确定查询要输出的字段或表达式 联接 指定联接表达式,用它来匹配多张表或视图中的记录 筛选 用于确定查询的条件 排序依据 用于指定查询结果的记录顺序 分组依据 用于生成分组查询 杂项 指定是否要对重复记录进行检索,是否对返回的记录的作限制。查询设计器打开后,相应地在系统菜单中增加了“查询”菜单项和显示“查询”工具栏。,2、定义查询的输出内容查询输出内容可以是字段或关于字段的函数或表达式。 在“字段”选项卡中选择可用的字段,“选定字段”列表框中行的顺序为查询的输出顺序 如果输出的列不是直接来源于表的字段,可以在“函数和表达式”文本框中输入一个表达式(尽可能利用表达式生成器) 若要给字段或表达式添加显示时的标题,可在表达式的后面输入 AS 别名,在SELECTSQL语句中,SELECT用于指定输出的字段或表达式,输出的各字段名之间用逗号隔开;FROM子句用于指定数据源表。 例:SELECT Js.gh , Js.xm , Js.xdh , ;year(date()-year(js.csrq) as 年龄 ;FROM sjk!js,3、设置查询的筛选条件通过设置筛选条件,可以定义查询后显示记录的条件。 条件类型:详见教材P117 否:与条件相反 实例:输入比较的条件 逻辑:对话框中一行构成一个关系表达式,“逻辑”列指定了本行与下一行之间的逻辑运算关系(无、与、或),所有的行即构成了显示记录的条件表达式。,在实例中输入比较条件时请注意: 仅当输入字符串与源表中的字段名相同时,才给字符串加引号,否则无需加引号将字符串括起 日期不必加花括号 逻辑值前后必须加点号“ . ” 如果输入源表的字段名,则VFP就将它识别为一个字段 备注及通用字段不能作筛选条件,在SELECTSQL语句中,WHERE子句用于设置筛选的条件。 例:SELECT Js.gh, Js.xm, Js.xdh, ;YEAR(DATE() - YEAR(Js.csrq) as 年龄;FROM sjk!js;WHERE YEAR(DATE() - YEAR(Js.csrq) = 35,4、设置查询结果的排序依据排序决定了查询输出结果中记录的顺序。设置查询结果的排序依据,在“排序依据”选项卡中进行,“排序条件”列表框中的顺序决定了排序的优先权。,在SELECTSQL语句中,ORDER BY子句用于设置了查询输出结果中的排序依据,其中DESC为降序排序(无DESC,默认ASC,即为升序排序)。 例: SELECT Js.gh, Js.xm, Js.xdh, ;YEAR(DATE() - YEAR(Js.csrq) as 年龄;FROM sjk!js;WHERE YEAR(DATE() - YEAR(Js.csrq) = 35;ORDER BY Js.xdh, 4 DESC,5、设置查询结果的分组依据所谓分组,即是对表中具有相同字段值的记录进行压缩,形成一个记录,以完成基于一组记录的计算或统计(即统计的依据)。统计时常用以下函数(作为输出字段): COUNT()函数 计数 SUM()函数 求和 AVG()函数 求平均值 MAX()函数 求最大值 MIN()函数 求最小值分组字段不一定是已选定输出的字段,但分组字段不能是一个计算字段。在SELECTSQL语句中,GROUP BY子句用于设置分组的依据。,如果在分组的基础上,还需要对查询结果进行记录筛选,即取查询结果记录的子集,可单击“分组依据”选项卡的“满足条件”按钮后进行设置 。在SELECTSQL语句中,HAVING子句实现分组结果的筛选。HAVING应该与GROUP BY一起使用。 请注意: WHERE筛选与HAVING筛选之间的区别 教材P120图5-11中的ORDER BY 4 DESC含义,【例2】统计成绩表(CJ.DBF)中各学生的所选课程的总成绩、平均成绩和选课门数,要求输出字段学号、选课门数、总分、平均分,并按总分的降序排序。【例3】统计成绩表(CJ.DBF)中各门课程的总成绩、平均成绩、最高分和最低分,要求输出字段课程代号、总分、平均分、最高分和最低分,并按最高分的降序排序。,【例5】基于成绩表(CJ.DBF)查询所有成绩都不及格的学生名单,要求输出字段包含学号、最高分,并按学号的升序排序。,【例4】基于成绩表(CJ.DBF)查询各学生的不及格课程的门数,要求输出字段包含学号、不及格门数,并按不及格门数的降序排序。,【例6】查询成绩表(CJ.DBF)中平均成绩及格的学生。要求输出字段为学号、平均成绩,并按平均成绩的降序排序。,【例7】查询各系科教师表中男女教师人数,要求查询结果包含系代号、性别和人数。【例8】查询教师表中各系科男女教师人数,要求查询结果包含系代号、男教师人数和女教师人数。,6、对查询结果的其它设置 排除查询结果中所有重复的行由“无重复记录”复选框确定。 设置结果的记录范围 ALL 全部记录 TOP n 前n个记录 n PERCENT 前n %个记录在SELECTSQL语句中,用DISTINCT表示查询结果中无重复记录;设置结果的范围由ALL、TOP n 、n PERCENT表示。,7、运行查询在查询设计器窗口打开的状态下,运行查询的方法有: 菜单操作 查询/运行 命令操作 语法:DO 查询文件名 说明:查询文件的扩展名.qpr不可缺省,查询的输出去向有: 浏览 在浏览窗口显示查询结果(默认的输出) 临时表 在临时只读表中存储查询结果,临时表只存在于内存中,当临时表被关闭时,表将从内存中删除INTO CURSOR 临时文件名 表 将查询结果作为表文件永久保存INTO TABLE 表文件名.dbf, 图形 使查询结果可用于Microsoft Graph应用程序 屏幕 在VFP主窗口或当前输出窗口中显示查询结果 打印机 在打印机上打印输出的结果TO SCREEN / TO PRINTER / TO 文本文件名 报表 将结果输出到报表文件(.FRX) 标签 将结果输出至标签文件(.LBX)在SELECT-SQL语句中,用INTO子句来定向查询结果(见教材P122表5-3示例)。,三、创建多表查询多表查询是指:需要获取的信息分别存储在两张或两张以上的表或视图中。多张表可以是数据库表、自由表或视图的任意组合。创建多表查询时,只要把所有有关的表或视图添加到查询中,并用公共字段联接它们,即:在多表之间建立联接条件。用查询设计器创建多表查询的方法与单个表的方法基本一样。不同之处在于: 表的个数是两个或两个以上 多个表之间需建立联接条件,1、联接的概念 联接和联接条件联接(Join)是指查询或视图的一个数据库操作,即通过比较指定字段中的值,将两张表按一定的方式连接起来,形成一张新的表。联接产生新记录时,必须限定联接的条件,即限定在符合什么条件时,才构成一条新记录。否则联接后产生的新记录数为两张表记录数的乘积,这样的记录并非均有意义。所谓的联接条件即是指这样的限定条件。, 联接类型在建立联接时必须选择一种联接类型。联接的类型有4种: 内联接(Inner Join)两表中仅满足条件的记录才形成新记录。 左联接(Left Outer Join)联接条件左边表中所有记录与右边表中符合条件的记录联接,形成新记录,若无符合条件的记录,则产生一个含NULL值的记录。,右联接(Right Outer Join)联接条件右边表中所有记录与左边表中符合条件的记录联接,形成新记录,若无符合条件的记录,则产生一个含NULL值的记录。 完全联接(Full Join)即为无条件联接,联接条件左边表中的每一条记录要与联接条件可边表中的所有记录联接,形成新记录。慎用!在建立联接条件时,要注意联接条件两字段有左右之分。两张表是一对多关系,则一般父表在左,子表在右。,2、创建多表查询多表查询与单表查询相比较,需要增加以下操作: 向查询中添加多张表 设置表之间的联接条件当向表查询中添加多张表时,如果新添加的表与已存在的表之间在数据库中已经建立了永久关系,则系统将以该永久关系作为默认的联接条件,否则系统将打开“联接条件”对话框,并以两张表的同名字段作为默认的联接条件,由用户确认。,如果两表之间无永久关系,则需要由用户设置联接的条件。此时,系统把两表中的共有的同名字段,作为联接的默认条件;若两表中无同名字段,则对话框中的联接条件为空白,由用户创建联接的条件。对于已存在于查询中的表或视图,可以拖动一张表中的字段到另一表中字段上建立联接条件;或在查询设计器工具栏上选择“添加联接”按钮;或在查询设计器的“联接”选项卡中设置联接条件。,对于已存在的联接,在查询设计器窗口中两表之间存在一条联接线,在“联接”选项卡中显示对应的条件。如果要编辑联接条件,可以双击联接线;或在“联接”选项卡中重新编辑联接条件。如果要删除联接条件,可以在选择联接线后按DEL键;或在“联接”选项卡中选择联接项后,选择“移去”按钮。,联接条件和筛选条件类似,二者都是先比较值,然后选出满足条件的记录。不同之处在于筛选是将字段值和筛选值进行比较,而联接条件是将一张表中的字段值和另一张表中的字段值进行比较。,3、多表查询举例 【例1】基于xs表、cj表和kc表查询各学生各门课程的成绩,要求输出字段为:xh、xm、kcm、cj。 1、新建一个查询,并将xs表、cj表和kc表作为数据源。 注意:涉及三个表或视图的查询,添加数据源的次序应为一、多、一,即必须将纽带表放在中间。 2、按内部联接的方式联接公共字段 xs.xh 与 cj.xh、kc.kcdh 与 cj.kcdh。 3、设置输出字段。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号