《第4章-数据操作ppt课件.ppt》由会员分享,可在线阅读,更多相关《第4章-数据操作ppt课件.ppt(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4章 数据操作v4.1 4.1 数据查询功能数据查询功能v4.2 4.2 数据更改功能数据更改功能v4.3 4.3 视图视图4.1 数据查询功能 v4.1.1 查询语句的基本结构查询语句的基本结构v4.1.2 简单查询简单查询v4.1.3 多表连接查询多表连接查询v4.1.4 使用使用TOP限制结果集限制结果集v4.1.5 子查询子查询 查询语句基本格式SELECT -需要哪些列需要哪些列 FROM -来自于哪些表来自于哪些表 WHERE -根据什么条件根据什么条件 GROUP BY HAVING ORDER BY 1. 选择表中若干列v查询表中用户感兴趣的部分属性列。查询表中用户感兴趣的部
2、分属性列。v例例1:查询全体学生的学号与姓名。:查询全体学生的学号与姓名。SELECT Sno,Sname FROM Studentv例例2:查询全体学生的姓名、学号和:查询全体学生的姓名、学号和所在系。所在系。SELECT Sname,Sno,Sdept FROM Student 查询全部列 v例例3查询全体学生的记录查询全体学生的记录 SELECT Sno,Sname,Ssex, Sage, Sdept FROM Studentv等价于:等价于: SELECT * FROM Student 查询经过计算的列 v例例4查询全体学生的姓名及其出生年份。查询全体学生的姓名及其出生年份。 SELE
3、CT Sname,2009 - Sage FROM Studentv例例5含字符串常量的列:查询全体学生的姓含字符串常量的列:查询全体学生的姓名和出生年份,并在出生年份列前加一列,此名和出生年份,并在出生年份列前加一列,此列的每行数据均为列的每行数据均为“出生年份出生年份”常量值。常量值。 SELECT Sname,出生年份, 2009-Sage FROM Student 消除取值相同的记录v例例6在修课表中查询有哪些学生修了课程,在修课表中查询有哪些学生修了课程,要求列出学生的学号。要求列出学生的学号。 SELECT Sno FROM SCv结果中有重复的行。结果中有重复的行。v用用DIST
4、INCT关键字可以去掉结果中的重复关键字可以去掉结果中的重复行。行。vDISTINCT关键字放在关键字放在SELECT词的后边、词的后边、目标目标列名序列的前边。SELECT DISTINCT Sno FROM SC2. 查询满足条件的元组 查询条件谓 词比较运算符比较运算符=, , =, , =, (或(或!=)NOT+比较运算符比较运算符 确定范围确定范围BETWEENAND, NOT BETWEENAND确定集合确定集合IN, NOT IN字符匹配字符匹配LIKE, NOT LIKE 空值空值IS NULL, IS NOT NULL逻辑谓词)逻辑谓词)AND, OR比较大小v例例7查询计
5、算机系全体学生的姓名。查询计算机系全体学生的姓名。SELECT Sname FROM Student WHERE Sdept = 计算机系v例例8查询年龄在查询年龄在20岁以下的学生的姓名及年龄。岁以下的学生的姓名及年龄。SELECT Sname, Sage FROM Student WHERE Sage 20v例例9查询考试成绩有不及格的学生的学号查询考试成绩有不及格的学生的学号 SELECT DISTINCT Sno FROM SC WHERE Grade =20 AND Sage=23 示例v例例11查询年龄不在查询年龄不在2023之间的学生姓之间的学生姓名、所在系和年龄。名、所在系和年
6、龄。SELECT Sname, Sdept, Sage FROM Student WHERE Sage NOT BETWEEN 20 AND 23v等价于:等价于:SELECT Sname, Sdept, Sage FROM Student WHERE Sage 23 示例v例例12 对于日期类型的数据也可以使用基于对于日期类型的数据也可以使用基于范围的查找。查询范围的查找。查询1991年年6月出版的图书月出版的图书信息:信息:SELECT title_id, type, price, pubdate FROM titles WHERE pubdate BETWEEN 1991/6/1 AND
7、 1991/6/30确定集合v用来查找属性值属于指定集合的元组。用来查找属性值属于指定集合的元组。v格式为:格式为:v列名列名 NOT INNOT IN(常量(常量1, 1, 常量常量2,2,常量常量n n)vIN:当列中的值与IN中的某个常量值相等时,则结果为True,表明此记录为符合查询条件的记录。vNOT IN:当列中的值与某个常量值相等时,结果为False,表明此记录为不符合查询条件的记录。示例v例例13 查询信息管理系、通信工程系和计算机系查询信息管理系、通信工程系和计算机系学生的姓名和性别。学生的姓名和性别。SELECT Sname, Ssex FROM Student WHERE
8、 Sdept IN (信息管理系, 电子商务系, 计算机系)v等价于:等价于:SELECT Sname, Ssex FROM Student WHERE Sdept = 信息管理系 OR Sdept = 电子商务系 OR Sdept = 计算机系 示例(续)v例例14 查询既不是信息管理系、通信工程查询既不是信息管理系、通信工程系,也不是计算机系学生的姓名和性别。系,也不是计算机系学生的姓名和性别。SELECT Sname, Ssex FROM Student WHERE Sdept NOT IN (信息管理系, 电子商务系, 计算机系)v等价于:等价于:SELECT Sname, Ssex
9、FROM Student WHERE Sdept!= 信息管理系 AND Sdept!= 电子商务系 AND Sdept!= 计算机系 字符匹配v一般形式为:一般形式为: 列名列名 NOT LIKE NOT LIKE v匹配串中可包含如下四种通配符:匹配串中可包含如下四种通配符: _:匹配任意一个字符; %:匹配0个或多个字符; :匹配 中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表达 ); :不匹配 中的任意一个字符。 示例v例例15查询学生表中姓查询学生表中姓张张的学生的详细的学生的详细信息。信息。SELECT * FROM Student WHERE Sname LIK
10、E 张%v例例16查询学生表中姓查询学生表中姓张张、姓、姓李李和和姓姓刘刘的学生的情况。的学生的情况。SELECT * FROM Student WHERE Sname LIKE 张李刘%示例(续)v例例17 查询查询Student表中名字的第表中名字的第2个字为个字为“小小”或或“大大”的学生的姓名的学生的姓名和学号。和学号。SELECT Sname, Sno FROM Student WHERE Sname LIKE _小大%示例(续)v例例18 查询查询Student表中所有不姓表中所有不姓“刘刘”的学生。的学生。SELECT Sname FROM Student WHERE Sname
11、 NOT LIKE 刘%v例例19 从从Student表中查询学号的最后一表中查询学号的最后一位不是位不是2、3、5的学生信息。的学生信息。SELECT * FROM Student WHERE Sno LIKE %235 涉及空值的查询v空值(空值(NULL)在数据库中表示不确定的值。)在数据库中表示不确定的值。v例如,学生选修课程后还没有考试时,这些学例如,学生选修课程后还没有考试时,这些学生有选课记录,但没有考试成绩,因此考试成生有选课记录,但没有考试成绩,因此考试成绩为空值。绩为空值。v判断某个值是否为判断某个值是否为NULL值,不能使用普通的值,不能使用普通的比较运算符。比较运算符。
12、v判断取值为空的语句格式为:判断取值为空的语句格式为:列名 IS NULLv判断取值不为空的语句格式为:判断取值不为空的语句格式为:列名 IS NOT NULL 示例v例例20 查询还没有考试的学生的学号和相应查询还没有考试的学生的学号和相应的课程号。的课程号。SELECT Sno, Cno FROM SC WHERE Grade IS NULLv查询结果如图查询结果如图4-20所示。所示。例例21 查询所有已经考试了的学生的学号和课查询所有已经考试了的学生的学号和课程号。程号。SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL多重条件查询v在在WH
13、ERE子句中可以使用逻辑运算符子句中可以使用逻辑运算符AND和和OR来组成多条件查询。来组成多条件查询。v使用使用AND谓词的语法格式如下:谓词的语法格式如下:布尔表达式1 AND布尔表达式2 AND AND 布尔表达式nv只有当全部的布尔表达式均为真时,整个只有当全部的布尔表达式均为真时,整个表达式的结果才为真,只要有一个布尔表达表达式的结果才为真,只要有一个布尔表达式的结果为假,则整个表达式结果即为假。式的结果为假,则整个表达式结果即为假。多重条件查询(续)v使用使用OR谓词的语法格式如下。谓词的语法格式如下。布尔表达式1 OR布尔表达式2 OR OR 布尔表达式nv表示只要其中一个布尔表
14、达式为真,则整表示只要其中一个布尔表达式为真,则整个表达式的结果即为真;只有当全部布尔个表达式的结果即为真;只有当全部布尔表达式的结果均为假时,整个表达式结果表达式的结果均为假时,整个表达式结果才为假。才为假。示例v例例22 查询计算机系年龄在查询计算机系年龄在20岁以下的学岁以下的学生姓名生姓名SELECT Sname FROM Student WHERE Sdept = 计算机系 AND Sage 20示例(续)v例例23 查询计算机系和信息管理系学生中年龄在查询计算机系和信息管理系学生中年龄在1820的学生的学号、姓名、所在系和年龄。的学生的学号、姓名、所在系和年龄。SELECT Sno
15、, Sname, Sdept, Sage FROM Student WHERE (Sdept = 计算机系 OR Sdept = 信息管理系) AND Sage between 18 and 20v也可写为:也可写为:SELECT Sno, Sname, Sdept, Sage FROM Student WHERE Sdept in ( 计算机系, 信息管理系) AND Sage between 18 and 203. 对查询结果集进行排序v可对查询结果进行排序。可对查询结果进行排序。 v排序子句为:排序子句为:ORDER BY ASC | DESC , v说明:按说明:按进行升序(进行升序(
16、ASC)或降序(或降序(DESC)排序。)排序。示例v例例24 将学生按年龄的升序排序。将学生按年龄的升序排序。 SELECT * FROM Student ORDER BY Sagev例例25 查询选修了查询选修了“C002”号课程的学生号课程的学生的学号及其成绩,查询结果按成绩降序排的学号及其成绩,查询结果按成绩降序排列。列。 SELECT Sno, Grade FROM SC WHERE Cno=C002 ORDER BY Grade DESC示例(续)v例例26 查询全体学生的信息,查询结果按查询全体学生的信息,查询结果按所在系的系名升序排列,同一系的学生按所在系的系名升序排列,同一系
17、的学生按年龄降序排列。年龄降序排列。SELECT * FROM Student ORDER BY Sdept, Sage DESC4. 使用统计函数汇总数据 vSQL提供的统计函数有:提供的统计函数有: COUNT( *):统计表中元组个数; COUNT(DISTINCT ):统计本列列值个数; SUM( ):计算列值总和; AVG( ):计算列值平均值; MAX( ):求列值最大值; MIN( ):求列值最小值。v上述函数中除COUNT(*)外,其他函数在计算过程中均忽略NULL值。示例v例例27 统计学生总人数。统计学生总人数。SELECT COUNT(*) FROM Student v例
18、例28 统计选修了课程的学生的人数。统计选修了课程的学生的人数。SELECT COUNT (DISTINCT Sno) FROM SCv例例29计算学号为计算学号为“0611101”的学生的考的学生的考试总成绩之和。试总成绩之和。 SELECT SUM(Grade) FROM SC WHERE Sno = 0611101 示例(续)v例例30 计算计算“C001”课程的学生的考试平课程的学生的考试平均成绩。图均成绩。图4-25 例例31查询结果查询结果SELECT AVG(Grade) FROM SC WHERE Cno=C001v例例31 查询选修了查询选修了“C001”号课程的学生号课程的
19、学生的最高分和最低分。的最高分和最低分。 SELECT MAX(Grade) 最高分, MIN(Grade) 最低分 FROM SC WHERE Cno=C001 注意v统计函数不能出现在统计函数不能出现在WHERE子句中。子句中。v例如,查询年龄最大的学生的姓名,如下例如,查询年龄最大的学生的姓名,如下写法是错误的:写法是错误的:SELECT Sname FROM Student WHERE Sage = MAX(Sage) 5. 对查询结果进行分组计算 v作用:可以控制计算的级别:对全作用:可以控制计算的级别:对全表还是对一组。表还是对一组。v目的:细化计算函数的作用对象。目的:细化计算函
20、数的作用对象。v分组语句的一般形式:分组语句的一般形式: GROUP BY HAVING 使用GROUP BY示例v 例例32 统计每门课程的选课人数,列出课程统计每门课程的选课人数,列出课程号和人数。号和人数。SELECT Cno as 课程号, COUNT(Sno) as 选课人数 FROM SC GROUP BY Cnov 该语句首先对查询结果按该语句首先对查询结果按Cno的值分组,所的值分组,所有具有相同有具有相同Cno值的元组归为一组,然后再值的元组归为一组,然后再对每一组使用对每一组使用COUNT函数进行计算,求得函数进行计算,求得每组的学生人数。每组的学生人数。 示例(续)v例例
21、33 查询每名学生的选课门数和平查询每名学生的选课门数和平均成绩。均成绩。SELECT Sno 学号, COUNT(*) 选课门数, AVG(Grade) 平均成绩 FROM SC GROUP BY Sno注意vGROUP BY子句中的分组依据列必须是表子句中的分组依据列必须是表中存在的列名,不能使用中存在的列名,不能使用AS子句指派的结子句指派的结果集列的别名。果集列的别名。v带有带有GROUP BY 子句的子句的SELECT语句的语句的查询列表中只能出现分组依据列或统计函查询列表中只能出现分组依据列或统计函数,因为分组后每个组只返回一行结果。数,因为分组后每个组只返回一行结果。 示例(续)
22、v例例34 统计每个系的学生人数和平均统计每个系的学生人数和平均年龄。年龄。SELECT Sdept, COUNT(*) AS 学生人数, AVG(Sage) AS 平均年龄 FROM Student GROUP BY Sdept示例(续)v例例35 带带WHERE子句的分组,统计子句的分组,统计每个系的女生人数。每个系的女生人数。SELECT Sdept, Count(*) 女生人数 FROM Student WHERE Ssex = 女 GROUP BY Sdept示例(续)v例例36 按多列分组。统计每个系的男生按多列分组。统计每个系的男生人数和女生人数以及男生的最大年龄和人数和女生人数
23、以及男生的最大年龄和女生的最大年龄。结果按系名升序排序女生的最大年龄。结果按系名升序排序SELECT Sdept, Ssex, Count(*) 人数, Max(Sage) 最大年龄 FROM Student GROUP BY Sdept, Ssex ORDER BY Sdept 使用HAVINGv HAVING子句用于对分组后的结果再进行子句用于对分组后的结果再进行过滤,过滤,v 它的功能有点像它的功能有点像WHERE子句,但它用于子句,但它用于组而不是单个记录。组而不是单个记录。v 在在HAVING子句中可以使用统计函数,但子句中可以使用统计函数,但在在WHERE子句中则不能。子句中则不能
24、。v HAVING通常与通常与GROUP BY子句一起使子句一起使用。用。示例v例例37 查询选修查询选修3门以上课程的学生门以上课程的学生的学号和选课门数。的学号和选课门数。SELECT Sno, count(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) 3示例(续)v例例38 查询选课门数大于等于查询选课门数大于等于4门的门的学生的平均成绩和选课门数。学生的平均成绩和选课门数。SELECT Sno, AVG(Grade) 平均成绩, COUNT(*) 选课门数 FROM SC GROUP BY Sno HAVING COUNT(*) = 4说明v
25、WHERE子句用来筛选子句用来筛选FROM子句中子句中指定的数据源所产生的行数据。指定的数据源所产生的行数据。vGROUP BY子句用来对经子句用来对经WHERE子句筛选后的结果数据进行分组。子句筛选后的结果数据进行分组。vHAVING子句用来对分组后的结果数子句用来对分组后的结果数据再进行筛选。据再进行筛选。说明(续)v对于可以在分组操作之前应用的搜索对于可以在分组操作之前应用的搜索条件,在条件,在WHERE子句中指定它们更子句中指定它们更有效,这样可以减少参与分组的数据有效,这样可以减少参与分组的数据行。行。v应当在应当在HAVING子句中指定的搜索条子句中指定的搜索条件应该是那些必须在执
26、行分组操作之件应该是那些必须在执行分组操作之后应用的搜索条件。后应用的搜索条件。v建议将所有行搜索条件放在建议将所有行搜索条件放在WHERE子句子句中而不是中而不是HAVING子句中子句中 说明(续)v例如,查询计算机系和信息管理系的学生人数:例如,查询计算机系和信息管理系的学生人数:SELECT Sdept, COUNT(*) FROM Student GROUP BY Sdept HAVING Sdept in ( 计算机系, 信息管理系)v或:或:SELECT sdept, COUNT (*) FROM Student WHERE Sdept in ( 计算机系, 信息管理系) GROU
27、P BY Sdeptv第二种写法比第一种写法效率要高,因为参与分第二种写法比第一种写法效率要高,因为参与分组的数据会比较少。组的数据会比较少。4.1.3 多表连接查询 v若一个查询同时涉及两个或两个若一个查询同时涉及两个或两个以上的表,则称之为连接查询。以上的表,则称之为连接查询。v连接查询是关系数据库中最主要连接查询是关系数据库中最主要的查询的查询v连接查询包括内连接、外连接和连接查询包括内连接、外连接和交叉连接等。交叉连接等。连接基础知识v连接查询中用于连接两个表的条件称为连连接查询中用于连接两个表的条件称为连接条件或连接谓词。接条件或连接谓词。 v一般格式为:一般格式为: =必须是可比的
28、必须是可比的内连接vSQL-92 内连接语法如下:内连接语法如下: SELECT FROM 表名 INNER JOIN 被连接表 ON 连接条件执行连接操作的过程执行连接操作的过程v首先取表1中的第1个元组,然后从头开始扫描表2,逐一查找满足连接条件的元组,v找到后就将表1中的第1个元组与该元组拼接起来,形成结果表中的一个元组。v表2全部查找完毕后,再取表1中的第2个元组,然后再从头开始扫描表2, v重复这个过程,直到表1中的全部元组都处理完毕为止。 示例v例例39 查询每个学生及其选课的详细查询每个学生及其选课的详细信息。信息。SELECT * FROM Student INNER JOIN
29、 SC ON Student.Sno = SC.Snov结果中有重复的列。结果中有重复的列。示例(续)v例例40 去掉例去掉例39中的重复列。中的重复列。SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno 示例(续)v例例41 查询计算机系学生的修课情况,查询计算机系学生的修课情况,要求列出学生的名字、所修课的课程要求列出学生的名字、所修课的课程号和成绩。号和成绩。SELECT Sname, Cno, Grade FROM Student JO
30、IN SC ON Student.Sno = SC.Sno WHERE Sdept = 计算机系 4.1.5 子查询 v一个SELECT 语句称为一个查询块。v子查询是一个SELECT查询,它嵌套在 SELECT、INSERT、UPDATE、DELETE 语句的WHERE或HAVING子句内,或其它子查询中。 v子查询的SELECT查询使用圆括号括起来。v子查询语句可以出现在任何能够使用表达式的地方,通常情况下,子查询语句用在外层查询的WHERE子句或HAVING子句中 。1. 使用子查询进行基于集合的测试v使用子查询进行基于集合的使用子查询进行基于集合的测试的语句的一般格式为:测试的语句的一
31、般格式为:列名 NOT IN (子查询) 示例v例例51. 查询与刘晨在同一个系的学生。查询与刘晨在同一个系的学生。SELECT Sno, Sname, Sdept FROM StudentWHERE Sdept IN ( SELECT Sdept FROM Student WHERE Sname = 刘晨 ) AND Sname != 刘晨 示例(续)v例例52. 查询成绩为大于查询成绩为大于90分的学生分的学生的学号、姓名。的学号、姓名。SELECT Sno, Sname FROM StudentWHERE Sno IN( SELECT Sno FROM SCWHERE Grade 90
32、) 示例(续)v例例53. 查询选修了查询选修了“VB”课程的学生的学课程的学生的学号、姓名。号、姓名。 SELECT Sno, Sname FROM Student WHERE Sno IN( SELECT Sno FROM SC WHERE Cno IN(SELECT Cno FROM Course WHERE Cname = VB) ) 4.2 数据更改功能 v4.2.1 插入数据插入数据 v4.2.2 更新数据更新数据 v4.2.3 删除数据删除数据4.2.1 插入数据 v插入单行记录的插入单行记录的INSERT语句的格式为:语句的格式为:INSERT INTO () VALUES (
33、值表)(值表)v功能:新增一个符合表结构的数据行,将功能:新增一个符合表结构的数据行,将值表数据按表中列定义顺序值表数据按表中列定义顺序或列名表顺序或列名表顺序赋给对应列名。赋给对应列名。注意值列表中的值与列名表中的列按位置顺序对应,它们的数据类型必须一致。如果后边没有指明列名,则新插入记录的值的顺序必须与表中列的定义顺序一致,且每一个列均有值(可以为空)。示例v例例1 将一个新生插入到将一个新生插入到Student表中,学表中,学号:号:0621105,姓名:陈冬,性别:男,姓名:陈冬,性别:男,年龄年龄18岁,信息管理系学生。岁,信息管理系学生。INSERT INTO Student VA
34、LUES (0621105, 陈冬, 男, 信息管理系, 18)v例例2 在在SC表中插入一条新记录,学号为表中插入一条新记录,学号为“0621105”,选修的课程号为,选修的课程号为“C001”,成绩暂缺。成绩暂缺。INSERT INTO SC(Sno, Cno) VALUES(0621105, C001) 4.2.2 更新数据 v用用UPDATE语句实现。格式:语句实现。格式:UPDATE SET , n WHERE v需要修改数据的表的名称。vSET子句指定要修改的列,表达式指定要修改后的新值。vWHERE子句用于指定只修改表中满足条件的记录的相应列值。无条件更新v例例1. 将所有学生的
35、年龄加将所有学生的年龄加1。UPDATE Student SET Sage = Sage + 1有条件更新v1. 基于本表条件的更新基于本表条件的更新v例例2.将学号为将学号为“0611104”学生的年学生的年龄改为龄改为18岁。岁。 UPDATE Student SET Sage = 18WHERE Sno = 0611104 2. 基于其他表条件的更新v例例3:将计算机系全体学生的成绩加:将计算机系全体学生的成绩加5分。分。v(1)用子查询实现UPDATE SC SET Grade = Grade + 5 WHERE Sno IN(SELECT Sno FROM Student WHERE
36、 Sdept = 计算机系 )v (2)用多表连接实现UPDATE SC SET Grade = Grade + 5 FROM SC JOIN Student ON SC.Sno = Student.Sno WHERE Sdept = 计算机系基于其他表条件的更新(续)v例例4 将学分最低的课程的学分加将学分最低的课程的学分加2分。分。UPDATE Course SET Ccredit = Ccredit + 2 WHERE Ccredit = ( SELECT MIN(Ccredit) FROM Course)4.2.3 删除数据 v用用DELETE语句实现。格式:语句实现。格式:DELET
37、E FROM WHERE v说明了要删除哪个表中的数据。说明了要删除哪个表中的数据。vWHERE子句说明只删除表中满足条件的子句说明只删除表中满足条件的记录。记录。 无条件删除v例例1. 删除所有学生的选课记录。删除所有学生的选课记录。DELETE FROM SC 有条件删除 v(1)基于本表条件的删除。)基于本表条件的删除。v例例2删除所有不及格学生的修课记录。删除所有不及格学生的修课记录。 DELETE FROM SC WHERE Grade 60 基于其他表条件的删除v例例3删除计算机系不及格学生的修课记录。删除计算机系不及格学生的修课记录。v(1)用子查询实现)用子查询实现DELETE
38、 FROM SC WHERE Grade 60 AND Sno IN ( SELECT Sno FROM Student WHERE Sdept = 计算机系 )v(2)用多表连接实现)用多表连接实现DELETE FROM SC FROM SC JOIN Student ON SC.Sno = Student.SnoWHERE Sdept = 计算机系AND Grade 60 4.3 视图 v4.3.1 基本概念v4.3.2 定义视图v4.3.3 通过视图查询数据v4.3.4 修改和删除视图 v4.3.5 视图的作用 4.3.1 基本概念v视图是由从数据库的基本表中选取出来的视图是由从数据库的
39、基本表中选取出来的数据组成的逻辑窗口,是基本表的部分行数据组成的逻辑窗口,是基本表的部分行和列数据的组合。和列数据的组合。v视图是一个虚表。数据库中只存放视图的视图是一个虚表。数据库中只存放视图的定义,而不存放视图包含的数据,这些数定义,而不存放视图包含的数据,这些数据仍存放在原来的基本表中。据仍存放在原来的基本表中。v基本表中的数据如果发生变化,从视图中基本表中的数据如果发生变化,从视图中查询出的数据也会随之变化。查询出的数据也会随之变化。 基本概念(续)v视图可以从一个基本表中提取数据,视图可以从一个基本表中提取数据,也可以从多个基本表中提取数据,甚也可以从多个基本表中提取数据,甚至还可以
40、从其他视图中提取数据,构至还可以从其他视图中提取数据,构成新的视图。成新的视图。v对视图数据的操作最终都会转换为对对视图数据的操作最终都会转换为对基本表的操作。基本表的操作。 基本概念(续)4.3.2 定义视图定义视图v定义视图的格式如下:定义视图的格式如下:CREATE VIEW (视图列名表)AS 查询语句v注意:注意: 查询语句中通常不包含ORDER BY和DISTINCT子句。 在定义视图时要么指定视图的全部列名,要么全部省略不写,不能只写视图的部分列名。 必须明确指定视图所有列名的情况 v某个目标列不是简单的列名,而是函某个目标列不是简单的列名,而是函数或表达式。数或表达式。v多表连
41、接时选出了几个同名列作为视多表连接时选出了几个同名列作为视图的字段。图的字段。v需要在视图中为某个列选用新的更合需要在视图中为某个列选用新的更合适的列名。适的列名。1定义单源表视图定义单源表视图v视图的数据取自一个基本表的部分行和列视图的数据取自一个基本表的部分行和列v例例1 1 建立查询信息管理系学生的学号、姓建立查询信息管理系学生的学号、姓名、性别和年龄的视图。名、性别和年龄的视图。CREATE VIEW IS_StudentAS SELECT Sno, Sname, Ssex, Sage FROM Student WHERE Sdept = 信息管理系例例32定义多源表视图定义多源表视图
42、v指定义视图的查询语句涉及多张表,这样定义的视指定义视图的查询语句涉及多张表,这样定义的视图一般只用于查询,不用于修改数据。图一般只用于查询,不用于修改数据。v例例2 2 建立信息管理系选修了建立信息管理系选修了C001C001课程的学生的学课程的学生的学号、姓名和成绩的视图。号、姓名和成绩的视图。CREATE VIEW V_IS_S1(Sno, Sname, Grade)AS SELECT Student.Sno, Sname, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno WHERE Sdept = 信息管理系 AND SC.Cno
43、= C001 例例83在已有视图上定义新视图在已有视图上定义新视图v可以在视图上再建立视图,这时作为数据可以在视图上再建立视图,这时作为数据源的视图必须是已经建立好的视图。源的视图必须是已经建立好的视图。v例例3 3 利用例利用例1 1建立的视图,建立查询信息建立的视图,建立查询信息管理系年龄小于管理系年龄小于2020的学生的学号、姓名和的学生的学号、姓名和年龄的视图。年龄的视图。CREATE VIEW IS_Student_SageAS SELECT Sno, Sname, Sage FROM IS_Student WHERE Sage = 60v转换成的对最终基本表的查询:转换成的对最终基
44、本表的查询:SELECT S.Sno, Sname, Grade FROM SC JOIN Student S ON S.Sno = SC.Sno WHERE Sdept = 信息管理系 AND SC.Cno = C001 AND Grade = 60 V_IS_S1通过视图查询数据(续)通过视图查询数据(续)v例例9 9 查询信息管理系学生的学号、姓名、所选课查询信息管理系学生的学号、姓名、所选课程的课程名。程的课程名。SELECT v.Sno, Sname, Cname FROM IS_Student v JOIN SC ON v.Sno = SC.Sno JOIN Course C ON
45、 C.Cno = SC.Cnov转换成的对最终基本表的查询:转换成的对最终基本表的查询:SELECT S.Sno, Sname, Cname FROM Student S JOIN SC ON S.Sno = SC.Sno JOIN Course C ON C.Cno = SC.Cno WHERE Sdept = 信息管理系通过视图查询数据(续)通过视图查询数据(续)v例例10 10 利用例利用例6 6建立的视图,查询平均成绩建立的视图,查询平均成绩大于等于大于等于8080分的学生的学号和平均成绩。分的学生的学号和平均成绩。SELECT * FROM S_G WHERE AverageGrad
46、e = 80v正确的转换语句是:正确的转换语句是:SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade) = 80S_G4.3.4 修改和删除视图 v1修改视图修改视图v语法格式:语法格式:ALTER VIEW 视图名视图名 ( 列名列名 ,.n ) AS 查询语句查询语句 v修改视图的修改视图的SQL语句与定义视图的语句基语句与定义视图的语句基本是一样的,只是将本是一样的,只是将CREATE VIEW改成改成了了ALTER VIEW。 示例v例例11 修改例修改例6定义的视图,使其统计每个学定义的视图,使其统计每个学生的考试
47、平均成绩和修课总门数。生的考试平均成绩和修课总门数。ALTER VIEW S_G(Sno, AverageGrade,Count_Cno)AS SELECT Sno, AVG(Grade), Count(*) FROM SC GROUP BY Sno4.3.4 修改和删除视图(续)v2删除视图删除视图v语法格式:语法格式:DROP VIEW v例例12 删除例删除例1定义的定义的IS_Student视图。视图。DROP VIEW IS_Student 注意v如果被删除的视图是其他视图的数据源,如果被删除的视图是其他视图的数据源,那么删除该视图,其导出视图将无法再使那么删除该视图,其导出视图将无法再使用。用。v同样,如果视图的基本表被删除了,视图同样,如果视图的基本表被删除了,视图也将无法使用。也将无法使用。v因此,在删除基本表和视图时一定要注意因此,在删除基本表和视图时一定要注意是否存在引用被删除对象的视图,如果有是否存在引用被删除对象的视图,如果有应同时删除。应同时删除。4.3.5 视图的作用 v简化数据查询语句简化数据查询语句 v使用户能从多角度看待同一数据使用户能从多角度看待同一数据 v提高了数据的安全性提高了数据的安全性 v提供了一定程度的逻辑独立性提供了一定程度的逻辑独立性
限制150内