【数据库原理】(13)视图的使用

文章目录

  • 一.定义和删除视图
    • 1.建立视图
    • 2.删除视图
  • 二.查询视图
    • 视图查询的基本操作
    • 视图查询的内部机制
    • 查询转换的注意事项
    • 视图查询的限制
  • 三.更新视图
    • 1.插入视图数据
    • 2.删除视图数据
    • 3.修改视图数据
    • 可更新性的限制

视图(View) 是一种虚拟的表,它的内容由查询定义,但不存储实际的数据。视图是从一个或多个基本表(或其他视图)生成的。

特点:

  1. 虚拟性:视图不包含数据本身,仅保存了一个查询,这个查询在每次访问视图时动态地执行。

  2. 动态性:视图显示的数据是从基本表中实时检索出来的。因此,当基本表的数据发生变化时,视图显示的数据也会随之改变。

  3. 安全性:通过视图,可以限制用户访问基本表的特定数据,从而增强了数据库的安全性。

  4. 简便性:视图可以简化复杂的SQL操作。用户可以通过查询视图,而不必直接查询复杂的基本表。

  5. 逻辑独立性:用户可以使用视图而不必关心数据在基本表中是如何存储的。

一.定义和删除视图

1.建立视图

创建视图的目的是从一个或多个基本表(或其他视图)中提取数据,形成一个虚拟表。视图不存储实际的数据,而是保存了一个SQL查询作为其定义。这样,每次查询视图时,都会运行该查询以生成数据。

创建视图的基本语法如下:

CREATE VIEW<视图名> [(<列名>[,列名>]... )]
AS<SELECT语句>
[WITH CHECK OPTION];
  • <视图名>:要创建的视图的名称。
  • <列名1>, <列名2>, …:视图中的列名称,这是可选的。如果省略,则视图的列名称将是SELECT语句中指定的列名称。
  • <SELECT语句>:定义视图的查询。
  • WITH CHECK OPTION:这是一个可选的声明,用于确保所有视图修改都符合视图的SELECT语句的条件。

(1) 行列子集视图

若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了码,则称这类视图为行列子集视图。

建立计科 0701 班学生的视图,并要求在进行修改和插入操作时仍需保证该视图中只有计算机系的学生。

CREATE VIEW CS_S
AS
SELECT Sno, Sname, Sage
FROM S
WHERE Sclass ='CS0701'
WITH CHECK OPTION;

(2)由视图导出的视图

在已有视图的基础上创建新的视图。例如,基于CS_S视图,创建一个新视图,包含选修03号课程的学生信息:

CREATE VIEW CS_S1(Sno, Sname, Grade) AS
SELECT S.Sno, Sname, Grade
FROM CS_S, SC
WHERE CS_S.Sno = SC.Sno AND SC.Cno = '03';

(3) 带虚拟列的视图

定义视图时可以根据应用的需要,设置一些派生属性列。这些派生属性列由于在基本表中并不实际存在,因此也称它们为虚拟列。带虚拟列的视图也称为带表达式的视图。

定义一个反映学生出生年份的视图。

CREATE VIEW BS(Sno,Sname,Sbirth)
AS
SELECT Sno, Sname,2011 - Sage
FROM S:

BS 视图是一个带表达式的视图。视图中的出生年份值是通过计算得到的。

(4) 带有集函数的视图

还可以用带有集函数和 GROUP BY 子句的查询来定义视图,这种视图称为分组视图。

将学生的学号及他们的平均成绩定义为一个视图。

CREATE VIEW S_G(Sno, Gavg)ASSELECT Sno,AVG(Grade)FROM SCGROUP BY Sno;

2.删除视图

格式:

DROP VIEW <视图名>;

视图删除后视图的定义将从数据字典中删除,但由该视图导出的其他视图定义仍在数据字典中,但已经失效,不能继续使用,应该将它们一一删除。

DROP VIEW CS_S1;
DROP VIEW CS_S;

二.查询视图

查询视图时,可以像查询基本表一样操作。以下是视图查询的详细说明:

视图查询的基本操作

例如,查询计算机科学专业 0701 班年龄小于 20 岁的学生:

SELECT Sno,Sage FROM CS_S WHERE Sage < 20;

视图查询的内部机制

  • 有效性检查:数据库管理系统(DBMS)首先检查所查询的表或视图是否存在。
  • 视图消解:DBMS 从数据字典中获取视图定义,并将视图定义中的子查询与用户查询结合转换为针对基本表的查询。

例如,上述视图查询实际转换为针对基本表的查询:

SELECT Sno Sage FROM S WHERE Sclass ='CS0701' AND Sage < 20;

查询转换的注意事项

在大多数情况下,视图查询可以直接转换。但在某些情况下,直接转换可能不可行或会导致问题。

  • 带集函数的视图查询:例如,查询平均成绩在 90 分以上的学生学号和平均成绩:
SELECT *
FROM S_G
WHERE Gavg >= 90;

将上面查询语句与子查询结合,形成下列查询语句。

SELECT Sno,AVG( Grade)
FROM SC
WHERE AVG(Grade)> = 90
GROUP BY Sno;

前面讲过分组后 WHERE 子句中不能用集函数作为条件表达式,因此执行此修正后的查询将会出现语法错误。正确的查询语句应该是:

SELECT Sno,AVG(Grade)
FROM SC
GROUP BY Sno
HAVING AVG( Grade)> = 90;

视图查询的限制

  • 行列子集视图:大多数数据库系统能够正确转换行列子集视图的查询。
  • 非行列子集视图:对于非行列子集的视图,转换可能不总是可行。在这种情况下,建议直接对基本表进行查询。

三.更新视图

由于视图不实际存储数据,对视图的更新实际上是对其基本表数据的更新。使用 WITH CHECK OPTION 可以确保视图更新操作符合视图定义的约束。

1.插入视图数据

向视图中插入数据会转换为向基本表中插入数据。例如,向计科 0701 班学生视图 CS_S 中插入一个新的学生记录:

INSERT INTO CS_S
VALUES('2007111003','王欢', 20);

此操作转换为对基本表的插入:

INSERT INTO S(Sno, Sname, Sage, Sclass)
VALUES('2007111003', '王欢', 20, 'CS0701');

系统会自动处理与视图定义相关的其他属性(如在这里自动添加班级名称 ‘CS0701’)。

2.删除视图数据

从视图中删除数据转换为从基本表中删除相应的数据。例如,删除计科 0701 班学生视图 CS_S 中学号为 2007111003 的记录:

DELETE FROM CS_S
WHERE Sno = '2007111003';

转换为对基本表的删除操作:

DELETE FROM S
WHERE Sno = '2007111003' AND Sclass = 'CS0701';

3.修改视图数据

修改视图数据转换为对基本表的更新。例如,将计科 0701 班学生视图 CS_S 中学号为 2007111001 的学生的姓名改为“张强”:

UPDATE CS_S
SET Sname = '张强'
WHERE Sno = '2007111001';

转换为对基本表的更新:

UPDATE S
SET Sname = '张强'
WHERE Sno = '2007111001' AND Sclass = 'CS0701';

可更新性的限制

不是所有视图都可更新。特别是那些包含集函数、分组或从多个基本表派生的视图,其更新可能不会有唯一明确的基本表更新对应。如视图 S_G,其包含了平均成绩,这是一个通过分组和聚合计算得出的结果,无法直接映射到基本表的特定记录上进行更新。

UPDATE S_G
SET Gavg = 90
WHERE Sno='2007111001'; /*这是不行的*/

因此,对于非行列子集视图的更新,需要考虑其可更新性以及如何有效地映射到基本表的更新操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Next.js 第一次接触

因为需要整个漂亮的在线文档&#xff0c;所以接触了next.js&#xff0c;因为对前端js本身不够熟悉&#xff0c;别说对react.js 又不会&#xff0c;时间又不允许深入研究&#xff0c;所以&#xff0c;为了加一个导航菜单&#xff0c;极其痛苦。 有点小bug&#xff0c;不过不影响…

学习笔记:C++之 switch语句

Switch语句 作用&#xff1a;执行多条件分支语句 语法&#xff1a; switch&#xff08;表达式&#xff09;{ case 结果1&#xff1a;执行语句&#xff1b;break&#xff1b; case 结果2&#xff1a;执行语句&#xff1b;break&#xff1b; ... default&#xff1a;执行语句&a…

Golang leetcode142 环形链表 暴力map 快慢指针法

文章目录 环形链表 leetcode142暴力遍历 map哈希记录快慢指针法 环形链表 leetcode142 该题目要求找到入环的第一个节点 我们可以通过map进行记录&#xff0c;没到新的节点查询是否经过原有节点 入环节点&#xff0c;上两个节点的next相同 若有入环节点&#xff0c;则一定能检…

如何用python实现一个简单的单向链表?

实现一个简单的单向链表涉及两个基本的构建块&#xff1a;节点&#xff08;Node&#xff09;和链表&#xff08;LinkedList&#xff09;。下面是详细步骤和解释&#xff1a; 1. 实现节点&#xff08;Node&#xff09; 链表中的每个节点通常包含两部分&#xff1a;存储的数据&…

Flutter 图片和资源的高效使用指南

文章目录 指定资源什么是 [pubspec.yaml](https://dart.cn/tools/pub/pubspec) 文件 图片图片常用的配置属性加载本地图片通过 pubspec.yml 文件进行配置图片目录使用 Image.asset 小部件加载本地图片 加载网络图片通过 Image.network小部件加载网络图片&#xff1a;使用Image.…

LeCode:(606. 根据二叉树创建字符串)

题目链接 本体的难点&#xff1a; 什么时候去打印左右括号&#xff1f;什么时候省略&#xff1f; 解题过程&#xff1a;通过观察看到&#xff0c;每次遍历结点之前&#xff0c;打印了一个左括号&#xff1b;遍历到叶子&#xff0c;叶子的左右也要打印出括号来&#xff08;先…

linux虚拟机环境快速搭建redis5.x版本的主从集群总结

原创/朱季谦 我在阿里云服务器上曾参与过公司redis集群的搭建&#xff0c;但时间久了&#xff0c;都快忘记当时的搭建过程了&#xff0c;故而决定在虚拟机centOS 7的环境&#xff0c;自行搭建一套redis5.x版本的集群&#xff0c;该版本集群的搭建比较方便&#xff0c;不用再像…

实现电子邮件自动化的实用技巧与指南

如何实现电子邮件自动化&#xff1f;一般可以通过规则和过滤器、自动回复、定时发送、快捷键和模板、团队邮箱等方法来实现。 一、什么是电子邮件自动化 电子邮件自动化是一种根据特定条件在适当时机发送正确信息的过程。这些条件可以是时间表、触发器或在您的电子邮件自动化工…

AVL树介绍以及代码实现

二叉搜索树的查找和删除虽然最优情况下能够做到 O(logN) 的级别&#xff0c;但是在一些特殊情况下&#xff0c;它的查找速度只能到达 O(N)级别&#xff0c;比如数据按顺序插入&#xff0c;那么就一定是一棵单边树。 为了针对这种情况&#xff0c;俄罗斯的两位数学家&#xff1a…

android 倒计时控件

效果&#xff1a;&#xff08;可不设置 之前、之后文字&#xff09; /*** 倒计时秒数** desc : 时分秒倒计时view* * 布局里引用后&#xff0c;* private fun testMethod(){* binding.test.setCDownStarText("之前的文字")* binding.test.setCDo…

在数据库造数据发现的bug也是bug

上个月&#xff0c;我和开发小哥讨论过一个问题&#xff0c;开发小哥专门提醒我&#xff0c;页面上新增功能尽可能在前端造一些数据去测试&#xff0c;如果直接从数据库里插入的数据&#xff0c;定位问题还是有些说不清楚。 讨论的过程和细节就是以下的对话内容&#xff1a; …

【Sublime Text】| 02——常用插件安装及配置

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 1. 汉化2. 更换颜色主题3. 更改编码插件—ConvertToUTF84. 对齐插件—Alignment5. 括号高亮插件—BracketHighligh…

网络嗅探器的设计与实现(2024)-转载

1.题目描述 参照 raw socket 编程例子&#xff0c;设计一个可以监视网络的状态、数据流动情况以及网络上传输 的信息的网络嗅探器。 2.运行结果 3.导入程序需要的库 请参考下面链接: 导入WinPcap到Clion (2024)-CSDN博客 4.参考代码 #define HAVE_REMOTE #define LINE_LEN …

XSKY SDS 产品率先获得 OceanBase V4 新版本认证

近日&#xff0c;北京奥星贝斯科技有限公司&#xff08;简称&#xff1a;OceanBase&#xff09;与北京星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY 星辰天合&#xff09;顺利完成产品兼容性认证。 XSKY 的高性能全闪存储以及混闪存储&#xff0c;与 OceanBase V…

ELement UI时间控件el-date-picker误差8小时解决办法

一、问题描述&#xff1a; 在项目中引用了elementui中的date-picker组件&#xff0c;选中的时间跟实际相差八小时&#xff0c;且格式不是自己想要的格式 <el-date-pickertype"date"placeholder"选择日期"format"yyyy/M/d"v-model"form…

Java面试之集合篇

前言 本篇主要总结JAVA面试中关于集合相关的高频面试题。本篇的面试题基于网络整理以及自己的总结编辑。在不断的完善补充哦。欢迎小伙伴们在评论区发表留言哦&#xff01; 1、基础 1.1、Java 集合框架有哪些&#xff1f; Java 集合框架&#xff0c;大家可以看看 《Java 集…

报错处理:java.io.IOException: Could not find resource mybatis-config.xml

运行mybatis文件时出现了以下的情况 java.io.IOException: Could not find resource mybatis-config.xmlat org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:114)at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:100)at org.apach…

对html骨架的详细解释

html的骨架结构 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head…

BRF文件数据结构

一.BRF-文件头数据结构 type_mesh "mesh" 网格 type_material "material" 材质struct brf_header{int type_length; //4个字节, type字符串对应长度char* type_name; //根据type_length获取int type_content_num; //4个字节,对应类型所含个数,例如含有模…

1982-2022年GIMMS 标准化差异植被指数

GIMMS 标准化差异植被指数 1982-2022 PKU GIMMS 归一化植被指数数据集&#xff08;PKU GIMMS NDVI&#xff0c;版本 1.2&#xff09;提供了从 1982 年到 2022 年以半个月为间隔、分辨率为 1/12 的一致的全球 NDVI 数据。其主要目标是解决现有领域中普遍存在的关键不确定性。全…