计算机数据库SQL语言.ppt_第1页
计算机数据库SQL语言.ppt_第2页
计算机数据库SQL语言.ppt_第3页
计算机数据库SQL语言.ppt_第4页
计算机数据库SQL语言.ppt_第5页
已阅读5页,还剩132页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 关系数据库标准语言SQL语言 第 章 3 主 要 内 容 第3章 3.1 SQL概述 3.2 查询语句 3.3 更新语句 3.4 SQL DDL 3.5 SQL DCL 3.6 视图 3.7 嵌入式 SQL(*) 2 3.1 SQL概述 一、 SQL的发展及现状 二、SQL数据库的体系结构 三、SQL的功能 四、SQL的形式 五、SQL的特点 3 3.1 SQL概述 一、 SQL的发展及现状 1974年,由Boyce和Chamberlin提出 19751979,IBM San Jose Research Lab的关系数据库管理系统原型 System R实施了这种语言 SQL-86是第一个SQL标准 SQL-89、SQL-92(SQL2)、SQL-99(SQL3)、SQL-2003 大部分DBMS产品都支持SQL,成为操作数据库的标准语言 4 3.1 SQL概述 SQLSQL用户 Base TableBase Table B1B1 View V1View V1View V2View V2 Base TableBase Table B2B2 Base TableBase Table B3B3 Base TableBase Table B4B4 Stored FileStored File student1student1 Stored FileStored File student1student1 Stored FileStored File student1student1 Stored FileStored File student1student1 外模式 模式 内模式 SQL语言支持的关系数据库的三级模式结构 二、SQL数据库的体系结构 5 3.1 SQL概述 基本概念: 1、用户可以用SQL语言对视图(View)和基本表(Base Table)进行查询等操作,在用户观点里,视图和表一样 ,都是关系。 2、视图是从一个或多个基本表中导出的表,本身不存储 在数据库中,只有其定义,可以将其理解为一个虚表。 3、基本表是本身独立存在的表,每个基本表对应一个存 储文件,一个表可以带若干索引,存储文件及索引组成 了关系数据库的内模式。 SQLSQL用户 Base TableBase Table B1B1 View V1View V1View V2View V2 Base TableBase Table B2B2 Base TableBase Table B3B3 Base TableBase Table B4B4 Stored FileStored File student1student1 Stored FileStored File student1student1 Stored FileStored File student1student1 Stored FileStored File student1student1 外模式 模式 内模式 二、SQL数据库的体系结构 6 3.1 SQL概述 n 数据定义(DDL) n定义、删除、修改关系模式(基本表) n定义、删除视图(View) n定义、删除索引(Index) n 数据操纵(DML) n数据查询 n数据增、删、改 n 数据控制(DCL) n用户访问权限的授予、收回 三、SQL的功能 7 3.1 SQL概述 DATABASE TABLE CREATE VIEW INDEX DDL: ALTER DROP SQL QUERY:SELECT FROM INSERT SQL SQL DML:UPDATE DELETE GRANT SQL DCL:REVOKE AUDIT 嵌入式SQL: 四、SQL的组成(分类) 8 3.1 SQL概述 n 交互式SQL n一般DBMS都提供联机交互工具 n用户可直接键入SQL命令对 数据库进行操作 n由DBMS来进行解释 n 嵌入式SQL n能将SQL语句嵌入到高级语言(宿主语言) n使应用程序充分利用SQL访问数据库的能力、宿主 语言的过 程处理能力 n一般需要预编译,将嵌入的SQL语句转化为宿主语言编译器能处 理的语句 五、SQL的形式 9 3.1 SQL概述 4. 具有查询、操作、定义和控制四种语言一体化的特点。它只向用户提供一 种语言,但该语言具有上述多种功能,且每种操作只需一种操作符。 1.高度非过程化的语言:用户只需提出“干什么”,至于 “怎么干”由DBMS解决;用户只需要早查询语句中提出需 要什么,DBMS即可按路径存取,并把结果返回给用户。 2. 面向集合的语言:每一个SQL的操作对象是一个或多个关系,操作的结 果也是一个关系。 3.一种语法结构,两种使用方式:即可独立使用,又可嵌入到宿主语言中使用 ,具有自主型和宿主型两种特点。 六、SQL的特点 10 3.1 SQL概述 5. 语言简洁、易学易用:核心功能只有9个动词,语法简单, 接近英语。 SQL功能 动词 数据库查询 SELECT 数据定义 CREATE,DROP ,ALTER 数据操纵 INSERT,UPDATE,DELETE 数据控制 GRANT,REVOKE 11 3.1 SQL概述 1、字符型:CHAR(n),VARCHAR 2、数字型:INT, SMALLINT,REAL 3、日期型:DATE,TIME (一) 数据类型 (二) 函数 1.数字函数: ABS(X),SQRT(X),RAND(X),LOG(X), 2.字符函数: LENGTH(X$),LOWER(X$),UPPER(X$), SUBSTRING(expression, start, length) 3.分组函数: COUNT(),MAX(X),MIN(X),AVG(X),SUM(X) 12 3.1 SQL概述 1. 句法操作符: 课程信息表Course; 选课情况 表SC,教师信息表teacher 37 3.2 查询语句 1) 连接条件一 表名1. 列名1 比较运算符 表名2.列名2 2) 连接条件二 表名1.列名1 BETWEEN 表名2.列名2 AND 表名2.列名3 连接条件中的列名称为连接字段,其各 字段应是可比的。 1、多表连接 38 3.2 查询语句 学号 课程号 学习成绩 sno Cno GRADE student1 C1 A student1 C2 A student1 C3 A student1 C5 B student2 C1 B student2 C2 C SC 学号 学生姓名 所属系名 学生年龄 sno Sname Sdept Sage student1 A CS 20 student2 B CS 21 student3 C MA 19 student4 D CI 19 student5 E MA 20 student 在表1中找到第一个元组,然后从头开始扫描表2,查找到 满足条件的元组即进行串接并存入结果表中;再继续扫描表2, 依次类推,直到表2末尾。再从表1中取第二个元组,重复上述 的操作,直到表1中的元组全部处理完毕。 执行过程: 39 3.2 查询语句 例题例题 SELECT student.sno,Sname,Cname,Grade FROM Student S,Course C,SC WHERE S.Sno=SC.Sno AND C.Cno=SC.Cno; 例1:求选课情况,要求输出学号、姓名、课程名与成绩 3.2 查询语句 40 3.2 查询语句 用表别名把一个表定义为两个不同的表进行连接。 2、单表连接(自连接) 例1:求每门课的间接先修课名(即先修课的先修课) SELECT FIRST.Cno,THIRD.Cname FROM Corse FIRST, Course SECOND , Course THIRD WHERE FIRST. CPno = SECOND.Cno AND SECOND. CPno = THIRD.Cno 41 3.2 查询语句 在连接条件的某侧加上() 或(+),表示该侧所对应的表中可形成一个 各数据项均为空值的万能替代行,用来与另一侧对应的表中所有不满足条 件的元组进行连接。外连接符()或(+)出现在左侧称为右外连接、出现 在右侧称为左连接、两侧都出现的称为全外连接。 SELECT DNAME,TNAME FROM department D,teacher T WHERE D.DNO = T.DNO(*); 例1:求各部门名及职工名,要求输出 无职工的部门(职工以空值出现) 3、外连接 42 例题例题 SELECT DNAME,TNAME FROM department D,teacher T WHERE D.DNO (*) = T.DNO; 例2:求各部门名及职工名,要求输出 未分配部门的职工(部门以空值出现) 43 例题例题 SELECT DNAME,TNAME FROM department D,teacher T WHERE D.DNO (*) = T.DNO(*); 例3:求各部门名及职工名,要求输出 无职工的部门和未分配部门的职工 注意,在sql server中,Left join 左外连接 Right join 右外连接,Full join 全外连接 44 3.2 查询语句3.2 SELECT DNAME,TNAME FROM department D left join teacher T on D.DNO = T.DNO SELECT DNAME,TNAME FROM department D right join teacher T on D.DNO = T.DNO SELECT DNAME,TNAME FROM department D full join teacher T on D.DNO = T.DNO 45 3.2 查询语句 WHERE子句中除了连接条件,还有其它限制条件。 SELECT Sname, Grade FROM student, SC WHERE student.sno=SC.sno AND SC.Cno=C6 AND SC.Grade90; 例1:求选修C6课程且成绩超过90分的学生名与成绩 连接条件限制条件 4、复合条件连接 46 3.2 查询语句 在SELECT FROM WHERE语句结构的 WHERE子句中可嵌入一个SELECT语句块 其上层查询称为外层查询或父查询 其下层查询称为内层查询或子查询 SQL语言允许使用多重嵌套查询 在子查询中不允许使用ORDER BY子句 嵌套查询的实现一般是从里到外,即先进行 子查询,再把其结果用于父查询作为条件 三、嵌套查询 47 三、嵌套查询 方法一: SELECT Sname, Sage FROM student WHERE Sdept = = ( SELECT sdept FROM student WHERE Sname = 刘力); 方法二: SELECT FIRST.Sname, FIRST.Sage FROM Student FIRST ,Student SECOND WHERE FIRST.Sdept = SECOND.Sdept AND SECOND.Sname = 刘力; 例1:求与刘力同一个学院的学生名,年龄 1、返回单个值的子查询 : 48 三、嵌套查询 方法一:SELECT * FROM student WHERE sno IN ( SELECT sno FROM SC WHERE Cno=C6 AND Grade90 ); 例1:求选修C6课程且成绩超过90分的学生 2、返回一组值的子查询: 方法二( 连接查询 ): SELECT student.* FROM student,SC WHERE Student.Sno=SC.Sno AND Grade90 AND Cno=C6; 49 例题例题 方法一: SELECT * FROM student WHERE sdept!=CS AND sage ANY( SELECT Sage FROM Student WHERE Sdept=CS); 方法二: SELECT * FROM Student WHERE Sdept!=CS AND Sage ( SELECT MAX(Sage) FROM Student WHERE Sdept=CS); 例2:求比计算机系中某一学生年龄小的其他系的学生 50 3.2 查询语句 例1:求D01部门中工资与国贸系中任一职工相同 的职工和工资 Teacher(tno,tname,salary,dno) Department(dno,dname) 3、多重子查询 : 51 例题例题 SELECT Tname,Salary FROM Teacher WHERE Dno = D01 AND salary IN (SELECT salary FROM teacher WHERE Dno = = (SELECT DNO FROM department WHERE Dname=国贸); 52 例题例题 SELECT * FROM teacher WHERE Salary = = (SELECT MIN(Salary) FROM teacher WHERE Tname IN (张三,里司) AND Salary = = (SELECT MAX(Salary) FROM teacher WHERE Tname IN( 张三,里司); 例2:求工资介于张三与里司两个之间的职工 53 3.2 查询语句 不相关子查询:子查询的查询条件不依赖于 父查询的称为不相关子查询。 相关子查询:子查询的查询条件依赖于外层父 查询的某个属性值的称为相关子查询 (Correlated Subquery),带EXISTS 的子查询就 是相关子查询 EXISTS表示存在量词 带有EXISTS的子查询不返回任何记录的数据, 只返回逻辑值 True 或 False 四、带有EXISTS的相关子查询 54 例题例题 不相关子查询: SELECT Sname FROM student WHERE snoIN ( SELECT sno FROM SC WHERE Cno = C1 ); 例1:求所有选修了C1课程的学生名。 相关子查询: SELECT Sname FROM student WHERE EXISTS ( SELECT * FROM SC WHERE student.sno=SC.sno AND Cno=C1 ); 55 学号 课程号 学习成绩 sno Cno GRADE student1 C1 A student1 C2 A student1 C3 A student1 C5 B student2 C1 B student2 C2 C SC 学号 学生姓名 所属系名 学生年龄 sno SnameAME Sdept Sage student1 A CS 20 student2 B CS 21 student3 C MA 19 student4 D CI 19 student5 E MA 20 student 先在外层查询中取student表的第一个元组(记录),用该 记录的 相关的属性值(在内层WHERE子句中给定的)处理内层查询,若 外层的WHERE子句返回TRUE值,则此元组送入结果的表中。然 后再取下一个元组;重复上述过程直到外层表的记录全部遍历 一次为止。 相关子查询执行过程: 56 不关心子查询的具体内容,因此用 SELECT *, Exists + 子查询用来判断该子查询是否返回元组 当子查询的结果集非空时,Exists 为 True 当子查询的结果集为空时,Exists为 False NOT EXISTS :若子查询结果为空,返回TRUE值, 否则返回 FALSE 说明: 57 例题例题 SELECT sno,Sname FROM student WHERE NOT EXISTS ( SELECT * FROM SC WHERE student.sno=SC.sno AND Cno=C1); 例2:列出没有选C1课程的学生的学号、姓名 58 例题例题 SELECT Sname FROM student WHERE NOT EXISTS ( SELECT * FROM Course WHERE NOT EXISTS ( SELECT * FROM SC WHERE student.sno=SC.sno AND Course.Cno=SC.Cno); 例3:查询选修了所有课程的学生的姓名 这门课他没选 这样的课是不存在的 59 例题例题 例4:查询至少选修了S1所选的全部课程的学生名 SELECT Sname FROM student WHERE NOT EXISTS ( SELECT * FROM SC SCX WHERE SCX.sno=s1 AND NOT EXISTS ( SELECT * FROM SCSCY WHERE student.sno=SCY.sno AND SCX.Cno=SCY.Cno); 60 注意 在FROM语句中使用子查询,对查询结果定义表 名及列名 例:求平均成绩超过80分的学号及平均成绩 2.SELECTsno,AVG(Grade) FROMSC GROUPBYsno HAVINGAVG(Grade)80 1.SELECT Sno,AVG_G FROM (SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno ) AS RA(Sno,AVG_G)WHERE AVG_G80; 61 n 属性个数必须一致 n 对应的类型必须一致 n 属性名无关 n 最终结果集采用第一个结果的属性名 n 缺省为自动去除重复元组 n 除非显式说明ALL n Order By放在整个语句的最后 五、SQL的集合操作 62 例1:查询计算机系的学生或者年龄不大于19岁的学生, 并按年龄倒排序。 SELECT * FROM student WHERE Sdept=CS UNION SELECT * FROM student WHERE AGE80); Select sno,sname into student2 from student 创建表并插入数据 71 二、删除操作 格式: DELETE FROM 表名 WHERE 条件; 只能对整个元组操作,不能只删除某些属性上 的值 只能对一个关系起作用,若要从多个关系中删 除元组,则必须对每个关系分别执行删除命令 从关系 r 中删除满足条件的元组,只是删除数据 , 而不是定义 72 例1:删除学号为2003009的学生。 1、删除单个元组 : 二、删除操作 DELETE FROM SC WHERE sno = 2003009 ; DELETE FROM student WHERE sno = 2003009 ; 73 例2:删除选课但无成绩的学生的选课信息 2、删除多个元组 : 二、删除操作 DELETE FROM SC WHERE GRADE Is NULL; DELETE FROM SC 清空SC表 74 例3:删除选修C004且成绩小于该课程的平均成绩的记录 3、带子查询的删除语句: 二、删除操作 3.5 DELETE FROM SC WHERE Cno=C004 AND Grade 15) -默认值 设置某属性为默认值,如 Sdept default 管理学院 或者 create default df_sdept as 管理学院 -sp_bindefault df_sdept ,student.sdept 94 全局约束 全局约束涉及多个属性间的联系 CREATE TABLE employee (empid CHAR(4), empname CHAR(4), age SMALLINT, dept char(4), PRIMARY KEY (empid), CHECK(dept in (市场,生产,人事,后勤) and age=18) ) 95 对约束的命名、撤消和添加 命名 constraint 约束名 示例 sno char(4) constraint s_pk priamry key age samllint constraint age_val check(age = 15 and age =0 and score 18) 禁用并重新启用一个约束 alter table student nocheck constraint age_check alter table student check constraint age_check 98 二、删除基本表 格式: DROP TABLE 表名 CASCADE|RESTRICT; 删除一个表,及与该表相关的索引、视图、码 和外部码。 CASCADE 连同引用该表的视图、完整 性约束一起自动撤消 RESTRICT无引用时,才可撤消 99 三、修改基本表 改变表名 增加列 改变列的数据类型 删除列的约束 删除列 改变列名 基本表的修改操作: 100 三、修改基本表 格式:ALTER TABLE 表名 ADD 新列名 类型(长度)NOT NULL 列约束, MODIFY 旧列名 类型(长度) DROP 列约束 增加新列,修改列,删除列的完整性约束; 改变表名及列名。 101 例题例题 例1:在Student表中增加个入学时间,为日期型 ALTER TABLE Studnet ADD SCOME DATETIME; 例2:把Sage列的类型改为半字长整数 ALTER TABLE Student MODIFY Sage SMALLINT; (alter table Student alter column Sage SMALLINT) 例3:删除对Sname列的唯一约束 ALTER TABLE Student DROP UQ_student ; 例4:删除入学时间字段 alter table student drop column scome 102 修改列名和表名 1.修改表名 exec sp_rename student, student1, object; 2.修改列名 exec sp_rename student.age, sage, column; 使用存储过程 103 建立索引是加快查询速度的有效手段 建立索引 DBA或表的属主(即建立表的人)根据需要建 立 有些DBMS自动建立以下列上的索引 PRIMARY KEY UNIQUE 维护索引 DBMS自动完成 使用索引 DBMS自动选择是否使用索引以及使用哪些索 引 四、定义索引 104 语句格式 CREATE UNIQUE CLUSTER INDEX ON (, ); 用指定要建索引的基本表名字 索引可以建立在该表的一列或多列上,各列名 之间用逗号分隔 用指定索引值的排列次序,升序:ASC ,降序:DESC。缺省值:ASC UNIQUE表明此索引的每一个索引值只对应唯 一的数据记录 CLUSTER表示要建立的索引是聚簇索引 建立索引 105 例题 为学生-课程数据库中的Student,Course,SC三个表建 立索引。其中Student表按学号升序建唯一索引, Course表按课程号升序建唯一索引,SC表按学号升序 和课程号降序建唯一索引。 CREATE UNIQUE INDEX Stusno ON Student(Sno ASC); CREATE UNIQUE INDEX Coucno ON Course(Cno ASC); CREATE UNIQUE INDEX SCno ON SC(Sno ASC, Cno DESC); 106 常用的索引:唯一索引和聚簇索引 唯一值索引 对于已含重复值的属性列不能建UNIQUE索引 对某个列建立UNIQUE索引后,插入新记录时 DBMS会自动检查新记录在该列上是否取了重 复值。这相当于增加了一个UNIQUE约束 主键需不需要建立唯一值索引? 107 聚簇索引 建立聚簇索引后,基表中数据也需要按指定的聚簇 属性值的升序或降序存放。也即聚簇索引的索引项 顺序与表中记录的物理顺序一致 例: CREATE CLUSTER INDEX Stusname ON Student(Sname); 在Student表的Sname(姓名)列上建立一个聚簇索引,而且Student表中 的记录将按照Sname值的升序存放 Sql server中的表示方式create clustered index 某些DMBS不支持聚簇索引。所以用前一定要查使用说明。 108 在一个基本表上最多只能建立一个聚簇索引 为什么? 聚簇索引的用途:对于某些类型的查询,可以 提高查询效率 聚簇索引的适用范围 很少对基表进行增删操作 很少对其中的变长列进行修改操作 109 DROP INDEX ; 删除索引时,系统会从数据字典中删去有关 该索引的描述。 例 删除Student表的Stusname索引。 DROP INDEX Stusname;(在sqlserver中加入 表名,如drop index student.stusname;) 删除索引 110 3.5 数据控制 一、授 权 GRANT 二、收回权限 REVOKE 111 3.5 数据控制 授权命令 grant 表级权限 on 表名 | 视图名 to 用户 ,用户 | public with grant option 表级权限包括:select, update, insert, delete, index, alter, drop, resource以及它们 的总和all,其中对select , update可指定列名 with grant option表示获得权限的用户可以把权 限再授予其它用户 112 3.5 数据控制 示例 Dbo: grant select , insert on Student to Liming with grant option Liming: grant select on Student to liudehua 113 3.5 数据控制 回收权限 revoke 表级权限 on 表名 | 视图名 from 用户 ,用户 | public 收回权限时,若该用户已将权限授予其它用户 ,则也一并收回。授权路径的起点一定是DBA 示例 revoke insert,select on Student from Liming 114 3.5 数据控制 grant可以基于列授权 Grant select(sname) on student to xueyou grant可以基于列授权 Grant update(sname,sage) on student to liming 115 3.5 数据控制 支持多库的数据库系统中授权对象可以是数据库 grant 数据库级权限 to 用户 ,用户 | public 数据库级权限包括: connect:允许用户在database语句中指定数据库 resource:connect权限+建表、删除表及索引权利 dba:resource权限 + 授予或撤消其他用户的 connect、resource、dba权限 不允许dba撤消自己的dba权限 116 3.6 视图 一、视图概念一、视图概念 二、定义、删除视图二、定义、删除视图 三、查询视图三、查询视图 四、更新视图四、更新视图 五、视图的作用五、视图的作用 117 视图是一个虚表 数据库中只存放视图的定义 视图对应的数据仍存放在原来的表中 随着表中数据的变化,视图的数据随之改变。 对视图的查询与基本表一样 对视图的更新将受到一定的限制 基本表1 基本表2 视图 视图概念示意图 3.6 视图 视图概念 118 3.6 视图 视图分类视图分类 1. 1.行列子集视图:从单个基本表导出,保留行列子集视图:从单个基本表导出,保留 基本表的码,但去掉其它的某些列和部分基本表的码,但去掉其它的某些列和部分 行的视图。行的视图。 2. 2.表表 达达 式式 视视 图:带虚拟列的视图。图:带虚拟列的视图。 3. 3.分分 组组 视视 图图 : 子查询目标表带有组函数子查询目标表带有组函数 或子查询带有或子查询带有GROUP BYGROUP BY子句的视图。子句的视图。 119 定义与修改视图 建立视图,其一般格式为: CREATE VIEW (,.) AS WITH CHECK OPTION 其中子查询可以是任意复杂的SELECT语句,但通常不 允许含有ORDER BY子句和DISTINCT短语。 WITH CHECK OPTION表示对视图进行UPDATE、 INSERT和DELETE操作时要保证更新、插入或删除的行 满足视图定义中的谓词条件(即子查询中的条件表达式) 。 如果CREATE VIEW语句仅指定了视图名,省略了组成 视图的各个属性列名,则隐含该视图由子查询中SELECT 子句目标列中的诸字段组成。 3.6 视图 120 在下列三种情况下必须明确指定组成视图的所有列名 : 1. 其中某个目标列不是单纯的属性名,而是集函 数或列表达式 2. 多表连接时选出了几个同名列作为视图的字段 3. 需要在视图中为某个列启用新的更合适的名字 需要说明的是,组成视图的属性列名必须依照上面 的原则,或者全部省略或者全部指定,没有第三 种选择。 3.6 视图 121 例1 建立电商系学生的视图。 create view ec_student as select sno,sname,age from student where dept=ec 注:实际上,DBMS执行CREATE VIEW语句的结 果只是把对视图的定义存入数据字典,并不执行 其中的SELECT语句。只是在对视图查询时,才 按视图的定义从基本表中将数据查出。 3.6 视图 行列子集视图行列子集视图 122 例2 建立电商学生的视图,并要求进行修改和插入操 作时仍须保证该视图只有电商系的学生 create view ec_student as select sno,sname, age from student where sdept=ec with check option insert into ec_student (sno,sname,age,dept) values (020011,陈侠,20,ec) 3.6 视图 123 理解SQL Server的with check option的用法 if exists (select name from sysobjects where name=test1) drop view test1 go create view test1 as select * from student where sno like 0200% with check option go insert into test1 values (020120,李一,男 ,32,CS) -因为有WITH CHECK OPTION,记录插入失败 124 视图不仅可以建立在单个基本表上,也可以建立在多 个基本表上或者已定义好的视图。 例 建立电商系选修了001号课程的学生的视图 create view ec_s1(xh,xm,cj) as select student.sno,sname,score from student,sc where dept=ec and student.sno=sc.sno and o=001 例 建立电商系选修了1号课程且成绩在90分以上的 学生的视图 CREATE VIEW ec_s2 AS SELECT xh,xm,cj FROM ec_s1 WHERE cj=90 125 带表达式的视图: 例 定义一个反映学生出生年份的视图 CREATE VIEW BT_S(sno,sname,csnf) as select sno,sname,2009-age from student 由于BT_S视图中的出生年份值是通过一个表达式计算得 到的,不是单纯的属性名,所以定义视图时必须明确 定义该视图的各个属性列名。BT_S视图是一个带表 达式的视图。 分组视图:带有集函数和GROUP BY子句的查询 例 将学生的学号及他的平均成绩定义为一个视图 CREATE VIEW S_G(sno,avgscore) AS SELECT sno, AVG(score) FROM sc GROUP BY sno 126 注意事项: 例 将Student表中所有女生记录定义为一个视图 CREATE VIEW F_Student(sno,sname,ssex,age,dept) AS SELECT * FROM Student WHERE ssex=女 如果修改了基本表Student的结构,则Student表与F_Student视 图的映像关系受到破坏,因而该视图就不能正确工作了。 解决方法: 建立视图时明确指明属性列名,而不是简单地用SELECT *。这 样,若Student表增加新列,原视图仍能正常工作,只是新 增的列不在视图中而已。 在修改基本表之后删除原来的视图,然后重建视图。 3.6 视图 127 删除视图 DROP VIEW 一个视图被删除后,由此视图导出的其他视图也将失效, 用户应该使用DROP VIEW语句将他们一一删除。 例 删除视图ec_s1 DROP VIEW ec_s1 执行此语句后,ec_s1视图的定义将从数据字典中删除。 由ec_s1视图导出的ec_S2视图的定义虽仍在数据字典 中,但该视图已无法使用了,因此应该同时删除。 128 对视图的查询将转换为对基本表的查询,称为视图的 消解(View Resolution)。 例 在电商系学生视图中找出年龄小于20岁的学生 SELECT sno,age FROM ec_student WHERE age20 DBMS执行此查询时,将其与ec_student视图定义中的子查询 :select sno,sname,age from Student WHERE dept=ec结合 起来,转换成对基本表Student的查询,修正后的查询语 句为: SELECT sno,age FROM student WHERE dept=ec AND age20 查询视图 129 视图是定义在基本上的虚表,它可以和其他基本 表一起使用,实现连接查询或嵌套查询。这 也就是说,在关系数据库的三级模式结构中 ,外模式不仅包括视图,而且还可以包括一 些基本表。 例 查询电商系选修了1号课程的学生 SELECT sc.sno,sname FROM ec_student,sc WHERE ec_student.sno=sc.sno AND o=001 本查询涉及虚表ec_student和基本表sc,通过这两 个表的连接来完成用户请求。 查询视图 130 更新视图包括插入(INSERT)、删除(DELETE)和 修改(UPDATE)三类操作。对视图的更新,最终 要转换为对基本表的更新。 为防止用户通过视图对数据进行增删改时,无意或故意 操作不属于视图范围内的基本表数据,可在定义视 图时加上WITH CHECK OPTION子句. 例 将电商系学生视图ec_student中学号为020011的学生 姓名改为“李四” UPDATE ec_student SET sname=李四 WHERE sno=020011 更新视图 131 关于更新的限制: 并非所有的视图都可更新,有些视图的更新不能唯 一地有意义地转换成对相应基本表的更新。 1、 若视图是由两个以上基本表导出的,则此视图不允许 更新。 2、若视图的字段来自字段表达式或常数,则不允许对此 视图执行INSERT和UPDATE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论