580 likes | 736 Views
第5章 查询和视图. 第5章 查询和视图. 5.1 查询 5.2 视图 5.3 SQL 语言. 5.1 查询. 查询和视图是检索和操作数据库的两个基本手段。 两者都可以从一个或多个相关联的数据表中提取有用的信息。 查询可以根据表或视图定义,它不依赖于数据库而独立存在,可以显示但不能更新由查询检索到的数据(查询结果是只读的)。 视图兼有表和查询的特点,它可以更改数据源中的数据,但不能独立 存在,必须依赖于某一个数据库。. 5.1.1 查询的概念.
E N D
第5章 查询和视图 • 5.1 查询 • 5.2 视图 • 5.3 SQL语言
5.1 查询 • 查询和视图是检索和操作数据库的两个基本手段。 • 两者都可以从一个或多个相关联的数据表中提取有用的信息。 • 查询可以根据表或视图定义,它不依赖于数据库而独立存在,可以显示但不能更新由查询检索到的数据(查询结果是只读的)。 • 视图兼有表和查询的特点,它可以更改数据源中的数据,但不能独立存在,必须依赖于某一个数据库。
5.1.1 查询的概念 • 通过查询可以对几个相关联的表或视图中的数据,按指定的条件和内容进行检索,得到需要的信息并能对原始数据进行某些统计计算。 • 利用查询设计器可以在交互环境下建立查询文件(.QPR),运行该文件即可获取检索信息。方法是: • (1)选择查询的数据源(包括自由表、数据库表和视图); • (2)选择要检索的字段; • (3)设置查询条件来查找满足用户要求的记录; • (4)设置排序或分组来组织查询结果; • (5)选择查询去向。 • (6)运行查询,获得查询结果。
5.1.2 创建查询 • 1. 启动查询设计器 • (1)项目管理器:选择 “查询”数据项,单击“新建”按钮,出现“新建查询”对话框,选择“新建查询”命令,打开查询设计器。 • (2)菜单:选择“文件|新建”命令,在“新建”对话框中选择“查询”文件类型,然后单击“新建文件”按钮。 • (3)命令:CREATE QUERY <查询文件名> • 2.查询设计器的使用 设计器窗口分上下两部分:上部是数据源,下部有字段、联接、筛选、排序依据、分组依据和杂项6个选项卡。
数据源 设置参数 5.1.2 创建查询 查询设计器
单击此按钮添加自由表 从列表框中选择数据库表或视图 5.1.2 创建查询 • (1)选择数据源:启动查询设计器后,出现“添加表或视图”对话框。单击“添加”按钮,可将表或视图加入设计器中。
输出字段 在列表框中选择要查询的字段 单击此按钮 5.1.2 创建查询 • (2)选择查询字段: 在“字段”选项卡中可以指定查询要输出的字段、函数或表达式。
5.1.2 创建查询 • (3)建立数据表间的联接:当查询是基于多个表时,这些表之间必须有联系,根据联接条件来提取表中相关的数据信息。 • 数据表间的联接条件可以在“联接”选项卡中指定。如果表间已建立了永久关系,则会自动反映在“联接”选项卡中。 • 内部联接:检索两个表中同时满足条件的记录 • 左联接:检索左表中所有记录以及右表中满足条件的记录(右表中不满足条件的记录所对应的字段值为NULL) • 右联接:检索右表中所有记录以及左表中满足条件的记录 • 完全联接:检索两个表中的所有记录
两表间的联接关系线 联接类型 联接条件 5.1.2 创建查询 建立数据表间的联接
5.1.2 创建查询 • (4)指定查询条件:在“筛选”选项卡中建立筛选表达式,选择满足查询条件的记录。
先按成绩字段降序排列,成绩相同的再按学号升序排列先按成绩字段降序排列,成绩相同的再按学号升序排列 5.1.2 创建查询 • (5)组织查询结果:按某个字段顺序排列查询结果或分组排列。 • ① 设置数据排序 在“排序依据”选项卡中指定排序的依据。
5.1.2 创建查询 • ② 设置分组排序 在“分组依据”选项卡中指定分组的依据。 • 分组排序与求和(SUM)、计数(COUNT)、求平均值(AVG)等统计计算一起使用,可以完成一组记录的计算。
5.1.2 创建查询 • (6)杂项选择:在“杂项”选项卡中选择要输出的记录范围,默认将查询得到的结果全部输出。
5.1.2 创建查询 • 3.选择查询去向 打开查询设计器,选择“查询|查询去向”命令,在 “查询去向”对话框中选择输出去向。
5.1.2 创建查询 • (1)浏览 :查询结果输出到浏览窗口(默认)。 • (2)临时表:查询结果存入一个临时的只读数据表中。关闭此数据表时,查询结果将丢失。 • (3)表:查询结果存入表文件,可以作为一个自由表使用。 • (4)图形:查询结果以图形方式输出。 • (5)屏幕:查询结果输出主窗口。 • (6)报表:查询结果输出到一个报表文件中。 • (7)标签:查询结果输出到一个标签文件中。
5.1.2 创建查询 • 4.保存查询文件 选择“文件|另存为”命令。 • 5.运行查询 查询文件保存了建立查询时的各种设置信息,通过运行查询文件,可以按指定的查询去向输出查询结果。 • (1)项目管理器:选定要运行的查询,然后单击“运行”按钮。 • (2)菜单:选择“查询|运行查询”命令,或单击工具栏中的运行按钮“!” 。 • (3)命令:DO <查询文件名.QPR> • 6.修改查询 重新打开查询设计器修改各项设置 • (1)项目管理器: 选中要修改的查询文件,单击“修改”按钮。 • (2)命令:MODIFY QUERY <查询文件名>
5.1.3 查看查询文件 • 利用查询设计器得到的查询文件是一个文本文件,用户可以查看其内容。 • 打开查询设计器,选择“查询|查看SQL”命令,打开一个只读窗口,其中显示了一条SQL语句,它包含了用户创建这个查询的所有信息。
5.2.1 视图的概念 • 通过视图不仅可以从多个表中提取数据,还可以在改变视图数据后,把更新结果送回到数据源表中。 • 视图不能以自由表文件的形式单独存在,它必须依赖于某个数据库,并且只有在打开相关的数据库之后,才能创建和使用视图,视图是数据库中的一个特有功能。 • 依据数据来源可以将视图分为两类: • (1)本地视图:使用本地表或视图 • (2)远程视图:使用ODBC远程数据源 • 如果要保存检索结果,应当使用查询;如果要提取可更新的数据,应当使用视图。
5.2.2 创建视图 • 利用视图设计器可以在交互环境下创建视图。 • 1.启动视图设计器 • (1)项目管理器: 选择数据库中的“本地视图”项,然后单击“新建”按钮,出现“新建本地视图”对话框,选择“新建视图”命令,打开视图设计器窗口。 • (2)命令:CREATE VIEW • 2.视图设计器的使用 与查询设计器相比,视图设计器中只多了一个“更新条件”选项卡,其它都相同。 • 通过在“更新条件”选项卡中设置更新属性,可以把对视图数据的修改回送到数据源表中。
选中此项可以将视图的修改结果回送到数据源表选中此项可以将视图的修改结果回送到数据源表 关键字段 可更新的字段 5.2.2 创建视图
5.2.3 使用视图 • 视图建立之后,就可以象数据表一样使用。 • 视图在使用时,作为临时表在自己的工作区中打开,如果该视图基于本地表,则系统将同时在另一个工作区中打开源表。 • 视图的操作: • (1)使用 USE <视图名> 命令打开视图。 • (2)使用 USE 命令关闭视图。 • (3)在“浏览”窗口中显示或修改视图数据。 • (4)使用SQL语句操作视图。 • (5)在文本框、表格控件、表单或报表中使用视图作为数据源。
5.3.1 SQL语言概述 • SQL语言是数据库的标准语言,几乎所有的关系数据库管理系统都支持SQL标准。SQL语言的主要特点是: • (1)高度集成化 SQL语言集数据定义、数据操纵、数据查询和数据控制功能于一体。 • (2)非过程化 SQL是一种非过程化的语言。 • (3)简洁易学 SQL语言完成数据定义(CREATE、DROP、ALTER)数据操纵(INSERT、UPDATE、DELETE)、数据控制(GRANT、REVOKE)和数据查询(SELECT)等核心功能只用了9个命令动词;而且语法也接近英语自然语法。 • (4)用法灵活 SQL语言既能够以人机交互方式来使用,也可以嵌入到程序设计语言中以程序方式使用。
5.3.2 数据定义 • 标准SQL的数据定义功能非常广泛,包括数据库、表、视图、存储过程、规则及索引的定义等。数据定义语言由3个命令组成。 • (1)定义表:CREATE Table • (2)修改表结构: ALTER Table • (3)删除表:DROP Table
1. 表的定义 • 格式: • CREATE TABLE|DBF <表名>(字段名 类型(宽度,小数位数))[NULL] CHECK <字段有效性规则> ERROR <错误信息> DEFAULT <默认值>PRIMARY KEY|UNIQUE && 主索引|候选索引 • 例如,定义一个名为“学生1.DBF”的数据库表: • CREATE TABLE 学生1(学号 C(8) PRIMARY,; && 学号为主索引 • 姓名 C(8),性别 C(2) DEFUALT “男”,; && 性别的默认值为“男” • 出生日期 D,系别 C(10),贷款否 L,简历 M,照片 G NULL)
2. 表结构的修改 • (1)格式1:添加或修改字段ALTER TABLE <表名> ADD|ALTER <字段名><类型>(宽度,小数位数) • CHECK <字段有效性规则> ERROR <出错信息> • PRIMARY KEY | UNIQUE • 例如, • 在“成绩1”表中添加一个字段:平时成绩 N(5) • ALTER TABLE 成绩1 ADD 平时成绩 N(5) • 将平时成绩字段修改为 N(5,1) • ALTER TABLE 成绩1 ALTER 平时成绩 N(5,1)
2. 表结构的修改 • (2) 格式2:修改或删除默认值、字段有效性规则ALTER TABLE <表名> ALTER <字段名> [SET DEFAULT <默认值>] [DROP DEFAULT] [SET CHECK <有效性规则>] [DROP CHECK] • 例如, • 删除“成绩1”表中平时成绩字段的有效性规则: • ALTER TABLE 成绩1 ALTER 平时成绩 DROP CHECK • 将平时成绩字段的默认值设置为80: • ALTER TABLE 成绩1 ALTER 平时成绩 SET DEFAULT 80
2. 表结构的修改 • (3)格式3:删除字段、更改字段名、设置记录有效性规则等 • ALTER TABLE <表名> DROP <字段名> && 删除字段ENAME COLUMN <原字段名> TO <新字段名> && 更改字段名SET CHECK <记录有效性规则> ERROR <出错信息> [ DROP CHECK ] && 设置或删除记录有效性规则ADD PRIMARY KEY <复合索引表达式> TAG <索引标识>[ DROP PRIMARY KEY ] && 设置或删除主复合索引表达式 ADD UNIQUE <复合索引表达式> TAG <索引标识>[ DROP UNIQUE ] && 设置或删除候选复合索引表达式 • 例:将“学生1”表中的“学号”字段更名为“学生证编号“ • ALTER TABLE 学生1 RENAME COLUMN 学号 TO 学生证编号 • 对“学生1”表中的“姓名”和“出生日期”字段建立主索引 • ALTER TABLE 学生1 ADD PRIMARY KEY 姓名+DTOC(出生日期) TAG 姓名_生日
3. 表的删除 • (3)删除表: DROP TABLE <表名> • 例如,删除“学生1”表 • DROP TABLE 学生1
5.3.3 数据操纵 • (1)插入记录 • 格式1:在表的尾部尾添加一条新记录 • INSERT INTO <表名> (字段1,字段2,……)VALUES (值1,值2,……) • 说明:插入所有字段值时,可省略<字段名表> • 例如,向“学生1”表中添加两条记录: • INSERT INTO 学生1 VALUES(“01020314”,”张红”,“男”,; • {^1982/07/01},”计算机”,.T.,”张红是北京人”,null) • INSERT INTO 学生1(学号,姓名) VALUES(“01020315”,”李兰”) • 格式2:记录值来自数组或同名的内存变量 • INSERT INTO <表文件> FROM ARRAY <数组>|FROM MEMVAR
5.3.3 数据操纵 • (2)删除记录 • 格式:DELETE FROM <表名> WHERE <条件> • 说明:该命令执行的是逻辑删除操作。 • 例如,将“学生1”表中所有男生的记录逻辑删除: • DELETE FOR 学生1 WHERE 性别 = “男” • (3) 更新记录 • 格式:UPDATE <表名> SET <字段名> = <表达式> WHERE <条件> • 例如,将“学生1”表中所有男生的“贷款否”字段改为“.T.” • UPDATE 学生1 SET 贷款否 = .T. WHERE 性别 = “男”
5.3.4 数据查询 • 数据查询是SQL语言的核心,也称作SQL-SELECT命令。使用SQL-SELECT命令,可以对数据源进行各种组合,有效地筛选记录、管理数据、并对结果排序及指定输出去向等,无论查询多么复杂,其内容只有一条SELECT语句。 • SQL-SELECT 命令可以进行多个查询块的嵌套查询,以完成更复杂的查询任务。
5.3.4 数据查询 • 格式:SELECT [DISTINCT] [TOP<数值> [PERCENT]] [<别名1>.]<选项1> AS <列名1>, [<别名2>.]<选项2> AS <列名2>,……FROM <表1> [AS <别名1>],<表2>[AS <别名2>],…… [[INNER|LEFT|RIGHT|FULL] JOIN <表2> ON <联接条件>] [INTO <目标>]|TO FILE <文件名>|TO PRINT [WHERE <筛选条件> [AND <联接条件>]] • [GROUP BY <分组项>] [HAVING <筛选条件>] [ORDER BY <排序项1>, <排序项2>] • [UNION SELECT <命令>]
5.3.4 数据查询 • 1. 基本查询:SELECT…FROM…WHERE • 例如,从“学生”表中查询所有男生的学号、姓名和出生日期: • SELECT 学号,姓名,出生日期 FROM 学生 WHERE 性别=“男” • 2. 带特殊运算符的条件查询:在 WHERE 子句所带的筛选条件表达式中可以使用一些特殊运算符,如 IN、BETWEEN…AND…、LIKE。 • 例如,查询成绩良好(75~85分)的学生和课程信息: • SELECT * FROM 成绩 WHERE 成绩 BETWEEN 75 AND 85 • 3. 排序查询:使用 ORDER BY子句,可以对查询结果按升序(ASC)或降序(DESC)排列。 • 例如,按课程号输出学生的各科成绩,同一门课按成绩降序排列: • SELECT * FROM 成绩 ORDER BY 课程号, 成绩 DESC
5.3.4 数据查询 • 4.计算与分组查询:使用 GROUP BY子句可以实现分组查询,通常与计算查询(如计数、求和、求平均值等)结合使用,先按指定的数据项分组,再对各组汇总计算。 • 例如,查询各门课程的平均成绩: • SELECT 课程号,AVG(成绩) AS 平均成绩 FROM 成绩 GROUP BY 课程号 • 5. 多表查询:多表查询时,表和表之间必须有联接关系,在WHERE子句中可以指定表间的联接关系。其格式为: • <表名1>.<字段名1> = <表名2>.<字段名2> 或 • <别名1>.<字段名1> = <别名2>.<字段名2> • 例如,查询各门课程的平均成绩,要求输出课程名和成绩信息: • SELECT 课程名,AVG(成绩) AS 平均成绩 FROM 课程 KC,成绩 CJ; • WHERE KC.课程号 = CJ.课程号 GROUP BY CJ.课程号
5.3.4 数据查询 • 6. 联接查询:利用 FROM…ON子句建立两表之间的联接。 • 格式:FROM <表名1> INNER | LEFT | RIGHT | FULL JION <表名2> ON <联接条件> • 说明:INNER JOIN(内部联接)、LEFT JOIN(左联接)、RIGHT JOIN(右联接)、FULL JOIN(全联接)的含义与 4.1.2 节中相同 • 例如, • 查询各门课程的平均成绩,要求输出课程名和成绩信息: • SELECT 课程名,AVG(成绩) AS 平均成绩 FROM 课程 KC ; • INNER JOIN 成绩 CJ; • ON KC.课程号 = CJ.课程号 ; • GROUP BY CJ.课程号
5.3.4 数据查询 • 7. 嵌套查询:在一个 SELECT 命令的 WHERE 子句中出现另一个 SELECT 命令(即子查询)。 • 子查询的结果必须是确定的值。 • 例如,查询李华同学所学课程的课程名和成绩: • SELECT 课程名, 成绩 FROM 课程 KC, 成绩 CJ; • WHERE KC.课程号 = CJ.课程号 ; • AND CJ.学号 = (SELECT 学号 FROM 学生 WHERE 姓名 =“李华”) 子查询 WHERE 子句中同时包含联接条件和筛选条件
5.3.4 数据查询 • 8. 查询输出:查询结果默认显示在浏览窗口中,通过 INTO子句或TO子句可以对输出重定向。 • 格式: • INTO ARRAY <数组> | CURSOR <临时表> | && 保存到内存DBF <表文件> | TABLE <表文件> && 保存到表文件 • TO FILE <文本文件> && 保存到文本文件 • TO PRINT && 打印 • 例如,查询各门课程的平均成绩,结果保存在“平均成绩”表中。 • SELECT 课程号,AVG(成绩) AS 平均成绩 FROM 成绩; • GROUP BY 课程号 INTO TABLE 平均成绩
6.1.1 基本概念 • 1.程序 能够完成特定任务的命令序列,存储在命令文件(.PRG)中。运行该文件可自动执行一系列操作。 • 2.结构化程序设计 用结构化编程语句来编写程序。 • 3.程序的基本结构 • (1)说明部分:一般是一组注释语句。 • (2)初始化部分:设置程序运行时的系统状态和参量初值。 • (3)程序主体部分:包括数据输入、处理和输出3个模块。 • (4)还原部分:将当前的工作环境恢复到执行该程序前的状态。 • (5)程序的退出:程序运行完毕,返回 VFP 应用程序窗口或退出VFP,返回操作系统。
6.1.2 程序文件的建立 • 1.项目管理器 :选择 “程序”项,单击“新建”按钮,打开代码编辑窗口,输入程序内容。然后选择“文件|保存”命令将编写的代码存入磁盘。 • 2. 菜单:选择“文件|新建”,在“新建”对话框中选择“程序”文件类型,单击“新建文件”按钮,进入代码编辑窗口。 • 3. 命令:MODIFY COMMAND <程序文件名> • 输入命令语句时,必须一条命令占一行,一行写不下时,在行尾加续行符(;),换行后接着书写该命令语句。
注释语句 命令序列 6.1.2 程序文件的建立 代码编辑窗口
6.1.3 程序文件的修改 • 对已建立的程序文件可以重新进入代码编辑窗口修改内容。 • 1.项目管理器:选中要修改的程序文件,单击“修改”按钮,重新打开代码编辑窗口。修改后,选择“文件|保存”命令,保存程序。 • 2.菜单:选择“文件|打开”命令,将要修改的程序文件调入代码编辑窗口。 • 3.命令:MODIFY COMMAND <程序文件名>
6.1.4 程序文件的执行 • 1. 项目管理器:选中要执行的程序文件,单击“运行”按钮。 • 2. 菜单:选择“程序|运行”命令。 • 3. 命令:DO <程序文件名>
6.2.1 基本命令 • l.注释命令 非执行语句,用于提高程序的可读性。 • NOTE、*(行首注释)、&&(行尾注释) • 2. 环境设置命令 set 命令。 • 3. 清除命令:CLEAR(清屏) • CLEAR ALL(关闭所有文件、清除所有内存变量) • 4. 关闭文件命令: CLOAE ALL (关闭所有文件) • CLOSE<文件类型> (关闭指定类型的文件) • 5. 运行中断和结束命令 • Cancel终止程序运行,返回命令窗口。 • RETURN 结束当前程序的执行,返回到调用它的上级程序。 • QUIT关闭所有文件,退出 VFP 系统,返回操作系统环境。
6.2.2 输入/输出命令 • 1.基本输出命令:?|?? <表达式1>[,<表达式2>…] • 2. 单字符输入命令:WAIT • 3.字符串输入命令:ACCEPT TO <内存变量> • 4.表达式输入命令:INPUT TO <内存变量> • 5.格式输入输出命令 • 格式1:@ <行号,列号> SAY <表达式> • 功能:在主窗口指定的位置处显示表达式的值 • 格式2:@ <行号,列号> SAY <表达式> GET <变量> • READ • 功能:在窗口指定位置处分别显示表达式和变量的值。若使用READ语句,则可以对变量进行修改。
6.3 程序的基本控制结构 • 1.顺序结构:按程序中语句的书写顺序逐条执行。 • 2.分支结构(选择结构):根据逻辑条件的结果执行不同的命令序列。 • (1)单分支结构:IF...ENDIF • (1)双分支结构:IF...ELSE...ENDIF • (2)多分支结构:DO CASE...ENDCASE • 3. 循环结构:按规定的条件重复执行一段命令序列。 • (1)DO WHILE...ENDDO • (2)FOR ... ENDFOR • (3)SCAN …ENDSCAN 对数据表的循环操作。 • 说明:分支结构或循环结构可以嵌套,但分支与分支之间或循环与 循环之间不能交叉。
Y N N 条件 条件 语句列1 语句列2 Y 语句列 ENDIF后面语句 ENDIF后面语句 6.3 程序的基本控制结构 双分支结构流程图 单分支结构流程图
Y 条件1 语句列1 N 条件2 语句列2 N 条件n 语句列n N 有 OTHERWISE 其它语句列 无 ENDCASE后面语句 6.3 程序的基本控制结构 多分支结构流程图
N 条件 N 条件 Y Y 循环体 循环体 LOOP ENDDO后面语句 EXIT ENDDO后面语句 6.3 程序的基本控制结构 循环结构 含有 LOOP或 EXIT的循环结构