470 likes | 583 Views
第 9 讲 数据更新及视图. www.desktop.swpu.edu.cn. 1. 2. 3. 4. 删除数数据. 视图. 插入数据. 更新数据. 本讲内容. 9.1 数据插入. 两种插入数据方式 1. 插入元组 2. 插入子查询结果. 可以一次插入多个元组. 一、 插入元组. 语句格式 INSERT INTO < 表名 > [(< 属性列 1>[ , < 属性列 2 >…)] VALUES (< 常量 1> [ , < 常量 2>] … ). 功能 将新元组插入指定表中.
E N D
第9讲 数据更新及视图 www.desktop.swpu.edu.cn
1 2 3 4 删除数数据 视图 插入数据 更新数据 本讲内容
9.1 数据插入 • 两种插入数据方式 1. 插入元组 2. 插入子查询结果 • 可以一次插入多个元组
一、插入元组 • 语句格式 INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>] … ) • 功能 • 将新元组插入指定表中
说明 1、<表名>是指要插入新记录的表 2、<列名>是可选项,指定待添加数据的列 3、VALUES子句指定待添加数据的具体值 4、列名的排列顺序不一定要和表定义时的顺序一致。 5、但当指定列名表时VALUES子句值的排列顺序必须和列名表中的列名排列顺序一致,个数相等,数据类型一一对应。
举例 例1.将新生记录(95020,陈冬,男,信息系,18岁)插入到Student表中。 解: INSERT INTO Student VALUES (‘9521105’, ‘陈冬’, '男', 18, '信息系') • 注意 1、必须用逗号将各个数据分开 2、字符型数据要用单引号括起来。 3、INTO子句中没有指定列名,则新插入的记录必须在每个属性列上均有值,且VALUES子句中值的排列顺序要和表中各属性列的排列顺序一致。
举例 2、插入一行的部分数据值 例2.在SC表中插入一新记录,成绩暂缺。 解: INSERT INTO SC(Sno, Cno) VALUES('9521105', 'c01') 注意: 1、将VALUES子句中的值按照INTO子句中指定列名的顺序插入到表中 2、对于INTO子句中没有出现的列,则新插入的记录在这些列上将取空值,如上例的Grade即赋空值。 3、但在表定义时有NOT NULL约束的属性列不能取空值。
二、插入子查询结果 • 语句格式 INSERT INTO <表名> [(<属性列1> [,<属性列2>… )] 子查询; • 功能 将子查询结果插入指定表中 说明: • INTO子句(与插入元组类似) • 子查询 • SELECT子句目标列必须与INTO子句匹配 • 值的个数 • 值的类型
举例 例3.对每一个系,求学生的平均年龄,并把结果存入数据库。 解: 第一步:建表 CREATE TABLE Dept_age (Sdept CHAR(15) /* 系名*/ Avg_age SMALLINT);/*学生平均年龄*/
举例 第二步:插入数据 INSERT INTO Dept_age(Sdept,Avg_age) SELECT Sdept,AVG(Sage) FROM Student GROUP BY Sdept;
举例 RDBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
9.2 修改数据 • 语句格式 UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>]; • 功能 • 修改指定表中满足WHERE子句条件的元组
修改数据(续) • SET子句 • 指定修改方式 • 要修改的列 • 修改后取值 • WHERE子句 • 指定要修改的元组 • 缺省表示要修改表中的所有元组
修改数据(续) • 三种修改方式 1. 修改某一个元组的值 2. 修改多个元组的值 3. 带子查询的修改语句
1. 修改某一个元组的值 [例5] 将学生200215121的年龄改为22岁 UPDATE Student SET Sage=22 WHERE Sno=' 200215121 ';
2. 修改多个元组的值 [例6] 将所有学生的年龄增加1岁 UPDATE Student SET Sage= Sage+1;
3. 带子查询的修改语句 [例7] 将计算机科学系全体学生的成绩置零。 UPDATE SC SET Grade=0 WHERE 'CS'= (SELETE Sdept FROM Student WHERE Student.Sno = SC.Sno);
修改数据(续) RDBMS在执行修改语句时会检查修改操作 是否破坏表上已定义的完整性规则。 • 实体完整性 • 主码不允许修改 • 用户定义的完整性 • NOT NULL约束 • UNIQUE约束 • 值域约束
9.3 删除数据 DELETE [ FROM ] <表名> [WHERE <删除条件>] • 说明: DELETE语句的语法格式为: 1.<表名>说明了要删除哪个表中的数据。 2.WHERE子句说明要删除表中的哪些记录――只删除满足WHERE条件的记录。 3.如果省略WHERE子句,则是无条件删除,表示要删除表中的全部记录。
一、无条件删除数据 例1.删除所有学生的选课记录。 DELETE FROM SC -- SC成空表 无条件删除是删除表中全部数据,但保留表的结构。
二、有条件删除数据 • 分为两种情况: • 一种是基于本表条件的删除, • 另一种是基于其他表条件的删除。 1、基于本表条件的删除 例2.删除所有不及格学生的修课记录。 DELETE FROM SC WHERE Grade < 60
2、基于其他表条件的删除 例3.删除计算机系不及格学生的修课记录。 用子查询实现 DELETE FROM SC WHERE Grade < 60 AND Sno IN ( SELECT Sno FROM Student WHERE Sdept = ‘计算机系’ ) 用多表连接实现 DELETE FROM SC FROM SC JOIN Student ON SC.Sno = Student.Sno WHERE Sdept = ‘计算机系’AND Grade < 60
提出问题 9.4 视图 查询信息系选修VB课程的学生的成绩,要求列出学生姓名、课程名和成绩。 解:用多表连接查询 SELECT Sname,Cname,Grade FROM Student S JOIN SC ON S.no=SC.Sno JOIN Course C ON C.Cno=SC.Cno WHERE Sdept=‘信息系’ AND Cname=‘VB’ 存在问题:重复使用多表查询,繁琐 解决方法:视图可以用单表查询的方式完成查询
9.4 视图 1 2 3 4 更新视图 视图的作用 定义视图 查询视图
基本表1 基本表2 视图 一、视图的概念 1、什么叫视图? 视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,视图是一种SQL查询。在数据库中只存放视图的定义,不存放视图包含的数据,这些数据仍存放在原来的基本表中。因此视图也称为虚表。
注意: 1、视图是基于数据库基本表的虚表。 2、它实际不包含数据,它的数据全部来自于基本表 3、视图提供了数据库的逻辑独立性,并增加了数据的安全,封装了复杂的查询,为用户提供了从不同的角度看数据的方法。 4、视图的行为和表类似,可以通过视图查询表的数据,也可以修改表的数据。
思考与讨论 使用视图可以加快数据的查询速度吗?
2、使用视图的好处 1)将数据集中显示。 2)简化数据操作。 3)自定义数据。 4)重新组织数据以便导入导出数据。 5)组合分区数据。
练习: 1、填空 视图是一个虚表,它是从导出的表。在数据库中,只存放视图 , 不存放视图对应的 。 一个或几个基本表 定 义 数 据 2、问答 为什么将SQL中的视图称为“虚表”?
二、创建视图 1、创建视图的方法 1)使用企业管理器创建视图 2)使用向导创建视图 3)使用SQL语句创建视图。
2、使用SQL语句创建视图 创建视图的SQL语句为CREATE VIEW,格式为: CREATE VIEW<视图名> [(视图列名表)] AS子查询语句 说明:其中子查询可以是任意的SELECT语句。 但要注意以下几点: 1、子查询中通常不包含ORDER BY和DISTINCT子句。 2、在定义视图时要么指定全部视图列,要么全部省略不写。如果省略了视图的属性列名,则视图的列名与子查询列名相同。
2、使用SQL语句创建视图(Cont.) 但在如下三种情况下必须明确指定组成视图的所有列名: • 某个目标列是计算函数或列表达式; • 多表连接时选出了几个同名列作为视图的字段; • 需要在视图中为某个列选用新的更合适的列名。
1 2 3 4 5 定义单源表视图 在已有视图上创建新视图 定义带表达式的视图 含分组统计信息的视图 下面举例说明如何创建如下5种视图。 定义多源表视图
1、定义单源表视图 • 单源表视图指的是数据取自一个基本表的部分行、列这样定义的视图可以进行查询和修改数据操作。 例1、建立信息系学生的视图。 解:CREATE VIEWIS_Student AS SELECT Sno, Sname, Sage FROM Student WHERE Sdept = '信息系' 说明:DBMS只有在对视图执行查询时,才按视图的定义从相应基本表中查询数据。
2、定义多源表视图 • 多源表视图指的是定义视图的子查询的源表可以有多个,这样定义的视图一般只用于查询,不用于修改数据。 例2、建立信息系选修了‘c01’号课程的学生的视图。 解:查询信息系选修了‘C01’号课程的学生。 解:CREATE VIEWV_IS_S1(Sno, Sname, Grade) AS SELECT Student.Sno, Sname, Sage FROM Student JOIN SC ON Student.Sno = SC.Sno WHERE Sdept = '信息系' AND SC.Cno = 'c01'
3、在已有视图上定义新视图 • 在视图上建立视图表示视图的数据源中有视图。作为数据源的视图必须是已经建立好的。 例3、建立信息系选修了‘c01’号课程且成绩在90分以上的学生的视图。 解: CREATE VIEW V_IS_S2 AS SELECT Sno, Sname, Grade FROM V_IS_S1 WHERE Grade >= 90
4、定义带表达式的视图 • 由于视图中的数据并不实际存储,所以定义视图时可以根据需要设置一些派生属性列,在这些派生属性列中保存经过计算的值。 例4、定义一个反映学生出生年份的视图。 解:CREATE VIEW BT_S(Sno, Sname, Sbirth) AS SELECT Sno, Sname, 2010-Sage FROM Student
5、含分组统计信息的视图 • 含分组统计信息的视图是指视图的子查询中含有GROUP BY子句,这样的视图只能用于查询,不能用于修改数据。 例5、定义一个存放每个学生的学号及平均成绩的视图 解:CREATE VIEW S_G(Sno, AverageGrade) AS SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno 注意:如果子查询的选择列表包含表达式或统计函数而且在子查询中也没有为这样的列指定列标题,则在定义视图的语句中必须要指定视图属性列的名字。
三、删除视图 • 删除视图的SQL语句的格式为: DROP VIEW <视图名> 例:删除IS_Student视图。 解: DROP VIEW IS_Student 注意:如果被删除的视图是作为其他视图的数据源, 则导出视图将无法再使用了。同样,如果作为视图的 基本表被删除了,则视图也将无法使用。
四、查询视图 • 视图定义后,用户可以像对基本表一样对视图进行查询了。 例1、在信息系学生的视图中找出年龄小于20岁的学生。 解2:SELECT Sno,Sage FROM Student WHERE Sdept=‘IS’ AND Sage<20 解1:SELECT Sno,Sage FROM IS_Student WHERE Sage<20 说明:DBMS执行查询时,首先进行有效性检查。检查语句中涉及的表、视图等是否存在。如果存在,就从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询。这一转换过程称为视图消解。本例转换后的查询语句为解2.
五、更新视图 • 由于视图是一张虚表,所以对视图的更新,最终实际上是转换成对基本表的更新。其更新操作包括插入、修改和删除数据。 例1:将信息系学生视图中学号为9521101的学生姓名改为“李立”。 解:UPDATE IS_Student SET Sname=‘李立’ WHERE Sno=‘9521101’ 转换后的语句为:UPDATE Student SET Sname=‘李立’ WHERE Sno=‘9521101’ AND Sdept=‘IS’
五、更新视图 (Cont.) 例2、向信息系学生视图中插入一个新的学生记录,其中学号为9541101,姓名为赵新,年龄20。 解: INSERT INTO IS_Student VALUES(‘9541101’ ,’赵新’,20) 转换为对基本表的更新语句为: INSERT INTO Student(Sno,Sname,Sage,Sdept) VALUES(‘9541101’ ,’赵新’,20,’信息系’)
五、更新视图 (Cont.) 例3、删除信息系学生视图中学号为9541101的记录。 解: DELETE FROM IS_Student WHERE Sno=‘9541101’ 转换为对基本表的更新语句为: DELETE FROM Student WHERE Sno=‘9541101’ AND Sdept=‘信息系’
思考与讨论 1、什么是视图?使用视图的优点和缺点是什么? 2、能从视图上创建视图吗? 3、将创建视图的基表从数据库中删除调,视图也会一并删除吗? 4、视图与查询的区别是什么?
视图与查询的区别 1、存储方式。视图存储为数据库设计的一部分,而查询则不是 2、更新结果。对视图和查询的结果集更新限制是不同的。 3、排序结果。可以排序任何查询结果,但是只有当视图包括TOP子句时才能排序视图。 4、参数设置。可以为查询创建参数,但不能为视图创建参数。 5、加密。可以加密视图,但不能加密查询。
小 结 视图是基于数据库基本表的虚表,它实际不包含数据,它的数据全部来自于基本表。视图提供了数据库的逻辑独立性,并增加了数据的安全,封装了复杂的查询,为用户提供了从不同的角度看数据的方法。