收藏 分享(赏)

程序设计 课件第5章.ppt

上传人:dzzj200808 文档编号:3363717 上传时间:2018-10-18 格式:PPT 页数:65 大小:246.50KB
下载 相关 举报
程序设计 课件第5章.ppt_第1页
第1页 / 共65页
程序设计 课件第5章.ppt_第2页
第2页 / 共65页
程序设计 课件第5章.ppt_第3页
第3页 / 共65页
程序设计 课件第5章.ppt_第4页
第4页 / 共65页
程序设计 课件第5章.ppt_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、基本要求与基本知识点 (1)掌握SQL的数据查询功能,包括简单查询、关联查询及超联结 (2)掌握SQL的数据操作功能 (3)掌握SQL的数据定义功能,第5章 关系数据库标准语言SQL,(1)SQL的数据查询功能 (2)SQL的数据操作功能 (3)SQL的数据定义功能,教学重点与难点,SQL是结构化查询语言Structured Query Language的缩写,SQL包括数据定义、数据查询、数据操纵和数据控制等功能,其中查询是SQL的主体,SQL已作为关系数据库管理系统的标准化语言。 本章主要讲述SQL的数据定义、数据查询、数据操纵等功能。,5.1 SQL概述,SQL的定义功能可以定义数据库、

2、表、试图、存储过程、 索引等,VFP主要支持表和视图的定义。 1、表的定义 CREATE TABLE | DBF 表名 FREE (字段名1 字段类型 (宽度,小数点位)NULL | NOT NULL CHECK ERROR 出错信息 DEFAULT 表达式 PRIMARY KEY|UNIQUE(侯选索引) ,字段名2,5.2 数据定义,【功能】定义(创建)一个表。 【说明】用CREATE TABLE命令可以完成第3章介绍的“表设计器”的所有操作,各选项作用如下: (1)TABLE与DBF等价,都是建立表文件;指定新建表的名称。 (2) FREE :指定建立自由表,即新建立的表不添加到打开的数

3、据库中。 (3) (, ):指定字段名、字段的数据类型、字段宽度及小数位数。字段类型可以用类型字符表示,例如字符型用C,数值型用N表示。,(4) NULL | NOT NULL:指定该字段值可以为空 或不能为空,默认值是NOT NULL。 (5) CHECK:指定该字段的合法值以及该字段值的约束条件;ERROR :指定在浏览或编辑窗口中为该字段输入的值不符合CHECK子句的条件时显示的提示信息。,(6) DEFAULT:为该字段指定一个默认值,表达式的数据类型与该字段的数据类型要一致。每添加一条记录时,该字段自动取该默认值。 (7) KEY:为该字段创建一个主索引,索引标识名与字段名相同。主索

4、引字段值必须惟一;UNIQUE:为该字段创建一个候选索引,索引标识名与字段名相同。,例1:建立成绩表 Create table 成绩表(Xh C(7), kh C(2),cj N(5,1)) 例2:建立一个学生数据库,并建立属于学生数据库的 学生表和成绩表 Create database student Create table 学生表(xh c(7) primary key, xm c(8),xb c(2) default “男”, bj c(20) default “2002级会计1班”, zf n(5,1) check(zf=0 and zf=500) Error”总分的值超界”),例2

5、:用SQL语句创建学生基本信息表stud1,stud1表由学号、姓名、性别、班级、出生日期、是否团员、特长、照片组成。要求以学号为主索引,姓名不允许有空值。(为区别于第3章所创建的stud表,此处使用表名stud1。)创建表之后,显示表的结构。,CREATE TABLE stud1 (学号 C(9) PRIMARY KEY, 姓名 C(8) NOT NULL, 性别 C(2),班级 C(14), 出生日期 D, 是否团员 L, 特长 M, 照片 G ) LIST STRU,注意:创建表后,新创建的表即成为当前数据表,可以在命令窗口中输入命令: APPEND FROM 把已经存在的表中的数据追加

6、到新建表中。但要求两个表的结构要完全一致。 Crea table sc1(学号 C(9),课程号 C(3),成绩 N(6,2) Appen from sc,格式1:ALTER TABLE ADD | ALTER COLUMN (,) NULL | NOT NULL CHECK ERRORDEFAULT PRIMARY KEY | UNIQUE 该格式主要是用于添加新的字段或修改已有字 段的类型、宽度、有效性规则、错误信息、缺省 值、主关键字和联系等,但不能修改字段名、删 除字段、删除已经定义的有效性规则。 例如:Alter table new2 add km c(12),2、表结构的修改,例1

7、. 在stud1表中增加“籍贯”字段,字段类型为字符型,长度为10。 ALTER TABLE stud1 ADD 籍贯 C(10)例2. 将stud1表的“籍贯”字段宽度修改为14,设置合法值的左面6个字符为“北京市”或“上海市”。 ALTER TABLE stud1 ALTER 籍贯C(14) ; CHECK LEFT(籍贯, 6)= “北京市“ .OR. LEFT (籍贯, 6)= “上海市“ 【注意】执行命令前需要将stud1表中所有记录的“籍贯”字段开头三个汉字设置为北京市或上海市,以满足CHECK规则。,2、表结构的修改,格式2:ALTER TABLE 表名 ALTER COLUMN

8、 字段名 NULL|NOT NULLSET CHECK 表达式 ERROR 出错信息SET DEFAULT 表达式DROP DAFAULT DROP CHECK 【功能】修改指定表中指定字段的DEFAULT和CHECK约束规则,不影响原有表中的数据。 【说明】 :指明被修改表的表名。 ALTER COLUMN :指明要修改列的字段名。 NULL | NOT NULL:指定该字段可以为空或不能为空。 SET DEFAULT :重新设置该字段的默认值。, SET CHECK ERROR :重新设置该字段的合法值限定,要求该字段的原有数据满足合法值限定条件。 DROP DEFAULT:删除默认值。

9、DROP CHECK:删除该字段的合法值限定。,例 删除stud1表中“籍贯”字段的合法值约束,然后设置字段中左面6个字符的默认值为“山东省”。 ALTER TABLE stud1 ALTER 籍贯 DROP CHECK ALTER TABLE stud1 ALTER 籍贯 SET DEFALUT LEFT(籍贯, 6)=“山东省” 例:alter table new1 alter zf ;set check (zf=0 and zf=500);error “总分值应在0500之间”;set dafault 0,格式3:ALTER TABLE DROP COLUMN RENAME COLUMN

10、 TO SET CHECK ERROR DROP CHECKADD PRIMARY KEY TAG FOR DROP PRIMARY KEY ADD UNIQUE TAG FOR DROP UNIQUE TAG 【功能】删除指定表中的指定字段,修改字段名,修改指定表的完整性规则,包括添加或删除索引及表的合法值限定。 【说明】, DROP COLUMN :从指定表中删除指定的字段。 SET CHECK ERROR :为该表指定合法值限定及错误提示信息。 DROP CHECK:删除该表的合法值限定。, ADD PRIMARY KEY TAG : 为该表建立主索引,一个表只能有一个主索引。 DROP

11、 PRIMARY KEY:删除该表的主索引。 ADD UNIQUE TAG :为该表建立候选索引,一个表可以有多个候选索引。, DROP UNIQUE TAG :删除该表的候选索引。 修改自由表时,不能使用DEFAULT、PRIMARY KEY等子句或SET子句。,例 删除stud1表中的“籍贯”字段,将“特长”字段名改为“专长”。 ALTER TABLE stud1 DROP 籍贯 RENAME COLUMN 特长 TO 专长,例如:将new2表的kh字段名改为kch alter table new2 rename kh to kch 例如:建立一个按照xh+kch进行索引的索引方式 Alt

12、er table new2 add unique xh+kch Tag xh_kch,DROP TABLE 将指定的表文件从磁盘上删除,如果是数据库中 的表文件应将表文件所属的数据库打开,再进行 删除,即将数据表文件从磁盘上删除,同时,清 除表与数据库的关系。 Open database data1 Drop table 学生表,3、表的删除,主要完成数据的插入、删除和更新等操作 1、插入 格式1 INSERT INTO VALUES () 功能:在指定的表文件末尾追加一条记录。将表达式表中的值赋给中相应的各字段;,5.3 数据操纵,说明: :指定表文件中的各个字段,如果省略,按表文件字段的顺

13、序依次赋值。 :指定要追加的记录各个字段的值。 在INTO子句中没有出现的字段,新记录将取空值(或默认值),但表定义中说明了NOT NULL的字段不能取空值。,格式2(只适用于VFP的特殊格式) Insert into dbf_name from arraay 数组名|from memvar 从指定的数组中插入记录的值或从同名的内存 变量来插入记录的值,如果同名的内存变量不 存在,则相应的字段为默认值或空值 例如:在new2表中插入一条新记录 Declare aa(5) Aa(1)=“1313”,aa(2)=“0005”,aa(3)=82 Insert into new2 from array

14、 aa, 用表达式方式追加第1条记录: INSERT INTO stud1(学号, 姓名, 性别, 班级, 出生日期, 是否团员, 籍贯) ; VALUES (“200621054“,“刘玉坤“,“男“,“06自动化“, 1989/04/28, .T. , “浙江绍兴“),例如 分别使用3种不同的方法在stud1表的末尾追加3条记录,然后显示数据表的记录。, 用数组方式追加第2条记录: DIMENSION DA(9) DA(1)=“200605011“ DA(2)= “夏雨薇“ DA(3)= “女“ DA(4)= “06国际贸易“ DA(5)=1989/09/02 DA(6)=.F. DA(9

15、)= “湖南长沙“ INSERT INTO stud1 FROM ARRAY DA, 用内存变量方式追加第3条记录: 学号=“200626068“ 姓名=“柳依依“ 性别=“女“ 班级=“06社会工作“ 籍贯=“广西桂林“ 出生日期=1989/02/21 是否团员=.T. INSERT INTO stud1 FROM MEMVAR,update 表名 set 字段名1=表达式1 ,字段名1=表达式1 where 功能:更新指定表文件中满足WHERE条件的记录数据。 其中SET子句用于指定字段和修改的值 WHERE子句用于指定更新的记录,如果省略WHERE,则更新表中所有记录。,2、更新,【例】

16、将SC1选课表中所有课程号为02的成绩加上5分,然后再将SC1选课表中所有记录的成绩提升10%。 UPDATE SC1 SET 成绩 = 成绩 + 5; WHERE 课程号=“02“ UPDATE SC1 SET 成绩 = 成绩 * (1+ 0.1),2、更新,3、删除 格式:delete from 表名 where 该删除为逻辑删除,如需执行物理删除则执行pack Delete from new2 where cj60 【例】删除STUD1表中所有88年出生的记录。 DELETE FROM STUD1; WHERE YEAR(出生日期) = 88,完成单表或多表中数据的查询,又称Select

17、查询 1.语句格式 Select distinct , From 表名1 , as Where group by ,having order by asc|desc,5.4 数据查询,功能:根据where子句中的条件表达式,从 指定的表或视图中找出满足条件的元组,按照 select子句中指定的列和顺序显示查询到的元组 结果。 Select子句:说明要输出的结果元组中需要的字段 From子句:说明查询的数据来源,包括表和视图 Where子句:说明查询的条件,Group by子句:用于对查询结果进行分组,可 以利用分组进行分组汇总 Having子句:与group by结合使用,用于限定 分组必须要

18、满足的条件。 Order by子句:对查询的结果进行排序 SQL的查询主要有简单查询、联接查询、嵌套查 询、使用库函数查询等,简单查询指基于单个表的查询,或仅由SELECT-FROM子句构成的无条件查询,或由 SELECT-FROM-WHERE构成的简单条件查询。)*的使用例如:从学生成绩表中查询所有学生信息select * from 学生成绩表,.简单查询,)查询学生成绩表中高数成绩在80分以上的元组,输出姓名、学号、高数三列信息select 姓名,学号,高数;from 学生成绩表 where 高数=80,Where子句后可以是复合条件,可以包括、=、=、=、 !=以及逻辑运算符and、or

19、、not,.简单查询,3)空值NULL的使用 查询家庭住址为空的元组 Select * From 学生表 Where 家庭住址 is NULL 说明:NULL不是一个具体的值,它只是一个 表示空值的谓词,其一般格式为: 列名 is not null 不能写成“列名=NULL”,4) Distinct谓词的使用:去掉结果中的重复元组 例如:列出图书馆中所有图书的书名和出版社 Select distinct 书名,出版社 From 图书,5)between,in,like三种谓词的使用 Betweenand 谓词:用于确定条件的范围 或区间 例如:查询高数成绩在60分和90分之间的学生 Selec

20、t * From 学生成绩表 Where 高数 between 60 and 90 Betweenand等价于高数=60 and 高数 =90,In谓词的使用:表示包含的关系 例如:在学生选修成绩表中查询选修了课程01 和02两门课的所有学生的成绩信息 Select * From 选修表 Where 课号 in (“01”,”02”) In谓词的使用相当于or的用法 相当于Where 课号=“01” or 课号=“02” 相反的操作:Where 课号 not in (“01”,”02”),Like谓词的使用:进行字符串的匹配比较下划线:匹配任意一个字符百分号:匹配任意多个字符 例如:查询学生信

21、息表中家庭住址是青岛地区 的学生信息 Select * From 学生信息表 Where 家庭住址 like “青岛%” 也可以使用not like进行匹配,6)group by 子句的使用 例如:将学生选修课成绩表按照学号进行分组显示 Select * From 选修表; Group by 学号7)OEDER by子句的使用 Select * From 学生成绩表; Where 总分300 Order by 高数,注:如果语句在输入时一行写不完,则可以采用分号做续行符,1)基于多个表的查询 在from子句中指定查询的表,在from或where子句 中指明查询时的联接条件。 例如:查询选修过课

22、程的所有学生信息 Select * from new1,new2 Where new1.xh=new2.xh 上述联接为等值联接,即只有满足条件的记录才会在结果中显示。,3.联接查询,主要在from 子句中,不放在where子句中 格式为:select * from table inner | left | right | full join table on 联接条件注意:VFP的select语句的联接格式只适用于两 个表的联接,如果有多个表的联接,则还应使 用where格式(即标准格式)。,2)超联接,【例】查询并显示各个学生的学号、所学课程及课程成绩,要求按成绩排序。 SELECT A.

23、学号, B.课程名, B.成绩; FROM SC A INNER JOIN COURSE B ; ON A.课程号 = B.课程号 ORDER BY 成绩 此查询的WHERE等价表达式为: SELECT A.学号, B.课程名, B.成绩; FROM SC A, COURSE B ; WHERE A.课程号 = B.课程号 ORDER BY 成绩,内联接,【例】对COUESE表和SC表实现左联接查询,结果包含学号、课程名、成绩字段。 SELECT 学号, 课程名, 成绩 FROM COURSE A; LEFT JOIN SC B; ON A.课程号 = B.课程号 ORDER BY 学号 结果

24、中包括course表中的所有记录,以及sc表中匹配的记录 首先从左边表(A表)中的第一条记录开始,在B表中查找,若找到,显示相应字段内容;若找不到,相应的字段显示NULL值。,左外联接,【例】对COUESE表和SC表实现右联接查询,结果包含学号、课程名、成绩字段。 SELECT 学号, 课程名, 成绩 FROM COURSE A; RIGHT JOIN SC B; ON A.课程号 = B.课程号 ORDER BY 学号 结果中包括表sc中的所有记录,以及course 表中匹配的记录,右外联接,即查询结果中即包括满足联接条件的两个表中的记录,还包括两个表中不满足联接条件的记录,相应的字段为空值

25、。 例如:将SC和COURSE进行完全联接 SELECT 学号, 课程名, 成绩 FROM COURSE A; FULL JOIN SC B; ON A.课程号 = B.课程号 ORDER BY 学号,完全联接,5)别名与自联接查询 别名:关系引用时可以采用其别名,方便操作。 Select from new as x where x.xh=“1111” and x.zf=300 自联接:在同一个关系上进行的自我联接。 例如:查询new2表中选修的所有课程成绩大于80 分以上的所有学生 Select x.xh, x.kh, x.cj distinct from new2 as x, new2 a

26、s y where x.xh=y.xh and x.cj=80,即在一个select-from-where查询块的where或having中嵌入另一个查询块,称为子查询,并允许多层嵌套。 部分联接查询可以通过嵌套完成。但order 子句 不能出现在子查询中。另外,查询的结果只能是 外层表中的字段。ANY | ALL | SOME () 或 NOT EXISTS (子查询),4.嵌套查询,【说明】 包括SQL支持的关系运算符:=、!=、#、=、=、=以及5.4.2节中提到的特殊运算符。 ANY、ALL、SOME是量词。其中ANY和SOME是同义词。在进行比较运算时只要子查询中有一条记录为真,则结

27、果为真;而ALL则要求子查询中的所有记录都为真,结果才为真。, EXISTS是谓词。用来检查子查询中是否有结果返回(是否为空)。NOT EXISTS表示结果集为空。 注意exists不是运算符号,所以exists前后都不能 有比较项或运算符,而且子查询中select后一般为*,【例】查询显示所有成绩大于85分的学生姓名、 班级和成绩。 SELECT 姓名, 班级 , SC.成绩 AS 成绩 FROM ; STUD WHERE 学号 IN (SELECT 学号 FROM SC WHERE 成绩85),【例】在SC表中查找选修02号课的学生中成绩比选修51号课的最低成绩都要高的学生的学号和成绩。

28、SELECT 学号, 课程号, 成绩 FROM SC WHERE ;课程号 = “02“ AND 成绩 ANY (SELECT 成绩 FROM SC WHERE 课程号=“51“) 说明:先找出选修了51号课程的所有学生成绩(结果是69,73,82,74,80),然后找出选修02号课程中成绩高于51号课程最低成绩的那些学生的学号。,【例】查询没有选修任何课程的学生信息 Select * from stud where not exists ;(select * from sc where stud.学号=学号) 对应的in子句操作 Select * from stud where学号not i

29、n; (select 学号 from sc where 学号=sc.学号),【例】查询借阅过图书的读者信息 Select * from 读者 where exists ;(select * from 借阅;where 借阅证号=读者.借阅证号),(1)使用系统函数:count,sum,avg,max,min 【例】在SC表中按课程号对记录分组并汇总成绩信息,检索出课程名和成绩信息,用平均成绩为字段名显示平均成绩。 SELECT 课程名, AVG(成绩) AS 平均成绩 FROM COURSE, SC; GROUP BY 课程名, SC.课程号; WHERE SC.课程号 = COURSE.课程

30、号,5. 分组与计算查询,【例】列出各门课的平均成绩、最高成绩、最低成绩。SELECT 课程名, AVG(成绩) AS 平均成绩, MAX(成绩) AS 最高分,; MIN(成绩) AS 最低分 FROM COURSE, SC; GROUP BY 课程名, SC.课程号;WHERE SC.课程号 = COURSE.课程号,(1)使用系统函数,主要采用order by 子句进行分组查询例. 按班级分类显示学生的姓名、课程名、成绩,同一班级按成绩排序。 SELECT A.姓名, A.班级, C.课程名, B.成绩; FROM STUD A, SC B, COURSE C; WHERE A.学号=B

31、.学号 .AND. B.课程号=C.课程号; ORDER BY A.班级, B.成绩,(2)排序,例. 显示成绩在80至90之间的学生的姓名、课程名和成绩, 按课程名排序,同一课程名按成绩由高到低排序。SELECT A.姓名, C.课程名, B.成绩; FROM STUD A, SC B, COURSE C; WHERE A.学号=B.学号 .AND. B.课程号=C.课程号 .AND. ; B.成绩 BETWEEN 80 .AND. 90; ORDER BY C.课程名,B.成绩 DESC,(2)排序,主要采用group by 子句进行分组查询 格式:Group by 字段1,字段2 hav

32、ing 条件 Having子句用于进一步限定分组的条件。只能 跟在group by子句的后面,条件中必须有函数 的使用,否则可以直接放在where子句中而不用 加having子句,因为在where子句中不能使用 函数。 查询中一般用where限定元组,用group by 限 定分组,用having限定分组的选择条件,(3)分组,【例】查找最少选修了三门课程的学生的姓名。 SELECT 姓名 FROM STUD WHERE 学号 IN; (SELECT 学号 FROM SC GROUP BY 学号 HAVING COUNT (*)=3) 【注意】虽然HAVING和WHERE都是条件子句,但它们作

33、用不同。WHERE子句用来指定表中各行应满足的条件(限定记录);而HAVING子句是用来指定每一分组满足的条件(限定分组的条件),只有满足HAVING条件的那些组才能显示在结果中。,每一个SELECT语句都能获得一个或一组记录。若要把多个SELECT语句的结果合并为一个结果,可用集合操作来完成。集合操作主要包括:并操作UNION、交操作INTERSECT和差操作MENUS。 将SQL查询的结果通过并运算符合并成一个查询结果 例如:查询出版社为“高教出版社”,单价在30 元以上的图书 Select * from 图书 where 出版社=“高教出版社” ; Union ; Select * fr

34、om 图书 where 单价=30,6. 集合查询,【例】显示计算机系(学号字段的第5、6两个字符是“23”)的学生以及所有的男同学的学号、姓名、性别、班级信息。 实质上是求计算机系的所有学生与男生的并集。查询语句代码如下: SELECT 学号, 姓名, 性别, 班级 FROM STUD; WHERE SUBSTR (学号, 5, 2)= “23“ UNION; SELECT 学号, 姓名, 性别, 班级 FROM STUD; WHERE 性别=“男” 【例】显示选修了大学英语或大学计算机基础的学生的学号和课程号。 SELECT 学号, 课程号 FROM SC; WHERE 课程号=“01“

35、UNION; SELECT 学号, 课程号 FROM SC; WHERE 课程号=“51“,SQL语句中并没有提供直接进行交集和差集的操作,但可以用其他方法来实现。【例】显示既选修了01课程又选修了02课程的学生的学号和课程号。 SELECT 学号 FROM SC WHERE 课程号 = “01“ ; AND 学号 IN (SELECT学号 FROM SC ; WHERE 课程号 = “02“)【例】显示选修了01课程而没有选修02课程学生的名单(就是选修01课程的学生与选修02课程学生的差集)。 SELECT 学号 FROM SC WHERE 课程号=“01“ ; AND 学号 NOT IN

36、 (SELECT 学号 ; FROM SC WHERE 课程号=“02“),1)显示部分结果select top 数值表达式 percent 表示显示前几条记录或前百分之几的记录, top必须与order by 子句结合使用。 例如:显示sc表中前5条记录 Select * top 5 from sc order by 学号 Select * top 5 percent from sc; Order by 学号,7.查询结果的显示和定向,2)将查询的结果存放到数组中 格式:into array 数组名 Select * from sc into array a1 存放查询结果的数组为二维数组。

37、 3) 将查询的结果存放到临时文件中 Into cursor 产生的文件为只读的表文件,查询结束时临时 文件为当前文件,当关闭文件后该临时文件将 自动删除,一般用临时文件存放一些临时结果 或中间结果。,4)将查询的结果存放到永久表中 Into dbf|table 表名 5)将查询的结果存放到文本文件中 To file 文件名additive 如果to短语和into短语同时使用,则to 短语将被忽略 6)将查询的结果直接输出到打印机 To printer 【例5.32】对STUD表的记录按“班级”升序排列, 用排序结果生成永久表STUD2.DBF。 SELECT * FROM STUD INTO

38、 DBF STUD2 ; ORDER BY 班级,8.视图的定义 视图是一个定制的虚表、可以是本地的、远程的, 视图的数据来源可以是一个表或多个表,或其他 的视图,视图可以更新,但视图只是显示指定表 的部分信息,它依赖于表,不能独立存在。 1)定义格式: CREATE VIEW 视图名列名1,列名2 AS SELECT查询 如果不指定列名则采用表中的字段名。 例如:依据new2表建立一个视图,视图中包括成绩大于 80分以上的记录 Create view v_new2 as ;select * from new2 where cj=80,2)视图的删除 Drop view 视图名 视图数据以来于数据表,所以视图的插入、修 改、删除有相应的规则。 视图依据单表建立的则可以进行插入、更新 由多表导出时,不允许进行插入、更新和删除,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报