利用 select 语句可以实现关系数据库的所有查询。

36
1 利利 SELECT 利利利利利利利利利利利利利利利利SELECT select_list FROM TABLE 利利利 WHERE 利利 GROUP BY … HAVING … ORDER BY … 利利利COUNT SUM AVG MAX MIN COUNT(*) 利利利

Upload: nat

Post on 15-Jan-2016

228 views

Category:

Documents


0 download

DESCRIPTION

上一讲. 利用 SELECT 语句可以实现关系数据库的所有查询。. SELECT select_list FROM TABLE 或视图. WHERE 条件. GROUP BY …. HAVING …. ORDER BY …. 集函数:. COUNT. SUM. AVG. MAX. MIN. COUNT(*). 数值型. 上一讲. 自身连接. 连接查询. 左外连接. 外连接. 右外连接. IN. 比较运算符. 嵌套查询. ANY/ALL. EXISTS. 集合查询. 本讲内容. 插入数据. 数据更新. 修改数据. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 利用 SELECT 语句可以实现关系数据库的所有查询。

1

利用 SELECT 语句可以实现关系数据库的所有查询。SELECT select_list FROM TABLE 或视图WHERE 条件GROUP BY …HAVING …ORDER BY …

集函数:COUNT SUM AVG MAX MIN

COUNT(*) 数值型

上一讲

Page 2: 利用 SELECT 语句可以实现关系数据库的所有查询。

2

集合查询

自身连接

外连接左外连接

右外连接

连接查询

嵌套查询

IN

比较运算符

EXISTS

ANY/ALL

上一讲

Page 3: 利用 SELECT 语句可以实现关系数据库的所有查询。

3

本讲内容

数据更新插入数据

修改数据

删除数据

视图定义视图

查询视图

更新视图

Page 4: 利用 SELECT 语句可以实现关系数据库的所有查询。

4

插入数据

删除数据

修改数据

(INSERT)

(UPDATE)

(DELETE)

3.5 数据更新

Page 5: 利用 SELECT 语句可以实现关系数据库的所有查询。

5

一、插入数据1. 插入单个新记录INSERT INTO < 表名 > [(< 属性列 1>[,< 属性列 2>...)]

VALUES (< 常量 1> [,< 常量 2>]...)

① 属性列列表中包括表中所有列。

例 1 将一个学生记录插入 Student 表中,记录为:(学号: 95020 ;姓名:陈冬;性别:男;系: IS ;年龄: 18 )。

INSERT INTO Student VALUES (95020,‘ 陈冬’ ,18, ' 男 ','IS');

此时不需要在表名后列出所有列名。

Page 6: 利用 SELECT 语句可以实现关系数据库的所有查询。

6

② 属性列列表中不包括表中所有列。例 1 将一个学生记录插入 Student 表中,记录为:(学号: 95009 ;姓名:陈波;所在系: IS ;)。

INSERT INTO Student (Sno,Sname,Sdept)VALUES (95009,' 陈波 ', 'IS');

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

如果某些属性列在 INTO 子句中没有出现,则新记录在这些列上将取空值( NULL )。

在表定义时说明了 NOT NULL 的属性列不能取空值,这些列队值如果没有在插入语句中给出来,则会出错。然而,如果定义表时为该列指定了默认值,则新列中未指定值的该列就取得默认值。

Page 7: 利用 SELECT 语句可以实现关系数据库的所有查询。

7

例 2 插入一条选课记录,其学号为 950010 ,课号为 9 。

INSERT INTO SC (Sno,Cno) VALUES (950010,‘9');

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

如果 Grade 属性不允许空,则该语句出错;

如果 Grade 属性允许空,则执行语句后, Grade 值为 NULL ;

如果 Grade 属性指定了默认值 0 ,则执行语句后, Grade 值为0 。

Page 8: 利用 SELECT 语句可以实现关系数据库的所有查询。

8

2. 插入子查询结果INSERT INTO < 表名 > [(< 属性列 1>[,< 属性列 2>...)] 子查询;功能:一次将子查询的结果全部插入指定表中 ,完成批量插入。

例 3 对每一个系,求学生的平均年龄,并把结果存入数据库。

② 求各系学生的平均年龄。SELECT Sdept,AVG(Sage) AS Avg_age FROM Student GROUP BY Sdept

① 建立一个新表,用于存放各系学生的平均年龄。

CREATE TABLE Dept_age (Sdept CHAR(6) ,Avg_age SMALLINT);

③ 把各系平均年龄存入数据库中。INSERT INTO Dept_age(Sdept,Avg_age)

(SELECT Sdept,AVG(Sage) AS Avg_age FROM Student GROUP BY Sdept)

Page 9: 利用 SELECT 语句可以实现关系数据库的所有查询。

9

二、修改数据 (更新数据)UPDATE < 表名 >   SET < 列名 >=< 表达式 >[,< 列名 >=< 表达式 >]... [WHERE < 条件 >];

功能:修改指定表中满足 WHERE 子句条件的记录。 SET 子句: 指定修改方法,即用 < 表达式 > 的值取代相应的属性列值。

WHERE 子句:

指定即将被修改的记录应满足的条件。

如果省略 WHERE 子句,则表示要修改表中的所有记录。

例 4 将所有学生的考试成绩加上 6 分。

UPDATE SC SET

1. 修改所有记录的值 。

Grade=6+Grade;

Page 10: 利用 SELECT 语句可以实现关系数据库的所有查询。

10

例 4 数学系学生欧阳庆转到信息系,修改其记录。UPDATE Student SET Sdept='IS'

2. 修改一个记录的值 。

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

例 5 在身份证数据表 Indentity(no,name,sex,age,home) 中,在四川籍女同志身份证号码的第 6位数字后加上’19’,并在最后一位后面加上’ 7’。

3. 修改多个记录的值 。

UPDATE Indentity

SET no=left(no,6)+’19’+right(no,9)+’7’

WHERE sex=‘ 女’ AND home like’ 四川 %’ ;

WHERE Sdept='MS‘ AND Sname=' 欧阳庆 '

Page 11: 利用 SELECT 语句可以实现关系数据库的所有查询。

11

4. 带有子查询的修改语句

例 6 将计算机科学系全体学生的成绩置零。

UPDATE SCSET grade = 0WHERE ‘CS’ = (SELECT sdept FROM student where student.sno = sc.sno)

Page 12: 利用 SELECT 语句可以实现关系数据库的所有查询。

12

5. 修改操作与数据库的一致性

修改操作可能会导致数据库的不一致。

UPDATE SC SET Cno= 'x1' WHERE Cno='1';

为了防止这种不一致的发生,数据库系统采取的方法:

例如,把课程表中课号为 1 的课程的课号改为 x1:UPDATE Course SET Cno='x1' WHERE Cno='1';

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

为保证数据库的一致性,同时还应修改数据库中课号为 1的所有记录中的课号

设置外关键字约束 设置事务

Page 13: 利用 SELECT 语句可以实现关系数据库的所有查询。

13

三、删除数据DELETE FROM < 表名 > [WHERE < 条件 >];

功能:删除指定表中满足 WHERE 子句条件的所有记录。

例 7 删除 2 号课成绩低于 30 分的学生的选课。DELETE FROM SC WHERE Grade <30 and Cno='2'

1. 删除满足条件的记录

2. 删除表中所有记录DELETE FROM SC

注意:只是删除表中的数据,没有删除表定义,表仍然存在。

彻底删除一个表的方法:DROP TABLE SC

Page 14: 利用 SELECT 语句可以实现关系数据库的所有查询。

14

3. 带子查询的删除语句把子查询嵌套在 DELETE 语句中,作为执行删除操作的条件。

例 8 删除操作系统课程所有学生的选课记录。

DELETE FROM SC WHERE Cno=

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

(SELECT Cno FROM Course WHERE Cname=‘OS') ;

Page 15: 利用 SELECT 语句可以实现关系数据库的所有查询。

15

视图是从基表(或视图)中导出的表,对应于三级模式结构中的外模式,是用户观察数据库的窗口。

用户 1

用户 2

用户m

视图 1

视图 2

视图 m

3.5 视图

Page 16: 利用 SELECT 语句可以实现关系数据库的所有查询。

16

视图是虚表,数据库中只存储视图的定义,不存储视图对应的表。需要视图表时,系统从基表中即时选择数据来产生。 定义视图后,用户可以通过视图来操作数据库,执行查询、插入、删除和修改操作,其操作的结果直接作用于直接或间接导出视图的基表。

但是,有些视图只能执行查询操作。

视图 基 表查询、插入

删除和修改

查询、插入

删除和修改

视图

Page 17: 利用 SELECT 语句可以实现关系数据库的所有查询。

17

格式: CREATE VIEW < 视图名 >[(< 列名 >[,< 列名 >]...)]

AS < 子查询 > [ WITH CHECK OPTION]

子查询中不能包含 ORDER BY 子句和 DISTINCT 短语。

但是,在 MS SQL SERVER 中,可以使用 DISTINCT 短语。

[WITH CHECK OPTION] : 用于对视图的更新进行约束。

对于 ORDER BY 子句,不可以随意使用。要使用 ORDER BY 子句,则需要在视图中指定包含的最大记录数目。

一、定义视图

Page 18: 利用 SELECT 语句可以实现关系数据库的所有查询。

18

如果 CREATE VIEW 仅指定了视图名,没有指定各个属性列名,则视图中的各个列名由 SELECT 子句目标列中的诸字段组成。

例 1 建立学生视图,用于查看学生的学号,姓名和所在的系。

CREATE VIEW V_Student

AS SELECT Sno,Sname,Sdept FROM Student

例 2 建立课程设置视图,用于表示课程名称和课号。 CREATE VIEW V_Course( 课程名称 , 课号 )

AS SELECT Cname,Cno FROM Course

Student(Sno , Sname , Ssex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

行列子集视图——由单个基表导出的视图,视图中保留基表主码,去掉了基表中的某些行和列。

Page 19: 利用 SELECT 语句可以实现关系数据库的所有查询。

19

如果某个目标列不是单纯的属性名,而是集函数或列表达式 ,则必须明确指定组成视图的所有列名 。

例 3 建立系平均年龄视图,用于显示各系的平均年龄。 CREATE VIEW V_age( 系 ,平均年龄 ) AS SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept

平均年龄为基表中不存在的列,称为虚拟列。

带虚拟列的视图称为带有表达式的视图。

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

CREATE VIEW V_age ASSELECT Sdept AS 系 , AVG(Sage) AS 平均年龄 FROM Student GROUP BY Sdept

Page 20: 利用 SELECT 语句可以实现关系数据库的所有查询。

20

视图可以建立在多个基表上。

例 4 建立学生的学号 (Sno) 、姓名 (Sname) 、选修课程名(Cname)及成绩 (Grade) 的视图。

CREATE VIEW V_Student_CRASSELECT Student.Sno, Sname, Cname, GradeFROM Student, SC, CourseWHERE Student.Sno = SC.Sno AND SC.Cno = Course.Cno

Student(Sno , Sname , Sex , Sage , Sdept)Course(Cno , Cname , Cpno , Credit)SC(Sno , Cno , Grad

e)

Page 21: 利用 SELECT 语句可以实现关系数据库的所有查询。

21

视图可以建立在视图上。

例 5 建立学生的操作系统选课视图,用于显示选修了操作系统课程的学生的姓名、学号和成绩。

CREATE VIEW V_os AS

SELECT Sname, Cname,Grade FROM V_Student_CRWHERE Cname='OS'

若在子查询中使用 SELECT * ,则当基表中的列顺序发生改变时,视图中对应的列没有意义,视图将无法使用。解决方法:① 建立视图时明确指明属性列名,而不是简单地用 SELECT *。

② 在修改基本表之后删除原来的视图,然后重建视图。

Page 22: 利用 SELECT 语句可以实现关系数据库的所有查询。

22

格式: DROP VIEW < 视图名 >;

导出视图的基表或视图被删除后,该视图定义仍然存在,但是已经毫无意义,应该利用删除语句进行删除。

例 6 删除视图 V_course 。

DROP VIEW V_course;

二、删除视图

Page 23: 利用 SELECT 语句可以实现关系数据库的所有查询。

23

查询视图的方法与查询基表的方法相同。 DBMS 执行视图查询的步骤: ① 检查视图涉及的基表和视图是否存在,如果存在,则执行下一步操作;如果不存在,则停止查询。② 从数据字典中取出视图定义时使用的查询定义。③ 把从数据字典中取出的查询语句,与用户定义的查询视图语句结合起来,转换成对基表的查询。

④ 执行上一步中得到的联合查询。

把视图查询转换为对基表查询的过程称为对视图的消解。

三、查询视图

Page 24: 利用 SELECT 语句可以实现关系数据库的所有查询。

24

例 8 建立学生视图 V_student 查看学生的学号、姓名和系,并利用该视图,查询信息系选修了 1号课程的学生学号和姓名。 ① 建立学生视图:

CREATE VIEW V_student AS

SELECT Sno,Sname,Sdept FROM Student

② 查询选修了 1号课程的学生学号和姓名 :

SELECT SC.Sno, Sname FROM V_student, SC WHERE V_student.Sno=SC.Sno AND SC.Cno='1' AND Sdept='IS'

实际的查询语句 :SELECT SC.Sno,Sname FROM Student,SC WHERE Student.Sno=SC.Sno and SC.Cno='1' AND Sdept='IS'

查询视图

Page 25: 利用 SELECT 语句可以实现关系数据库的所有查询。

25

对视图执行的所有操作,最终都是在对基表进行操作。

通过视图来插入、删除和修改基表中的数据的操作 。

为防止用户通过视图对数据进行增删改时,无意或故意操作不属于视图范围内的基本表数据,可在定义视图时加上 WITH CHECK OPTION 子句,这样在视图上增删改数据时, DBMS 会进一步检查视图定义中的条件,若不满足条件,则拒绝执行该操作。

提交修改后,仍然可以通过视图看到修改后的数据。

四、更新视图

Page 26: 利用 SELECT 语句可以实现关系数据库的所有查询。

26

1. 插入视图

例 9 建立信息系学生视图 V_IS ,用于显示学生学号, 姓名,所在的系 ; 并向视图 V_IS 中插入一个新的学生记录,其中学号为 95029 ,姓名为赵新,系为信息系 IS 。

① 建立视图 V_IS:

CREATE VIEW V_IS AS SELECT Sno,Sname,Sdept FROM Student WHERE Sdept='IS'

② 插入记录:

INSERT INTO V_IS VALUES(95029, ' 赵新 ','IS');

条件:基表中不允许空值的列都出现在视图中。

更新视图

Page 27: 利用 SELECT 语句可以实现关系数据库的所有查询。

27

例 9 向信息系学生视图 V_IS 中插入一个新的学生记录,其中学号为 95029 ,姓名为张林,系为数学系 MS 。

INSERT INTO V_IS VALUES(95059, ' 张林 ','MS');

插入记录( 95059 ,张林, NULL , NULL , MS )

该记录不会出现在信息系学生视图 V_IS 中。

更新视图

Page 28: 利用 SELECT 语句可以实现关系数据库的所有查询。

28

WITH CHECK OPTION 的使用:

CREATE VIEW V_IS AS

SELECT Sno,Sname,Sdept FROM Student

WHERE Sdept=‘IS’ WITH CHECK OPTION;

目的:保证不会通过视图向基表中插入非信息系的学生记录。

INSERT INTO V_IS VALUES(95099, ' 张林 ', ‘MS’);

例如:

执行语句时就出现错误,无法插入。

更新视图

Page 29: 利用 SELECT 语句可以实现关系数据库的所有查询。

29

例 10 将学生视图 V_Student 中学号为 95002 的学生姓名改为“刘辰”。

2. 修改视图

UPDATE V_Student SET Sname=' 刘辰 ' WHERE Sno='95002';

① 一般对所有源于一个基表的行列子集视图可以执行插入和删除操作。

注意:

② 如果基表中所有不允许空值的列都出现在行列子集视图中,则可以执行插入记录的操作。③ 对于其他一些出现了集函数,或来源于多个基表的视图,是否可以执行更新操作,要视具体的数据库系统而定。

更新视图

Page 30: 利用 SELECT 语句可以实现关系数据库的所有查询。

30

简化用户的操作

使用户能以多种角度看待同一数据

在一定程度上保证数据库的逻辑独立性

在一定程度上保证数据库的安全性

五、视图的用途

用户 1

用户 2

用户m

视图 1

视图 2

视图 m

Page 31: 利用 SELECT 语句可以实现关系数据库的所有查询。

31

简化用户的操作

用户 1

用户 2

用户 m

视图 1

视图 2

视图 m

基表 1

基表 2

基表 3

基表 m

数据 1

数据 2

数据 m

基表 n

视图的用途

Page 32: 利用 SELECT 语句可以实现关系数据库的所有查询。

32

使用户从多种角度看待同一数据

学生

教务员

教师

视图 1

视图 2

视图 m

Student

Course

S C

Teacher

数据 1

数据 2

数据 m

视图的用途

Page 33: 利用 SELECT 语句可以实现关系数据库的所有查询。

33

对重构数据库提供了一定程度的逻辑独立性

学生

教务员

教师

视图 1

视图 2

视图 m

Student

Course

S C

Teacher

数据 1

数据 2

数据 m

其他

Student视图 1数据 1学生

视图 2数据 2教务员

视图的用途

Page 34: 利用 SELECT 语句可以实现关系数据库的所有查询。

34

数据库重构中最常见的是将一个基表垂直分解为多个基本表。

视图的用途

例 : 将学生关系Student ( sno,sname,ssex,sage,sdept )分为 SX(sno, sname, sage) 和 SY(sno, ssex,sdept) 。而原表 Student 为 SX 和 SY 自然连接的结果。

如果建立一个视图 Student ,可以保持应用程序的逻辑独立性:Create VIEW student(sno, sname, ssex, sage, sdept)

AS

select SX.sno,SX.sname,SY.ssex,SX,sage,SY.sdept

FROM SX, SY

WHERE SX.sno = SY.sno

Page 35: 利用 SELECT 语句可以实现关系数据库的所有查询。

35

对数据库提供了一定程度的安全性

① 通过视图把保密数据对无权存取这些数据的用户隐藏起来。

② 对不同的视图,赋予不同的权限。对视图权限的设置与对基表权限的设置互相独立。

视图的用途

Page 36: 利用 SELECT 语句可以实现关系数据库的所有查询。

36

作业第三章课后作业全做。