版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章,查询与视图,5.1 查询与统计命令,5.1.1 数据筛选命令 设置记录筛选: (1)SET FILTER TO (2)功能:设置当前表中可以被访问的记录必须满足的条件 (对SELECT-SQL命令无效) 设置字段筛选 (1)SET FIELDS TO ALL LIKE|EXCEPT 通配符 (2)功能:指定当前表中可以被访问的字段 SET FIELDS ON 字段筛选有效 SET FIELDS OFF字段筛选无效,SET FIELDS TO关闭所有字段 例5.1 设置STUDENT 表中只有男性记录的学号、姓名、出生日期三个字段可被访问。 USE STUDENT SET FILTER
2、TO 性别 SET FIELDS TO 学号,姓名,性别 LIST,USE STUDENT LIST SET FIELDS TO ALL LIKE 专*筛选专业字段 SET FIELDS ON筛选字段有效(默认) LIST SET FIELDS TO ALL所有字段有效 LIST SET FIELDS TO 关闭所有字段(要有此句) SET FIELDS TO ALL LIKE 专*筛选专业字段 LIST SET FIELDS OFF筛选专业字段无效 LIST,5.1.2 查找定位命令,顺序查找就是按照记录的物理排列顺序查找满足指定要求的记录(查找时不要求索引) 顺序查找: (1)LOCATE
3、 FOR (2)功能:在指定的记录范围内按顺序查找满足条件的第一个记录 继续顺序查找:CONTINUE 功能:按上一个LOCATE的条件在指定范围内从下一条记录起继续查找满足条件的下一个记录,若在指定范围内找到满足条件的记录,指针指向满足条件的第一条记录,函数FOUN()返回.T. EOF()返回.F. 若在指定范围内找不到满足条件的记录,函数FOUN()返回.F. 若范围为ALL或 REST 则EOF()返回.T.,指针定位在指定范围的下一条记录。,索引查找,利用索引文件进行查找。由于在索引文件中各个记录的逻辑位置是索引关键字的值由小到大排列的,因此可以使用二分法(折半法)根据索引关键字的值
4、进行查找。提高查找速度。 (1)SEEK (2)功能:按索引来查找指定的关键段值。 可查找C、N、D型字段值, 值与索引关键字段同 例5.2 在STUDENT表中分别索引查找(1)第一个“金融”的专业学生记录的姓名 (2)1981年10月9日出生的学生姓名。,USE STUDENT INDEX ON 专业 TAG 专业索引 SEEK “金融” ? 姓名 INDEX ON 出生日期 TAG 出生索引 SEEK 1981/10/09 或SEEK CTOD(“10/09/81”) ? 姓名,FIND/ 先索引再FIND查找 只能索引查找C、N型常量, 值要与索引关键字段同 例5.3 在STUDENT
5、表中分别索引查找 第一个“金融”的专业学生的姓名 USE STUDENT INDEX ON 专业 TAG 专业索引 (或:SET ORDER TO TAG 专业索引) FIND 金融 (或:ZY=“金融” FIND &ZY ),例5.4 统计STUDENT 表中奖学金在200-300元之间的学生数 USE STUDENT COUNT ALL FOR 奖学金=200 AND 奖学金=300 TO NUM ? NUM,统计求和 (1)SUM FOR/WHILE TO (2)功能:对当前表中指定范围内指定条件的记录的指定数值字段进行纵向求和,并可将求和结果在于内存变量中 例5.5 统计STUDENT
6、 表中所有妇女学生的奖学金总额 USE STUDENT SUM 奖学金 FOR .not.性别 TO 奖学金总额 ? 奖学金总额,统计平均数 AVERAGE FOR/WHILETO (2)功能:对当前表中指定范围内指定条件的记录的指定数值字段进行纵向求平均值,并可将求平均结果在于内存变量中 例5.6 统计STUDENT 表中所有妇女学生的奖学金平均值 USE STUDENT AVERAGE 奖学金 FOR .not.性别 TO 平均奖学金 ? 平均奖学金,计算命令 (1)CALCULATE FOR/WHILETO (2)对当前表中指定范围内满足指定条件的记录,按指定函数进行计算,并可将结果送入
7、对应的内存变量中保存 例5.7 统计STUDENT 表中的最高奖学金和最低奖学金 USE STUDENT CALCULATE MAX(奖学金),MIN(奖学金) TO 最高奖学金,最低奖学金 ?最高奖学金,最低奖学金 说明:用于CALCULATE中的标准函数有AVG()、SUM()、MAX()、MIN()、CNT(),5.1.4 多表操作,VFP中共有32767个工作区 区号:132767 区名:对前10个区区名:A、B、C.J 工作区别名:可利用 USE ALIAS 可为打开表的工作区取别名。 选择当前工作区 SELECT / 0 说明 :SELECT 0 表示尚未使用的工作区中编号最小的那
8、个工作区作为当前工作区。,当前工作区字段的引用 (1)访问当前工作区中表的字段时,可以直接引用字段名 例:USE STUDENT GO 3 ? 姓名 (2)访问非当前工作区表中的字段时,使用: /. 或 /- 例5.8:SELECT 2 USE GRADE ALIAS CJB GO 3 SELECT 1 USE STUDENT ? CJB-姓名,建立表之间的关联命令 (1)SET RELATION TO INTO ,INTOADDITIVE (2)功能:把当前工作区上的表(主动表)与被动表通过关联字段建立指针联动关系,使得当前工作区上表的指针移动时,被动表的记录指针也发生相应的移动。 说明:
9、(1)是两个关联表的共有的字段。 (2)主动表在当前工作区,被动表在非当前工作区。 (3)被动表须对关键字段索引。 (4)主动表可同时与多个被动表建立关联。 (5)ADDITIVE:建立关联时同时保留已有的关联(若省略,则断开),SET RELATION TO:断开所有关联 (6)关联只是一种临时关系,退出系统时关联自动消失 例5.9 通过在表GRADE 与STUDENT之间按学号建立指针关联 SELECT 2 USE STUDENT ALIAS STU INDEX ON 学号 TAG 学号索引 SELECT 1 USE GRADE SET RELATION TO 学号 INTO STU BR
10、OWSE FIELDS 学号,STU.姓名,STU.专业,课程号,成绩,5.2使用查询设计器建立查询,查询(Query)概念 VFP的查询功能可以使用户从数据库检索所需的数据,可以对查询结果进行排序分类,并可以采用数据表、报表、图形等多种方式存储、显示查询结果。 VFP提供两种方法实现查询: 直接编写SELECTSQL语句并执行; 用查询设计器或查询向导查询文件并运行,查询的设计过程 创建查询时,通常可以遵循以下六个步骤来创建查询。 (1)用“查询向导”或“查询设计器”创建查询。 (2)选择在查询结果中需要的字段。 (3)设置查询记录的条件。 (4)设置排序及分组条件来组织查询结果。 (5)选
11、择查询输出类别,可以是报表、表文件、图表、浏览窗口和表文件等等。 (6)运行此查询。,5.2.1 查询设计器简介,在查询设计器中,用户不用编写命令代码,只要根据设计器提供的交互应用界面,便可构造SELECT-SQL命令并存储成查询文件(文件扩展名.QPR),还可方便地修改、运行查询文件。,启动查询设计器的方法 一、文件菜单 选择系统菜单中的【文件】|【新建】命令,在“新建”对话框中选中“文件类型”下的“查询”单选项,再单击右边的【新建文件】按钮,可启动“查询设计器”,二、在“项目管理器” 1、在“项目管理器”中选择“数据”选项卡,再选取“查询”项,再单击【新建】,进入查询设计方式选择对话框后单
12、击【新建查询】,则启动“查询设计器”,在添加表或视图中选择表,然后关闭 2、在“项目管理器”中选择“数据”选项卡,从“查询”项中选择一个已存在的查询文件,再单击【修改】,也启动“查询设计器”。 三、在命令窗口中使用 CREATE QUERY命令,查询设计器,设计单表查询,查询向导可以引导用户快速设计一个查询。例子:从GXGLXT数据库的Student表中查询系部代号为“04”且是99级的所有学生的信息。 项目管理器 数据 查询 新建 选择设计查询的方式,单击,选择GXGLXT数据库中的Student表,并将该表中的所有字段添加到“选定字段”列表框中。,单击,查询向导字段选取,从中选择Stude
13、nt.系部代号,0,在此输入值,4,取默认值,从中选择“包含”,在此输入值,9,8,单击,单击【预览】按钮可以显示查询结果。根据要求,设置条件如上图。其中,虽然表中没有年级字段,但可通过“学号”得到年级(学号的前二位为年级)。,查询向导筛选记录,选择排序字段,单击【添加】,选择排序方式,调整排序顺序,移动按钮,单击,查询向导记录排序,查询向导限制记录,限制查询结果中所包含的记录数,说明:查询结果中所包含的记录数限制共有四种方式: 1、“部分类型”中选择“所占记录百分比”,“数量”中选择“所有记录”,查询结果集中包含全部记录。,2、“部分类型”中选择“所占记录百分比”,“数量”中选择“部分值”,
14、再在“微调框”中设置数值,查询结果集中包含指定数值百分数的记录。,单击,取默认值,查询结果集中包含全部记录,查询向导限制记录 (2),3、“部分类型”中选择“记录号”,“数量”中选择“所有记录”,查询结果集中包含全部记录。 4、 “部分类型”中选择“记录号”,“数量”中选择“部分值”,再在“微调框”中设置数值,查询结果集中包含指定数值的记录数。,查询向导完成,将查询以文件的形式(.QPR)保存到一个指定的目录中。,将查询保存到一个指定的目录中并运行该文件。,利用查询向导设计的查询功能有限,可以使用查询设计器修改它。,单击,可以查看查询结果集中的全部数据,打开帮助文件,取消所建立的查询,返回到向
15、导的上一步,结束向导,完成查询设计。,单击,保存设计的查询,目录选择下拉列表框,文件名输入文本框,文件类型选择下位列表框,在“文件名输入文本框”中输入“Stud_query”后,单击【保存】按钮,结束查询设计过程。,在项目管理器中的“数据”选项中的查询项下产生了一个查询文件,查询设计器,要设计一个查询文件,首先必须明确查询的目的是什么,即想要得到哪些数据,并以什么方式存在;或者想要得到满足某些条件的特定记录,或者想要知道某些记录的字段值组合成的表达式按某一方式输出。明确了输出的数据后,就可以开始设计查询了.,(1)“字段”:用来选定包含在查询结果中的字段; (2)“排序依据”:用来决定查询结果
16、输出中记录或行的排列顺序; (3)“联接”:用来确定各数据表或视图之间的联接关系; (4)“筛选”:相当于命令SET FILTER TO,利用过滤的方法查找一个特定的数据子集; (5)“分组依据”:所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可以完成基于一组的计算。,查询设计器窗口中选项卡的含义,根据建立查询的目的,选择查询结果中应包含的字段。操作方法与用向导设计查询的方法相同。在本示例中先在“查询设计器”中选择“字段”选项卡,然后从可用字段列表框中选择:Student.学号、Student.姓名、Courses.课程名称、Grade.课程成绩,如图。,选择一个字段,单击【添加】,选
17、定的字段列表,重复操作添加Student.姓名、Courses.课程名称、Grade.课程成绩,选定查询字段,确定各表间的联接关系,例如在GXGLXT数据库中有三个表:Student、Grade、Courses,现在想知道学号前四位是9904和9804的所有学生考试的成绩。 当在多个表或视图间进行查询时,需要指出这些表或视图间的联接关系。在“添加表和视图”对话框中从“数据库”中选择GXGLXT库,在“数据库中的表”中选择Student表,单击【添加】按钮,再选择Grade表,再单击【添加】,此时系统自动,弹出一个“联接条件”,询问是否根据两表中都有的“学号”字段建立内部联接,单击“确定”,两表
18、间就有了一条连线,代表它们之间的联接。然后再添加Courses表,最后关闭对话框。,在“查询设计器”中选择“联接”选项卡,(1)Inner Join : 内部联接,指定只有满足联接条件的记录包含在结果中,此类型是默认的,也是最常用的; 即:只返回完全满足连接条件的记录 (2)Right Outer Join :右联接,指定满足联接条件的记录,以及满足联接条件右侧的表中记录(即使不匹配联接条件)都包含在结果中;即:返回后一个表中的所有记录以及前一个表中匹配的记录 (3)Left Outer Join : 左联接,指定满足联接条件的记录,以及满足联接条件左侧的表中记录(即使不匹配联接条件)都包含在
19、结果中;即:返回前一个表中的所有记录以及后一个表中匹配的记录 (4)Full Join :完全联接,指定所有满足和不满足联接条件的记录都包含在结果中。即:返回两个表中的匹配和不匹配的所有记 录 。,表间的四种联接类型,如果想修改各表间的联接,双击查询设计器上部窗口表之间的连线,系统将弹出“连接条件”对话框;或者通过打开查询设计器下部的“联接”选项卡进行。一般不应随便更改连接条件,不然会与实际数据间的关系不符。 “条件”列表中包含如下几项: (1)=:指字段值与实例相等; (2)LIKE:表示“字段名”栏中给出的字段值与“实例”栏中给出的文本值之间执行不完全匹配,它主要针对字符类型。例如,如设置
20、查询条件为“Student.学号 LIKE 9904”,那么诸如“学号”字段前四位为9904的记录都满足该条件; (3)=:表示在“字段名”栏中给出的字段值与“实例”栏中给出的文本值之间执行完全匹配检查,它也主要是针对字符类型的。,(4):即为“字段名”栏中给出的字段的值应大于“实例”栏中给出的值; (5)=:即为“字段名”栏中给出的字段的值应大于或等于“实例”栏中给出的值; (6):即为“字段名”栏中给出的字段的值应小于“实例”栏中给出的值; (7)=:即为“字段名”栏中给出的字段的值应小于或等于“实例”栏中给出的值; (8)Is Null:指定字段必须包含Null值; (9)Between
21、:即为输出字段的值应大于或等于“实例”栏中的最小值,而小于或等于“实例”栏中的最大值; (10)IN(在之中):即为输出字段的值必须是“实例”栏中所给出值中的一个,在“实例”栏中给出的各值之间以逗号分隔。,此外,“联接”选项卡中的“否”列用于指定.NOT.条件,“逻辑”列用于设置各联接条件和筛选条件之间的逻辑关系(无、.AND.和.OR.) “大小写”列用于指定是否区分大小写。 下方的“插入”和“移去”按钮分别用于增加或移去查询条件。 最后,在设置筛选条件时,我们应注意如下几点: (1)备注字段和通用字段不能用于设置查询条件; (2)逻辑值的前后必须使用句点号,如.T.; (3)只有当字符串与
22、查询的表中字段名相同时,要用引号将字符串括起来,否则不需要用引号将字符串括起来; (4)日期不必用花括号括起来。,选择表中符合条件的一部分记录而不是全部记录是查询的重要任务。此例要求从所有学生的成绩信息中选出“学号”前四位为“9904”和“9804”的所有学生的成绩,可以利用查询设计器中的“筛选”选项卡。“筛选”选项卡可确定用于选择记录的字段和比较准则,以及输入与该字段进行比较的示例值。,筛选记录,在字段名下的下拉选择框中选择“Grade.开课学期”,在“条件”下的下拉选择框中选择“=”,在“实例”下的文本框中输入“第1学期”, 在“逻辑”下的下拉选择框中选择“AND”,然后再在字段名下的下拉
23、选择框中选择“Student.学号”,在“条件”下的下拉选择框中选择“In”,在“实例”下的文本框中输入“9904,9804”(请注意中间的“,”是En状态下输入的)。,选择一个字段,单击【添加】,选定的字段列表,排序决定了输出结果中记录或行的先后顺序。在 “排序依据”选项卡中从“选定字段”框中选定要使用的字段,并把它们移到“排序条件”框中,然后利用“排序选项”(从中选择升序或降序)来设置排序条件。本例中设置Student.学号,升序为排序依据。如果还需要添加用于排序的字段,可以重复以上的操作步骤。,查询结果排序,所谓分组就是将一组类似的记录压缩成一个结果记录,这样就可完成基于一组记录的计算。
24、分组在与某些累计功能联合使用时效果最好,例如SUM(),COUNT(),AVG()等。如果不想压缩结果记录,则不必设置它。在此例中不设分组查询。如果想求各门课程的平均成绩,可以用“课程名称”进行分类查询。,选择一个字段,单击【添加】,选定的字段列表,建立分组查询,操作步骤如下: (1)在查询设计器的“字段”选项卡中,单击“函数和表达式”右边的按钮,出现“表达式”生成器; (2)在“数学”下拉式列表框中双击AVG(expN),在“来源于表”下拉框中选择Grade表,在“字段”列表框中双击“课程成绩”,单击【确定】。即在“函数和表达式”框中自动生成了“AVG(Grade.课程成绩)”这个表达式,用
25、以计算Grade表中课程成绩的平均值。 (3)单击“添加”按钮,该表达式被添加到“选定字段”列表框中。将来查询结果中就会有一列数据求平均值; (4)单击“分组依据”选项卡,进入“分组依据”窗口,在“可用字段”中选择Grade.课程名称,再单击【添加】按钮,该字段即成为分组字段。,杂项的设置,经过以上五个步骤,基本上已生成了一个比较全面的查询。接下来还可以通过查询设计器中的“杂项”选项卡做最后处理。 单击“杂项”选项卡,可以看到其间包括“无重复记录”、“交叉数据表”、“全部”、“百分比”这四个复选框和一个微调按钮。,选中“无重复记录”复选框表示对于查询结果如果存在重复记录,则只取相同记录中的一个
26、。选中此项,在查询生成器的SQL语句中会自动加上限定词Distinct,表示去掉重复记录。,当输出的字段只有三项时,“交叉数据表”复选框为可选状态,否则为不可选状态。选中“交叉数据表”复选框表示将查询的结果以交叉表的形式传递给其它报表或表。三项查询字段分别表示X轴、Y轴和图形的单元值。 如,在本示例中,将前面已加入到“选定字段”中的Student.学号字段移去,并按Student.姓名、Courses.课程名称和Grade.课程成绩的顺序调整字段在“选定字段”列表框中的顺序,然后在“杂项”选项卡中选中“交叉数据表”,同时将“分组依据”中的“Grade.课程代号”取消,其它设置不变。,从图中可以
27、看到“交叉数据表”成为了可选。现选中“交叉数据表”项,如图:,设置,定向输出查询结果,查询检索的信息,可以输出到不同的目的地,以用作不同的用途。如果没有选定输出的目的地,查询结果将显示在浏览窗口中。查询输出目的可以是浏览窗口、临时表、表、图形、屏幕、报表、标签等。 选择结果的去向方法如下: 单击“查询设计器工具”中的【查询去向】按钮,或者从【查询】菜单中选择【查询去向】,【浏览】:在浏览窗口中显示查询结果,查询缺省设置; 【临时表】:将查询结果存储在一个临时只读表中。多次查询的结果可放在不同的表内。该表可用于浏览数据,制作报表等,直到用户关闭它们; 【表】:将查询的结果保存在一个命名的表(.D
28、BF )中,此时查询的结果是真正的存放到磁盘上的,多次查询的结果可放在不同的表内; 【图形】:使查询结果可用于Microsoft Graph(包含在VFP6中的一个独立的应用程序)中制作图表;,对话框中的按钮含义如下:,【屏幕】:在VFP6主窗口或当前活动输出窗口中显示查询结果; 【报表】:将输出送到一个报表文件(.FRX)中; 【标签】:将输出送到一个标签文件(.LBX)中。 选定一个去向,按一定的步骤设置一些属性,然后单击【确定】按钮,系统就将按意图放置查询结果。 假设本例将查询结果保存到临时表中,取临时表名为“查询1”。,对话框中的按钮含义如下:,运行查询,在完成了查询的设计工作并指定了
29、结果输出去向后,可通过以下五种方式之一运行查询: 在查询设计器区域内单击右键,在弹出菜单中选择“运行查询”; 在“项目管理器”中选定查询的名称,然后选定“运行”按钮; 在“查询”菜单中选择“运行查询”: 在命令窗口中键入DO 查询名.qpr。 单击系统常用菜单上的“运行”按钮。,本例中按前述步骤设置后,单击系统菜单上的“运行”按钮运行交叉表查询,并将查询结果保存到临时表“查询1”中,然后再在浏览窗口中单击【显示】|【浏览“查询1”】,结果如右表。,5.3 结构化查询语言SQL,5.3.1结构化查询语言SQL简介 SQL是一种非过程化语言,既用SQL语言编写语言编写程序时,只需指出“做什么”,而
30、不需要知道“怎么干” VFP支持的结构化查询语言SQL命令有: 查询命令SELECTSQL 创建新表命令CREATETABLESQL 修改表结构命令ALTERTABLESQL 追加新记录命令INSERTSQL 逻辑删除命令DELETESQL 更新记录数据命令UPDATESQL 创建临时表命令CREATECURSORSQL 创建视图命令CREATEVIEWSQL,5.3.2 查询命令的基本语法,1.SELECTSQL命令基本格式 SELECT ALL | DISTINCT Alias.Select_Item AS 列名 , Alias.Select_Item AS 列名 . FROM 数据库名!
31、 表名 AS 本地名 ,数据库名! 表名 AS 本地名 . INNER/LEFTOUTER/RIGHTOUTER/FULLOUTER JOIN 数据库名! 表名 本地名 ON 联接条件 WHERE 联接条件 AND 联接条件. AND|OR 筛选条件 AND|OR 筛选条件,ORDER GY 关键字表达式 ASC/DESC,ASC/DESC,关键字表达式 ASC/DESC TOP 数值表达式 PERCENT GROUP BY 组表达式 ,组表达式 HAVING筛选条件 TO PRINTER/FILE 文件名ADDITIVE/SCREEN INTO TABLE 表名/CURSOR 临时表名/AR
32、RAY 数组名,2. SELECT_SQL命令功能 从一个或多个表中查询指定条件的数据并输出。可对查询结果加以排序或分组统计。 默认的输出结果是到浏览窗,可重新定向到打印机、ASCII文件或屏幕,或保存结果到表、临时表或内存变量数组中。,3.参数说明 SELECT子句:指定在查询结果中包含的字段、常量和表达式。 ALL:表示查询结果中包括所有满足查询条件的记录,也包括重复值。默认为ALL。 DISTINCT:在查询结果中剔除重复的行。即在查询结果中内容完全相同的记录只能出现一次 Alias.Select_Item: 指定作为查询结果的列内容,可以是字段名、常量或表达式;Alias表示表名(或表
33、别名),用Alias.标识来自不同表的同名字段 AS 列名 指定查询结果中列的标题 注意 每一个 SELECT 子句只能使用一次 DISTINCT。 例如: SELECT 学号,姓名,专业 as zy FROM STUDENT,TOP nExpr PERCENT 在符合查询条件的所有记录中,选取指定数量或百分比的记录。TOP 子句必须与 ORDER BY 子句同时使用。ORDER BY 子句指定查询结果中包含的列上由Top字句决定的行数, TOP 子句根据此排序选定最开始的 nExpr个或 nExpr% 的记录。 nExpr :选取 1 到 32767 个记录。使用 ORDER BY 子句进行
34、排序产生并列的情况下,可能有多个记录。 若包含 PERCENT 则记录数进行取整。 nExpr 的范围是 0.01 到 99.99。 例如:SELECT top 3 学号,姓名,专业 FROM STUDENT orde by 学号 SELECT top 60 percent 学号,姓名,专业 FROM STUDENT orde by 学号,FROM 数据库名! 表名 AS 本地名 列出所有从中检索数据的表,即数据源。 当包含表的数据库不是当前数据库时,数据库名!指定这个数据库的名称。如果数据库不是当前数据库,就必须指定包含表的数据库名称并加上感叹号(!)分隔符。 AS 本地名 为 表名 中的表
35、指定一个临时名称。,5.3.3 用SELECTSQL命令实现单表查询,1.无条件查询 SELECT列表名FROM表名 (1)查询指定表中所有记录的全部字段内容:在SELECT后用“”表示全部字段,而无需列出所有字段名。 例5.10查询显示第 4 章建立的“学生成绩”数据库STUDENT表中所有学生的详细信息。 SELECT FROM STUDENT 说明:查询结果默认输出到浏览窗口中,(2)查询指定表中所有记录的部分字段内容:用列表名逐一列出所需字段要以“,”分隔。 例5.11查询STUDENT表中所有学生的学号、姓名和专业,并将查询结果直接显示在VFP主窗口中。 SELECT 学号,姓名,专
36、业 FROM STUDENT TOSCREEN 说明:查询输出在VFP主窗口中,(3)查询指定表中所有记录的统计值: 在SELECT后通过函数和表达式构造统计式,通常还使用AS子句为统计式取一个有含义的名称作为查询结果的列标题。 例5.12查询显示STUDENT表中所有学生的最高奖学金、最低奖学金和平均奖学金,并要求在查询结果的列中使用标题名称。 SELECTMAX(奖学金)AS最高奖学金,MIN(奖学金)AS最低奖学金,AVG(奖学金)AS平均奖学金FROMSTUDENT,Select 子句中常用标准函数,例5.13查询显示STUDENT表中所有学生的学号、姓名和年龄 SELECT 学号,姓
37、名,YEAR(DATE( )YEAR(出生日期) AS年龄 FROM STUDENT 例5.14 显示grade(课程成绩表)中的所有记录,并将成绩一项乘以0.7。 SELECT 学号,课程号,成绩*0.7 AS 成绩 FROM grade,2. 条件查询,在SELECT-SQL命令中使用WHERE子句,可设置查询数据的筛选条件. SELECT FROM WHERE 由一系列用AND 或 OR 连接的条件表达式组成,条件表达式的格式可以是以下几种: (1)。 (2)。 (3)ALL() (4) ANY | SOME() (5)NOT BETWEEN AND (6)NOT EXISTS (),(
38、7) NOT IN (8) NOT IN () (9) NOT LIKE SQL支持的关系运算符如下: 、!、。 (1)简单条件查询:在WHERE后使用关系表达式说明查询数据满足的简单条件。 例5.15查询STUDENT表中哪些专业有学生获250元以上(含250)的奖学金,显示专业名称(要求不重复显示) SELECTDISTINCT专业FROMSTUDENT WHERE 奖学金250,(2)复合条件的查询:在WHERE后使用逻辑运算符将几个简单条件组合成复合条件 例5.16查询STUDENT表中所有“金融”专业的男学生的学号和姓名。 SELECT学号,姓名FROMSTUDENTWHERE专业“
39、金融”.AND.性别 或: SELECT学号,姓名FROMSTUDENTWHERE专业“金融”AND性别=.T.,(3)模糊匹配查询:在WHERE子句中使用LIKE运算符,可对字符型数据进行匹配类型的查询。使用的格式为: WHERE NOT LIKE“字符串通配式” (%表示任意个字符或汉字 _表示任意一个字符或汉字) 例5.17查询显示STUDENT中姓“陈”的学生的信息 SELECT * FROM STUDENT WHERE 姓名 LIKE“陈%” 或: SELECT * FROM STUDENT WHERE LEFT(姓名,2)“陈”,例5.18查询显示STUDENT中姓名的第二个字为“
40、力”的学生的信息 SELECT * FROM STUDENT WHERE 姓名LIKE “_力%” 或: SELE * FROM STUDENT WHERE SUBSTR( 姓名,3,2)=“力” 例5.19查询显示STUDENT中姓名中含有“力”的学生信息 SELECT * FROM STUDENT WHERE 姓名LIKE“%力%” 或: SELECT * FROM STUDENT WHERE “力”$ 姓名,between子句: between表示介于两个值之间,有两种格式: between and 或: between (,) 例5.20 查询显示student表中出生于1980处1月
41、1日至1981处12月31日学生的信息 select * from student where 出生日期 between 1980/01/01 and 1981/12/31 或: select * from student where between(出生日期, 1980/01/01,1981/12/31),In 子句: In 是成员判断符,若提供了值的一览表,In 将会告诉指定值是否在该表中。 IN (,) IN的否定运算是NOT IN 例5.21 查询显示STUDENT表中名为“黄伟”、“张三”和“王强”的信息。 SELE * FROM STUDENT WHERE 姓名 IN(“黄伟”,“
42、张三”,“王强”),IS NULL子句: IS NULL用于检查是否为空值NULL IS NULL的否定运算是IS NOT NULL 例5.22:查询STUDENT表中姓名为NULL的记录 UPDATE STUDENT SET 姓名=NULL WHERE 学号=“99004” SELE * FROM STUDENT WHERE 姓名 IS NULL,3. 对查询结果进行排序,在SELECT-SQL命令中使用ORDER BY 子句,可使查询结果按照一定的顺序显示. SELECT FROM WHERE ORDER BY ASC/DESC 说明: :可按某字段名、列序号、AS子句命名的列标题 排序升
43、、降序值按:字段的字母则按ASCII码值大小、汉字则按汉字内码值大小,数值按大小、日期按前后、逻辑按真(大)假(小)顺序排序。,例5.23 查询STUDENT表中的学生信息,并按奖学金相同者按出生日期降序显示。 USESTUDENT SELECT * FROM STUDENT ORDER BY 奖学金 DESC,出生日期 DESC 例5.24 查询STUDENT 表中所有学生的学号、姓名和年龄,并按年龄由小到大的顺序排列 SELECT 学号,姓名,YEAR(DATE()-YEAR(出生日期) AS 年龄 FROM STUDENT ORDER BY 年龄 或: SELECT 学号,姓名,YEAR
44、(DATE()-YEAR(出生日期) AS 年龄 FROM STUDENT ORDER BY 3,4. 分组查询,将查询的结果分组,把具有相同字段值的记录合并为一组。 SELECT FROM WHERE GROUP BY HAVING 说明: 可按字段名、列序号 GROUP BY子句经常和HAVING子句联用,后者给出分组结果再 进行筛选的条件。(在分组操作中:WHERE子句指定了哪些记录参与分组,而HAVING子句指定的是分组后哪些记录作为查询的最终结果输出),例5.25 根据STUDENT表查询各专业的学生数 SELECT 专业 ,COUNT(*) as 人数 FROM STUDENT G
45、ROUP BY 专业 例5.26 根据STUDENT表统计各专业的奖学金总额,输出奖学金大于等于400的专业名称和奖学金总额 SELECT 专业,SUM(奖学金) AS 奖学金总额 FROM STUDENT GROUP BY 专业 HAVING 奖学金总额=400,例5.27 根据STUDENT 表中奖学金大于200的学生信息,统计各专业的奖学金总额,输出专业名称和奖学金总额。 SELECT 专业,SUM(奖学金) AS 奖学金总额 FROM STUDENT WHERE 奖学金=200 GROUP BY 专业,5.3.4 用查询命令实现多表查询,若要同时从两个或多个表中提取数据,则需要将两个或
46、多个表的记录通过相关的字段联接起来进行查询。 VFP提供四种联接类型:内部联接、左联接、右联接、完全联接 两表间的内部联接(INNER JOIN) 从相关联的两表中选取满足条件的记录,按联接条件联接成新记录作为查询的输出。 (实现方法1):使用INNER JOIN 和ON子句实现 SELECT FROM INNER JOIN ON .=.,(实现方法2) :在WHERE 子句中实现 SELECT FROM , WHERE .=. 例5.28 根据表STUDENT2和GRADE2,查询有成绩记录的学生的学号、姓名、课程号和成绩 (方法1) SELECT STUDENT2.学号,STUDENT2.
47、姓名,GRADE2.课程号,GRADE2.成绩 FROM STUDENT2 INNER JOIN GRADE2 ON STUDENT2.学号 =GRADE2.学号,(方法2) SELECT STUDENT2.学号,STUDENT2.姓名,GRADE2.课程号,GRADE2.成绩 FROM STUDENT2,GRADE2 WHERE STUDENT2.学号=GRADE2.学号 说明: (1) 命令中“学号”之前的“表名”及“.”不可少,因为学号字段同时存在于两表中。 (2) 若字段名只出现在一个表中,则可省略“表名”和“.”,2. 两表中左联接查询(LEFT JOIN) 从表1 中选取所有的记录
48、,按联接条件与表2 中相关联的记录联接成新记录输出,若表2 中不存在相关联的记录,则查询输出中相应字段的值用.NULL.代替。 实现方法:用LEFT JOIN 和ON子句 SELECT FROM LEFT JOIN ON . =.,例5.29 根据表STUDENT2和GRADE2,查询所有学生的学号、姓名、课程号和成绩,如果某个学生在GRADE2表中没有相应的记录,也要显示出该学生的信息 SELECT STUDENT2.学号,姓名,课程号,成绩 FROM STUDENT2 LEFT JOIN GRADE2 ON STUDENT2.学号=GRADE2.学号,3. 两表间右联接查询(RIGHT J
49、OIN) 从表2中选取 所有的记录,按联接条件与表1中相关联的记录成新记录输出,若表1中不存在相关联的记录,则查询输出中相应字段的值用.NULL.代替。 实现方法:用RIGHT JOIN 和ON子句 SELECT FROM RIGHT JOIN ON .=.,例5.30 根据STUDENT2和GRADE2,查询所有课程学习者的学号、姓名、课程号和成绩,如果某门课程学习者在STUDENT2中没有相应的记录,也要显示出该课程的信息。 SELECT STUDENT2.学号,姓名,课程号,成绩 FROM STUDENT2 RIGHT JOIN GRADE2 ON STUDENT2.学号=GRADE2.
50、学号,4.两表间完全联接查询(FULL JOIN) 从相关的两个表中选取所有的记录,按联接条件联接成新记录输出,若表1或表2中不存在相关联的记录,则查询输出中相应字段的值用.NULL.代替。 实现方法:用FULL JOIN 和ON子句 SELECT FROM FULL JOIN ON .= .,例5.31 通过表STUDENT2和GRADE2的完全联接,查询两表所涉及到的所有学生的学号、姓名、课程号和成绩。 SELECT STUDENT2.学号,姓名,课程号,成绩 FROM STUDENT2 FULL JOIN GRADE2 ON STUDENT2.学号=GRADE2.学号,5. 多表间的联接
51、查询 例5.32 根据STUDENT2、GRADE2、COURSE查询有成绩记录的学生的学号、姓名、课程号、课程名、学分和成绩,并按学号从小到大排序输出。 SELECT STUDENT2.学号,姓名,GRADE2.课程号,课程名,学分,成绩 FROM STUDENT2 INNER JOIN GRADE2 INNER JOIN COURSE ON GRADE2.课程号=COURSE.课程号 ON STUDENT2.学号=GRADE2.学号 ORDER BY STUDENT2.学号,另一种实现方法: SELECT STUDENT2.学号,姓名,GRADE2.课程号,课程名,学分,成绩 FROM S
52、TUDENT2,GRADE2,COURSE WHERE STUDENT2.学号=GRADE2.学号 AND GRADE2.课程号=COURSE.课程号 ORDER BY STUDENT2.学号,6. 使用嵌套子查询实现多表查询 子嵌套是指嵌套在一个SELECT-SQL命令中的另一个SELECT-SQL命令。 SELECT FROM WHERE IN ( SELECT FROM WHERE ) 说明: (1) 命令过程首先是执行子查询,然后再执行外查询 (2) IN 是关系运算符,的值必须与表2查询出的关联字段的值中一个匹配。,例5.33 根据表STUDENT2和GRADE2查询有85分以上(含
53、85分)成绩记录的学生的学号和姓名(要求不重复显示) (1)不使用嵌套子查询: SELECT DISTINCT STUDENT2.学号,姓名 FROM STUDENT2 INNER JOIN GRADE2 ON STUDENT2.学号 =GRADE2.学号 WHERE 成绩=85 或: SELECT DISTINCT STUDENT2.学号,姓名 FROM STUDENT2 ,GRADE2 WHERE STUDENT2.学号=GRADE2.学号 AND 成绩=85,(2) 使用嵌套子查询: SELECT 学号,姓名 FROM STUDENT2 WHERE 学号 IN (SELECT 学号 FR
54、OM GRADE2 WHERE 成绩=85),5.3.5 SELECT-SQL命令输出去向,由INTO子句和TO 子句指定查询的输出去向,若同时使用INTO子句和TO 子句,INTO优先。 1、INTO ARRAY 将查询结果存放到一个二维数组中。该数组可由查询直接创建,每行存放一条记录,每列对应于结果的一列。若查询结果只有一行,该数组可当作一维数组使用。 2、INTO CURSOR 将查询结果保存在一个只读临时表中。可像一般表一样使用它, 只读,关闭时临时表自动删除。,3、INTO TABLE 将查询结果保存在一个自由表文件(.DBF)中。查询结束后该表自动作为当前表打开。 4、TO FIL
55、E ADDTIVE 将查询结果保存在一个文本文件中(.TXT),若指定文本文件已存在,可使用ADDTIVE追加存入。否则复盖该文本文件。 5、TO PRINTER 将查询结果直接输出到打印机 6、TO SCREEN 将查询结果直接显示在系统主窗口中 7、缺省INTO和TO子句时默认输往浏览窗口。,例5.34 从STUDENT 表中查出所有专业名称(不为空、不重复),并将查询结果保存在数组ZY中。 SELE DISTINCT 专业 FROM STUDENT WHERE !EMPTY(专业) INTO ARRAY ZY 例5.35 对STUDENT 表按专业汇总奖学金总额,并将汇总结果保存在ZYH
56、Z表中 SELE 专业,SUM(奖学金) AS 奖学金 FROM STUDENT GROUP BY 专业 INTO TABLE ZYHZ,例5.36 根据STUDENT、COURSE和GRADE表,查询学号为99003的学生的姓名、所学课程、课程名学分及成绩,并将查询结果保存在临时表TEMP中 SELE 姓名,课程名,学分,成绩 FROM STUDENT,COURSE,GRADE WHERE STUDENT.学号=GRADE.学号 AND COURSE.课程号=GRADE.课程号 AND STUDENT.学号=“99003” INTO CURSOR TEMP,5.3.6 其他的SQL命令,1.
57、创建表命令 (1)基本格式 CREATE TABLE (,) ,(,),) 说明: 用C、N、D、L、M、G代表,其中:D、L、M、G型的宽度自动为8、1、4、4 (2)功能: 创建一个给定每个字段的名称、类型、宽度、小数位数等参数的新表(.DBF),例5.37 创建职工表STAFFS.DBF,该表包括以下字段:职工号(C,6),姓名(C,8),性别(C,2),出生日期(D),婚否(L),工资(L,8,2),简历(M) CREATE TABLE STAFFS (职工号 C(6) ,姓名 C(8),性别 C(2),出生日期 D,婚否 L,工资 N(8,2),简历 M) 例5.38 创建一个表St
58、udent(学生信息表),它由以下字段组成:学号 (C,10);姓名(C,8);性别(C,2);班级名(C,10);系别代号(C,2);地址(C,50);出生日期 (D);是否团员 (L);备注 (M) CREATE TABLE STUD(学号C(10),姓名 C(10),性别 C(2),班级名 C(10),系别代号 C(2),地址 C(50),出生日期 D,是否团员 L,备注 M,照片 G),2.追加新记录,(1) 基本格式 INSERT INTO (, ,) VALUE (,) INSERT INTO FROM ARRAY | FROM MEMVAR (2) 功能 向指定的表末尾追加一条新
59、记录,新记录有关字段的值由VALUES子句中的表达式指定,未指定值的字段将取空值 格式2用数组或内存变量的值赋值给表文件中各字段 :指定表文件中的字段,缺省时,按表文件字段的顺序依次赋值。 :指定要追加的记录各个字段的值。,例5.39 利用INSERT-SQL 命令向STAFFS表追加一条新记录:职工号“101001”,姓名“王小明” INSERT INTO STAFFS(职工号,姓名) VALUE (“101001”,“王小明”) 如果按表中字段排列的顺序依次为新记录的各个字段指定值,则可省略字段名表。 例5.40 利用INSERT-SQL命令向STAFFS表追加一条新记录,内容: “101002”,“李红”,“女”,1964-12-3,.T.,1020.5,“1985年毕业于南方大学财经系” INSERT INTO STAFFS VALUE(“101002”,“李红”,“女”,1964-12-3,.T.,1020.5,“1985年毕
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研八下英语Unit 6 Developing ideas《合作探究四》课件
- 2025 高中信息技术数据结构在视频直播用户互动体验优化课件
- 2026年售楼处装修合同(1篇)
- 2026年箱式变压器租赁合同(1篇)
- 工业园区新建变流器风机配套项目可行性研究报告
- 心律失常的分类和治疗原则
- 2026年及未来5年市场数据中国调脂用药行业市场竞争格局及发展趋势预测报告
- 青少年社会工作概述
- 四川省宜宾市普通高中2023级第二次诊断性测试历史+答案
- 家禽饲养管理技术课件
- 2025统编版道德与法治小学六年级下册每课教学反思(附教材目录)
- 护理疑难病例胰腺癌讨论
- 《经络与腧穴》课件-手厥阴心包经
- 零红蝶全地图超详细攻略
- 2024届高考语文复习:诗歌专题训练虚实结合(含答案)
- 智能交通监控系统运维服务方案(纯方案-)
- 2024年广东中山市港口镇下南村招聘合同制综合工作人员2人历年(高频重点复习提升训练)共500题附带答案详解
- 高一化学学习探究诊断(必修1)(西城学探诊)
- 材料成形工艺基础智慧树知到期末考试答案章节答案2024年华东交通大学
- 高中数学学业水平考试(合格考)知识点总结
- 窄谱中波紫外线在皮肤科的临床用
评论
0/150
提交评论