第4章_2——视图的使用-程序员宅基地

技术标签: MySQL学习笔记  mysql  数据库  sql  

创建与使用视图

一、视图的概念及优点

1.1、概念

  视图是一种常用的数据库对象,可以把它看做一个或几个源表导出的虚表存储在数据库中的查询,对于视图所引用的源表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。视图与数据表不同,数据库中只存放了视图的定义,即SQL语句,而不存放视图对应的数据,数据存放在源表中,当源表中的数据发送变化时,从视图中查询出的数据也会随之改变。对视图进行操作时,系统根据视图的定义去操作与视图相关联的数据表

  视图一经定义后,就可以像源表一样被查询和删除。视图为查看和存取数据提供了另外一种途径,对于查询完成的大多数操作,使用视图一样也可以完成;使用视图还可以简化数据操作;当通过视图修改数据时,相应的源表的数据也会发生变化;同时,若源表的数据发生变化,则这种变化也可以自动地同步反映到视图中。

1.2、优点(了解)

(1)简化操作

  视图大大简化了用户对数据的操作,如果一个查询非常复杂,跨越多个数据表,那么通过将这个复杂查询定义为视图,这样在每一次执行相同的查询时,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间复杂的连接操作。

(2)提供数据安全性

  视图创建了一种可以控制的环境,为不同的用户定义不同的视图,使每个用户只能看到其有权看到的部分数据。那么没有必要的、敏感的或不适合的数据都从视图中排除了,用户只能查询和修改视图中显示的数据。

(3)屏蔽数据库的复杂性

  用户不必了解数据库中复杂的表结构,视图将数据库设计的复杂性和用户的使用方式屏蔽了。数据库管理员可以在视图中将那些难以理解的列替换成数据库用户容易理解和接受的名称,从而为用户使用提供了极大便利,并且数据库中表的更改也不会影响用户对数据库的使用。

(4)数据即时更新

  当视图所基于的数据表发生变化时,视图能够即时更新,提供了与数据表一致的数据。

(5)便于数据共享

  各用户不必都定义和存储自己所需的数据,可共享数据库的数据。即同样的数据只需存储一次。

二、创建与使用视图

  视图在数据库中是作为一个对象来存储的。用户创建视图前,要保证自己已被数据库所有者授权可以使用Create View语句,并且有权操作视图所涉及的数据表或其他视图。

2.1、创建视图的语法格式

创建视图可以使用Create View语句,该语句完整的语法格式如下:

Create
	[Or Replace]
	[<算法选项>]
	[<视图定义者>]
	[<安全性选项>]
View <视图名> [<字段名称列表>]
As <Select语句>
	[检查选项]

各个选项说明如下:(了解)
  
  ① 创建视图语句的关键字包括Create、View、As。
  
  ② 可选项“Or Replace”表示如果存在已有的同名视图,则覆盖同名视图。
  
  ③ 可选项“算法选项”的语法格式为Algorithm = { Undefined | Merge | Temptable }。该选项指定视图的处理方式算法选项Algorithm有3个可选值——Undefined、Merge、Temptable。其中,Undefined表示自动选择算法,一般会首选Merge,因为Merge更有效率,而且Temptable也不支持更新操作;Merge表示将视图的定义和查询视图的语句合并处理,使得视图定义的某一部分取代语句的对应部分,Merge算法要求视图中的行和源表中的行具有一对一的关系,如果不具有该关系,必须使用临时表取而代之;Temptable表示将视图查询的结果保存到临时表中,而后在该临时表的基础上执行查询视图的语句。如果没有Algorithm子句,则默认算法为Undefined。
  
  ④ 可选项“视图定义者”的语法格式为Definer = { User | Current_User },如果没有Definer 子句,视图的默认定义者为Current_User ,即为当前用户。当然,创建视图时也可以指定不同的用户作为创建者(或者称视图所有人)。
  
  ⑤ 可选项“安全性选项”的语法格式为 Sql Security { Definder | Invoker }。该选项指定视图查询数据时的安全验证方式。其中,Definder表示在创建视图时验证是否有权限访问视图所引用的数据,只要创建视图的用户有权限,那么创建就可以成功,而且所有有权限查询该视图的用户也能够成功执行查询语句,而不管是否拥有该视图所引用的对象,当然,创建时也会判断,如果创建的用户没有视图所引用表对象的访问权限,则创建会失败。
  
  ⑥ 视图名必须唯一,不能出现重名的视图。视图的命名必须遵循MySQL中标识符的命名规则,不能与数据库同名,且每个用户视图名必须是唯一的,即对不同用户,即使是定义相同的视图,也必须使用不同的名称。默认情况下,应在当前数据库中创建视图,如果想要给定数据库中明确创建视图,则创建时,应将视图名称指定为<数据库名>.<视图名>
  
  ⑦ 可选项“字段名称列表”可以为视图的字段定义明确的名称,多个名称间由半角逗号“,”分隔,这里所列的字段名数目必须与后面的Select语句中检索的字段数相等。如果使用与源表或视图中相同的字段名,则可以省略该选项。
  
  ⑧ 用于创建视图的Select语句为必选项,可以在Select语句中查询多个数据表或视图。
  
  ⑨ 可选项“检查选项”的语法格式为[With [Cascaded | Local ] Check Option。该选项指出在可更新视图上所进行的修改都要符合Select语句所指定的限制条件,这样可以确保数据修改后,仍可通过视图查看修改的数据。当视图是根据另一个视图定义时,参数Cascaded表示更新视图时想要满足所有相关视图和数据表的条件,参数Local表示更新视图时满足该视图本身定义的条件即可。如果没有指定任一关键字,则默认值为Cascaded。

  创建视图是很简单的,这就跟创建表是相似的。创建视图是有两种方法的:一种是使用上面的语句来创建;另一种则是使用试图创建工具来创建试图,这种方法是取巧的方法(建议是在将使用代码来创建的方法先熟练了,再去使用它)。

-- 通过“图书信息2”表创建视图
CREATE OR REPLACE
VIEW view_图书信息
AS
SELECT ISBN编号,图书名称,出版社ID,图书类型
FROM `图书信息2`
WHERE 价格 >= 30;

-- 查看修改后的视图
SELECT *
FROM view_图书信息;

在这里插入图片描述

2.2、创建视图的注意事项

创建视图的注意事项如下:

  1. 定义视图的用户必须对所参照的源表或视图又查询(即可执行Select语句)的权限,运行创建视图的语句需要用户具有创建视图(Create View)的权限,当加了“Or Replace”选项时,还需要用户具有删除视图(Drop View)的权限;
  2. Select语句不能包含From子句中的子查询;
  3. Select语句不能引用系统或用户变量;
  4. Select语句不能引用预处理语句参数;
  5. 在存储子程序内,定义不能引用子程序参数或局部变量;
  6. 在定义中引用的表或视图必须存在。但是,创建了MySQL视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用Check Table语句;
  7. 在定义中不能引用Temporary表,不能创建Temporary视图;
  8. 在视图定义中命名的表必须已存在,当引用不是当前数据库的表或视图时,要在数据表或视图前加上数据库的名称;
  9. 不能将默认值或触发器与视图关联在一起;
  10. 在视图定义中允许使用Order By,但是,如果从特定视图进行了选择,而该视图使用了具有自己的Order By的语句,则它将被忽略;
  11. 不能在视图上创建任何索引,包括全文索引。

2.3、修改视图

当视图不符合使用需求时,可以使用Alter View语句对其进行修改,视图的修改与创建相似,其语法格式如下:

Alter
	[<算法选项>]
	[<视图定义者>]
	[<安全性选项>]
View <视图名> [<视图的字段名称列表>]
As <Select语句>
	[检查选项]

Alter View语句的语法与Create View语句是类似,所以可以将两者放在一起进行记忆和理解。

-- 对视图view_图书信息进行修改,将价格修改为大于等于20的
ALTER
	ALGORITHM = UNDEFINED
	DEFINER = root@localhost
	SQL SECURITY DEFINER
VIEW `view_图书信息` AS
	SELECT
			ISBN编号,图书名称,作者,价格,出版社ID,出版日期
	FROM `图书信息2`
	WHERE 价格 >= 20;

-- 查看修改后的视图
SELECT *
FROM `view_图书信息`;

在这里插入图片描述

2.4、使用视图查询与更新数据表中的数据

  更新视图是指通过视图来插入、更新和删除数据表中的数据。因为视图是一个虚拟表,所以其中是没有数据的。通过视图更新时,都是转换到源表中来更新的。更新视图时,只能更新权限范围内的可以更新的数据,超出权限范围时无法更新。

(1)查询视图数据

  对视图进行查询,这个是非常简单了(和使用SQL语句去查询数据表一样的语法)。虽然视图是虚拟表,但它依旧是一张表,可通过Select语句进行查询数据。

(2)向视图插入数据
-- 向视图“view_出版社”插入数据
INSERT INTO `view_出版社`
VALUES('10','上海交通大学出版社','上海交大','上海市1038号','102091'),
('11','西安电子科技大学出版社','西安电子','西安市2000号','110077');

在这里插入图片描述

对视图进行插入数据的方式是和对源表的插入数据是一样的。

(3)对视图进行修改数据
-- 修改视图view_出版社
Update view_出版社 Set 出版社地址 = '上海市960号', 邮政编码 = 100132
Where 出版社ID = 5;

如果一个视图依赖于多个源表,则一次修改该视图只能变动一个源表的数据。

(4)删除视图中的数据
-- 删除视图中出版社ID为10,11的数据
DELETE
FROM `view_出版社`
WHERE 出版社ID in ('10','11');

对于依赖于多个源表的视图,不能使用Delete语句删除多个源表中的数据。

2.5、删除视图

  删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除源表中的数据。在MySQL中,使用“Drop View”语句来删除视图时,用户必须拥有Drop权限。

删除视图的语法格式如下:

Drop View [if exists] <视图名列表> [Restrict | Cascade];

使用“Drop View”语句一次可以生删除多个视图,各个视图名使用半角逗号“,”分隔。如果使用“if exists”选项,当视图不存在时,不会出现错误提示信息。

-- 例如:删除视图view_图书信息
Drop View view_图书信息;
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49794837/article/details/126035409

智能推荐

zabbix短信告警oracle,zabbix 实现短信告警-程序员宅基地

文章浏览阅读402次。之前一直调用飞信接口发送告警信息,最近购买了第三方短信接口。所以准备使用接口发送告警。短信接口是基于https的摘要认证。https认证还是自己做的,调用接口的时候还需要load证书。感觉超级难用,不管那么多,先让它跑起来再说。废话不多说,先上代码。#!/usr/bin/envpython#coding:utf-8importrequestsfromrequests.authimport..._zabbix实现短信告警

soapui中文操作手册(四)----MOCK服务_soapui设置成中文-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏12次。转载地址:http://www.cnblogs.com/zerotest/p/4670005.htmlWeb Service Mocking是武器库一个非常有用的工具。这是解决“如果没有Web服务如何创建针对性的Web服务测试”问题的办法。Web Service Mocking将在这里派上用场。它允许你实际的Web服务产生之前,创建近似或模拟的Web Service。在本教_soapui设置成中文

Swift 包管理器 (SPM):管理 iOS 中的依赖关系_ios spm-程序员宅基地

文章浏览阅读845次,点赞29次,收藏7次。Swift 包管理器 (SPM):管理 iOS 中的依赖关系_ios spm

SCI论文润色真有必要吗?-程序员宅基地

文章浏览阅读381次,点赞10次,收藏7次。总的来说,sci论文润色虽然不会改变论文的学术内容和贡献,但它能够显著的提升论文的质量和可读性,从而增加论文被接受和引用的机会。在论文投稿前都是需要润色的,特别是英文论文投稿,一定得靠谱。但如果是一些小问题,比如语法语句错误,专业言论不恰当,那么你的文章会在投稿过程中外审评定完以后,也会给你返修意见和修改机会。如果是新作者,或者是对自己的语言能力不那么自信,那么是很有必要的。其他人的视角可能会发现你忽略的错误或不清晰的表达,同时也可以提供有关论文结构和逻辑的反馈意见。关于SCI论文润色的常见方法。

Prometheus监控数据格式的学习-程序员宅基地

文章浏览阅读1.1k次,点赞33次,收藏9次。Prometheus 指标(metrics)的数据形式是一种简单的文本格式(容易通过 HTTP 协议被 Prometheus 服务器拉取)。每一行包含了一个指标的数据,通常包括指标名称、可选的一组标签以及指标的值。Prometheus 的指标数据可以有不同类型,如 Counter、Gauge、Histogram 和 Summary,它们的表示形式会有所不同。

数字图像处理(10): OpenCV 图像阈值化处理_binarization threshold-程序员宅基地

文章浏览阅读5.6k次,点赞26次,收藏43次。目录1 什么是阈值化-threshold()2 二进制阈值化3 反二进制阈值化4 截断阈值化5 反阈值化为06 阈值化为07 小结参考资料1 什么是阈值化-threshold()图像的二值化或阈值化 (Binarization)旨在提取图像中的目标物体,将背景以及噪声区分开来。通常会设定一个阈值,通过阈值将图像的像素划分为两类:大于阈值的..._binarization threshold

随便推点

使用安卓模拟器时提示关闭hyper-v_hyperv影响 模拟器-程序员宅基地

文章浏览阅读1.6w次。本电脑是宏碁传奇X,cpu是r7 5800u,显卡rtx3050;使用了雷电、mumu两款安卓模拟器,雷电启动报错g_bGuestPowerOff fastpipeapi.cpp:1161,使用了网上的所有方案都不行,包括开启VT(amd开启SVM),命令关闭hyper-v服务等;尝试mumu模拟器,安装时支持vt项检测不通过,后来发现mumu模拟器在amd的cpu上只支持32位版,换装32位版检测通过,但是只要打开模拟器就提示需要关闭hyper-v,我已经确认关闭后,启动依旧这样提示,查找了网上很_hyperv影响 模拟器

【大厂秘籍】系列 - Mysql索引详解-程序员宅基地

文章浏览阅读564次。MySQL官方对索引定义:是存储引擎用于快速查找记录的一种数据结构。需要额外开辟空间和数据维护工作。● 索引是物理数据页存储,在数据文件中(InnoDB,ibd文件),利用数据页(page)存储。● 索引可以加快检索速度,但是同时也会降低增删改操作速度,索引维护需要代价。

CSS实现当鼠标停留在一个元素上时,使得两个元素的样式发生改变_css鼠标悬浮修改其他元素样式-程序员宅基地

文章浏览阅读825次。使用兄弟选择器实现同时改变两个元素的样式_css鼠标悬浮修改其他元素样式

文献学习-40-基于可迁移性引导的多源模型自适应医学图像分割-程序员宅基地

文章浏览阅读4.8k次,点赞32次,收藏43次。香港中文大学袁奕萱教授团队提出了一种名为多源模型自适应 (MSMA) 的新型无监督域适应方法。MSMA 旨在仅利用预训练的源模型(而非源数据)将知识迁移到未标记的目标域,从而实现对目标域的有效分割。

(4)FPGA开发工具介绍(第1天)-程序员宅基地

文章浏览阅读8.8k次。(4)FPGA开发工具介绍(第1天)1 文章目录1)文章目录2)FPGA初级课程介绍3)FPGA初级课程架构4)FPGA开发工具介绍(第1天)5)技术交流6)参考资料2 FPGA初级课程介绍1)FPGA初级就业课程共100篇文章,目的是为了让想学FPGA的小伙伴快速入门。2)FPGA初级就业课程包括FPGA简介、Verilog HDL基本语法、Verilog HDL 入门实例、FPGA入门实例、Xilinx FPGA IP core设计、Xilinx FPGA原语与U_fpga开发工具

js中的定时器如何使用_js定时器用法-程序员宅基地

文章浏览阅读1.4k次。JS提供了一些原生方法来实现延时去执行某一段代码,下面来简单介绍一下setTiemout、setInterval、setImmediate、requestAnimationFrame。首先,我们先来了解一下什么是定时器:JS提供了一些原生方法来实现延时去执行某一段代码下面来简单介绍一下setTimeout() :在指定的毫秒数后调用函数或计算表达式。setTimeout(code,millisec,lang)参数 描述code 必需。要调用的函数后要执行的 JavaScript 代码串。_js定时器用法

推荐文章

热门文章

相关标签