数据库实验: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
相关推荐
luckys.one7 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。8 小时前
Django中的软删除
数据库·django·sqlite
汇能感知9 小时前
摄像头模块在运动相机中的特殊应用
经验分享·笔记·科技
阿巴Jun9 小时前
【数学】线性代数知识点总结
笔记·线性代数·矩阵
茯苓gao10 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾10 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
阿里嘎多哈基米10 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码10 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
jakeswang10 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
DKPT10 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习