数据库实验:SQL的数据视图

目录

视图概述

视图是由数据库中的一个表或多个表导出的虚拟表,其作用是方便用户对数据的操作

视图的概念

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。同样对视图的更新,会影响到原来表的数据

视图是存储在数据库中的查询的SQL语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,例如,员工信息表,可以用视图只显示姓名、工龄、地址,而不显示社会保险号和工资数等;另一个原因是可使复杂的查询易于理解和使用。这个视图就像一个"窗口",从中只能看到你想看的数据列。这意味着你可以在这个视图上使用SELECT *,而你看到的将是你在视图定义里给出的那些数据列

视图的作用

视图是在原有表或者视图的基础上重新定义的虚拟表,这可以从原有的表上选取对用户有用的信息,忽略次要信息,其作用类似于筛选。视图的作用归纳为如下几点:

1.使操作简单化

视图需要达到的目的就是所见即所需。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件

2.增加数据的安全性

通过视图,用户只能查询和修改指定的数据。指定数据之外的信息,用户根本接触不到。这样可以防止敏感信息被未授权的用户查看,增强机密信息的安全性

3.提高表的逻辑独立性

视图可以屏蔽原有表结构变化带来的影响。例如原有表增加列和删除未被引用的列,对视图不会造成影响。同样,如果修改表中的某些列,可以使用修改视图来解决这些列带来的影响

实验目的

(1) 掌握DBMS的数据查询功能

(2) 掌握SQL语言的视图功能

实验内容

(1) 创建表的视图

(2) 利用视图完成表的查询

(3) 删除表的视图

实验要求

(1) 掌握视图的定义

(2) 掌握对视图的操作

(3) 写出实验报告

实验过程



该条款可以给出 一个可更新的视图,用于防止插入到select_statement中的子句不为真的行中。它还 防止更新子句为 true 但更新会导致其不为 true 的行(在 换句话说,它可以防止可见行更新为 不可见的行)。WITH CHECK OPTIONWHEREWHERE








会出现无法插入的问题







(1)创建视图

练习1:创建信息系学生的视图。

sql 复制代码
CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;

思考:其中,WITH CHECK OPTION子句的作用是什么?

练习2:建立信息系选修了1号课程且成绩在88分以上的学生的视图。

解法1:

sql 复制代码
CREATE VIEW IS_S1_88(Sno,Sname,Grade)
AS
SELECT Student.Sno, Sname, Grade
FROM Student,SC
WHERE Sdept='IS' AND 
      Student.Sno=SC.Sno AND
      Cno='1' AND Grade>=88;
      ```
解法2:
```sql
CREATE VIEW IS_S1_88(Sno,Sname,Grade)
AS
SELECT IS_Student.Sno, Sname, Grade
FROM IS_Student,SC
WHERE IS_Student.Sno=SC.Sno AND
      Cno='1' AND Grade>=88;

练习3:将学生的学号及平均成绩定义为一个视图。

sql 复制代码
CREATE VIEW S_G(Sno,Gavg)
AS
SELECT Sno, AVG(Grade)
FROM SC
GROUP BY Sno;

(2)查询视图

练习4:在信息系学生的视图中找出年龄小于19的女生。

sql 复制代码
SELECT Sno,Sname,Ssex,Sage
FROM IS_Student
WHERE Sage<19 and Ssex='女';

思考:试写出通过视图消解法转换后的查询语句。

练习5:利用IS_S1_88视图,查询信息系选修了1号课程且成绩在92分以上的学生的学号、姓名和成绩。

sql 复制代码
SELECT *
FROM IS_S1_88
WHERE Grade>=92;

思考:如何查询信息系选修了1号课程且成绩在85分以上的学生的学号、姓名、性别、年龄和成绩?

练习6:在S_G视图(参见练习3)中查询平均成绩在88分以上的学生学号和平均成绩。

sql 复制代码
SELECT *
FROM S_G
WHERE Gavg>=88;

思考:对于此视图查询语句,SQL Server2005能否正确完成视图消解?试根据实际执行结果的正确与否加以判断,并写出视图消解转换后的SQL语句。(参考教材p122-123)

(3)更新视图

练习7:向信息系学生视图IS_Student中插入一个新的学生元组,其中学号为200215185,姓名为周捷轮,性别为男,年龄为23岁。

sql 复制代码
INSERT 
INTO IS_Student
VALUES('200215185','周捷轮','男',23);

思考:执行此语句会出现什么问题?如何修改?

试试:

① 首先,使用如下语句新建一个信息系学生视图IS_Student2:

sql 复制代码
CREATE VIEW IS_Student2
AS
SELECT Sno,Sname,Ssex,Sage
FROM Student
WHERE isnull(Sdept,'IS')= 'IS ' /*判断Sdept是否为空,若为空则用'IS'代替 */
WITH CHECK OPTION;

思考:与练习1中建立的IS_Student视图有何区别?

② 然后,执行如下SQL语句,对视图进行插入操作,观察视图和基本表中的结果是否正确?

sql 复制代码
INSERT 
INTO IS_Student2
VALUES('200215185','周捷轮','男',23);

练习8:将信息系学生视图IS_Student中学号为200215132的学生姓名修改为樊虹宇。

sql 复制代码
UPDATE IS_Student 
SET Sname='樊虹宇'
WHERE Sno='200215132';

观察:视图IS_Student、IS_Student2以及基本表Student中的数据的变化情况。

练习9:删除信息系学生视图IS_Student中学号为200215135的记录。

sql 复制代码
DELETE
FROM IS_Student 
WHERE Sno='200215135';

观察:视图IS_Student、IS_Student2以及基本表Student中的数据的变化情况。

(4)删除视图(即删除视图的定义)

练习8:删除视图S_G和视图IS_Student2。

sql 复制代码
DROP VIEW S_G;
DROP VIEW IS_Student2;

思考:如何删除视图IS_Student及其导出的其他视图?(提示:SQL Server的DROP VIEW 语句中不支持CASCADE)

扩展练习

首先执行S_T.sql,重建示例数据库S_T

然后写出并执行SQL语句完成以下各种操作,记录查询结果

sql 复制代码
AS
SELECT Sno,Sname,Ssex,Sage,Sdept
FROM Student
WHERE Sdept='CS'
WITH CHECK OPTION;

通过视图CS_Student查询计算机系男生的详细信息

通过视图CS_Student将计算机系的一个新生元组(学号为200215120,姓名为龙语嫣,性别为女,年龄17岁)插入表中

sql 复制代码
INSERT 
INTO CS_Student
VALUES('200215120','龙语嫣','女',17,'CS');

如果换成如下语句:(系别改为信息系)

sql 复制代码
INSERT 
INTO CS_Student
VALUES('200215120','龙语嫣','女',17,'IS');

会出现什么问题?

通过视图CS_Student将计算机系某个男生(学号为200215121)的年龄修改为19岁

将信息系所有女生的学号及她的平均成绩定义为一个视图S_F_G

通过视图S_F_G查询信息系所有女生中平均成绩在85-95之间的学号及平均成绩

(7)删除视图IS_Student和视图S_F_G

创建表的视图

例如:建立信息系学生的视图

sql 复制代码
       CREATE VIEW IS_Student
               AS 
               SELECT Sno,Sname,Sage
               FROM    Student
               WHERE  Sdept= 'IS'

利用视图完成表的查询

例如:查询信息系选修了1号课程的学生

sql 复制代码
SELECT  Sno,Sname
FROM     IS_Student,SC
WHERE  IS_Student.Sno =SC.Sno AND
                  SC.Cno= '1'

删除表的视图

例如:

sql 复制代码
DROP VIEW IS_Student
相关推荐
是程序喵呀6 分钟前
MySQL备份
android·mysql·adb
指尖上跳动的旋律14 分钟前
shell脚本定义特殊字符导致执行mysql文件错误的问题
数据库·mysql
一勺菠萝丶25 分钟前
MongoDB 常用操作指南(Docker 环境下)
数据库·mongodb·docker
lucky_syq1 小时前
Hive SQL和Spark SQL的区别?
hive·sql·spark
m0_748244831 小时前
StarRocks 排查单副本表
大数据·数据库·python
oneouto1 小时前
selenium学习笔记(二)
笔记·学习·selenium
C++忠实粉丝1 小时前
Redis 介绍和安装
数据库·redis·缓存
sealaugh321 小时前
aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发
笔记·学习·aws
wmd131643067122 小时前
将微信配置信息存到数据库并进行调用
数据库·微信
是阿建吖!2 小时前
【Linux】基础IO(磁盘文件)
linux·服务器·数据库