MySQL进阶 -- 视图

2023-11-12

一、介绍

  • 视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。
  • 数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中。
  • 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

二、语法

  • 创建
create [or replace] [algorithm = {undefined | merge | temptable}] view 视图名称[(column_list)] as select_statement [with [cascaded | local] check option]
   
--参数说明:

--(1)algorithm:可选项,表示视图选择的算法。

--(2)view_name :表示要创建的视图名称。

--(3)column_list:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同。

--(4)select_statement:表示一个完整的查询语句,将查询记录导入视图中。

--(5)[with [cascaded | local] check option]:可选项,表示更新视图时要保证在该视图的权限范围之内。
  • 查询
--查看创建视图语句:
SHOW CREATE VIEW 视图名称; 
--查看视图数据:
SELECT * FROM 视图名称 ...... ;
  • 修改
--方式一:
CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] 
--方式二:
ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ] 
  • 删除
DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...
  • 插入/更新数据示例
--创建视图成功
create or replace view stu_v_1 as select id,name from student where id <= 10 ; 
--查询视图
select * from stu_v_1; 
--插入id=6的数据,插入成功,查询成功
insert into stu_v_1 values(6,'Tom'); 
--插入id=17的数据,插入成功,查询失败
insert into stu_v_1 values(17,'Tom22');

我们在创建视图的时候,指定的条件为 id<=10, id为17的数据,是不符合条件的,所以没有查询出来,但是这条数据确实是已经成功的插入到了基表中。 如果我们定义视图时,如果指定了条件,然后我们在插入、修改、删除数据时,是否可以做到必须满足条件才能操作,否则不能够操作呢? 答案是可以的,这就需要借助于视图的检查选项了。

三、检查选项

当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如插入,更新,删除,以使其符合视图的定义。 MySQL允许基于另一个视图创建视图,它还会检查依赖视 图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADEDLOCAL ,默认值为 CASCADED 。

CASCADED(级联)

比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图 创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。![[Pasted image 20220311144911.png]]

LOCAL(本地)

比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创 建时未指定检查选项。 则在执行检查时,只会检查v2,不会检查v2的关联视图v1。![[Pasted image 20220311152839.png]]

四、视图更新

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一 项,则该视图不可更新:
A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)
B. DISTINCT
C. GROUP BY
D. HAVING
E. UNION 或者 UNION ALL

五、视图作用

  • 简单:视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视 图,从而使得用户不必为以后的操作每次指定全部的条件。
  • 安全:数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。
  • 数据独立:视图可帮助用户屏蔽真实表结构变化带来的影响。

六、案例

  • 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽 手机号和邮箱两个字段。
create view tb_user_view as select id,name,profession,age,gender,status,createtime from tb_user; 

select * from tb_user_view;
  • 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。
create view tb_stu_course_view as select s.name student_name , s.no student_no , c.name course_name from student s, student_course sc , course c where s.id = sc.studentid and sc.courseid = c.id; 

select * from tb_stu_course_view;

本文笔记参考黑马MySQL教程,相关连接:https://www.bilibili.com/video/BV1Kr4y1i7ru?p=102&spm_id_from=333.1007.top_right_bar_window_history.content.click

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL进阶 -- 视图 的相关文章

  • 哈希密码字段使用什么数据类型以及长度?

    我不确定密码哈希是如何工作的 稍后将实现 但现在需要创建数据库模式 我正在考虑将密码限制为 4 20 个字符 但据我了解 加密后哈希字符串的长度将有所不同 那么 如何将这些密码存储在数据库中呢 更新 仅使用哈希函数不足以存储密码 你应该阅读
  • MySQL LAST_INSERT_ID() 和 FOUND_ROWS()

    当 PHP 脚本每秒有数百个查询时会发生什么 它会影响这些函数吗 是否保证它们会返回当前脚本中最后一个插入语句中最后插入的 id 它会返回当前脚本中最后一次选择的行数吗 如果同时从另一个脚本进行新的插入或选择 在 FOUND ROWS 的情
  • 将 Python 列表(JSON 或其他)插入 MySQL 数据库

    所以我在Python中有一堆数组数据 嗯 相反 我有一个清单 我试图将此数组存储到 MySQL 数据库中的单个单元格中 我尝试使用 JSON 来序列化我的数据 但也许我不明白 JSON 是如何工作的 因此 在连接到我的数据库后 我尝试了上游
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • 软删除最佳实践(PHP/MySQL)

    Problem 在处理产品和订单的 Web 应用程序中 我想维护前员工 用户 与他们处理的订单之间的信息和关系 我想维护过时产品和包含这些产品的订单之间的信息和关系 然而 我希望员工能够整理管理界面 例如删除前员工 过时的产品 过时的产品组
  • 将我的 Laravel 连接到外部数据库

    如何将 Laravel 连接到外部数据库 示例 我的本地计算机上有一个 Laravel 它在 xampp 上运行 我希望它连接到云服务器数据库 打开 env文件并编辑它 只需设置正确的外部数据库凭据 DB CONNECTION mysql
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • Yii2:无法将列值更新+1

    创建新记录时 我需要将列值更新 1 public function actionCreate model new CreateBookings if model gt load Yii app gt request gt post Yii
  • 无法将句子插入数据库

    我有一些句子 我必须选择由 6 个以上单词组成的句子 然后它们将被插入到数据库中
  • 从两个表中搜索然后删除

    我有两个包含成员数据的表 与 member id 列链接 我需要搜索所有记录email列以 pl 结尾 然后 我需要为此删除两个表中的所有记录 基于 member id 是否可以通过一条 SQL 语句完成此操作 SELECT member
  • 在 Django 中保存模型会出现“警告:字段‘id’没有默认值”

    我在 Django 中有一个非常基本的模型 class Case models Model name models CharField max length 255 created at models DateTimeField defau
  • 表头在 php 中的 for 循环中重复

    我正在尝试从数据库创建排行榜 我将数据打印在列表中 当我尝试将此数据放入 html 表中时 标题在每次数据输入后都会重复 这是 for 循环导致的 但我不知道如何只打印一次标题 然后将数据插入到每一行中 任何帮助将不胜感激 代码和结果的屏幕
  • SQL 查询按字母顺序对除一个之外的所有结果进行排序?

    我有一个小问题 我正在使用 SQL 数据库的结果填充选择标记 我想要的是最后一个添加为顶部条目 其余条目按字母顺序排序 所以它会返回 developerID developerName 40 ZZZ Dev 39 A Dev 38 Be N
  • MySQL如何根据字段是否存在来插入新记录或更新字段?

    我正在尝试实现一个评级系统 在数据库表中保留以下两个字段 评级 当前评级 num rates 迄今为止提交的评分数量 UPDATE mytable SET rating rating num rates theRating num rate
  • 使用 PHP 和 MySQL 的服务器端事件

    我正在使用 PHP 和 MySQL 构建一个 非常基本的 应用程序 该应用程序的目的是在网页上显示 实时 数据交易 这些交易来自于transactionsMySQL 数据库中的表 到目前为止 我可以在网页上检索并显示数据 不过我期待看到数据
  • 在 OS X 10.7 中找不到 Mysql 命令

    我无法让我的 mysql 在 os x 10 7 上启动 它位于 usr local mysql bin mysql 当我输入时 我得到命令未找到mysql version在终端中 我试过这个无法从 mac 命令行访问 mysql http
  • 根据 MySQL 列内容的长度创建索引?

    如何根据值的长度在 MySQL v 5 0 myisam 数据库引擎 中的列上创建索引 它是文本数据类型 最多 7000 个字符 我是否必须添加具有第一列长度的另一列 是的 因为 MySQL 不支持基于函数的索引 例如ADD INDEX m
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test
  • 不唯一的表/别名

    因此 我尝试使用多个联接来运行此查询 以获得我想要的精确行 但我不断收到此错误 不唯一的表 别名 ss prices 我正在运行的查询 select ss accounts id ss accounts bot acc id ss acco
  • 为什么 sql 字段名称中不应该包含逗号?

    人们一直告诉我列名中不应包含空格 我只是想知道 这是为什么 这是我为学校创建的一些数据库表遇到的问题 字段名称包括 Preble 和 Darke 相反 它们需要是 普雷布尔县 俄亥俄州 和 达克县 俄亥俄州 如果它们是行名称 我只需创建一个

随机推荐

  • 关于oss使用sts 后台签发临时token前端直传大文件的错误记录

    文章目录 前言 遇到的问题 1 NoSuchBucket The specified bucket does not exist 2 com aliyuncs exceptions ClientException InvalidParame
  • tp5的分页方法 paginate

    tp5的分页方法paginate 一共有三个参数 其中 listRows可以为整型或者数组 当是数组的时候 你传入的 config就会失效 原因是 paginate的源代码 所以说 如果你想重新配置参数 那 listRows就传数组 否则的
  • 【ffmpeg基础】视频滤波处理

    ffmpeg版本 ffmpeg version 5 1 2 Copyright c 2000 2022 the FFmpeg developers 一 视频缩放滤波器 视频的滤波器通常使用 vf video filters 来设置滤波器 也
  • GDI 绘图

    目录 GDI 绘图 画点 画线 画封闭图形 画笔 画刷 其他 DC Device Context 绘图设备 HDC 绘图设备句柄 GDI Microsoft Graphics Device Interface Win32提供的绘图API G
  • python变量与作用域

    变量从作用域分类 作用范围从小到大为 小作用域的可以调用大作用域的内容 局部 Local 闭包 Enclosing 全局 Global 内建 Build in 局部变量 局部变量是定义在函数中的 因此其作用域是在函数内部 def examp
  • Opencv2.4.2+vs2008+windowsXP(32位)安装过程

    Opencv2 4 2 vs2008 windowsXP 32位 安装过程 准备软件 opencv2 4 2 VS2008软件 1 解压opencv2 4 2到指定路径 例如 D Program Files OpenCV2 4 2 2 打开
  • Https + OPENSSL

    二 HTTPS 2 1 HTTPS介绍 先来看HTTPS的概念 我们一般的http走的是80端口 而https走的是443端口 有什么不一样的地方吗 很简单 我们拿个telnet命令来作个实验 telnet127 0 0 1 80 直接就登
  • Vue.js(四)

    Vue js 模板语法 Vue js 使用了基于 HTML 的模版语法 允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据 Vue js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统 结合响应系统 在
  • two.js插件的简单用法

    div div
  • linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

    PATH和LD LIBRARY PATH本质都是变量 所谓变量的意思就是由别人赋值产生的 直觉往往会让我们添加和减少这个变量本身的某些路径 实际上这是不正确的 正确的做法是我们要去修改赋予这个变量数值的那些配置文件 加一条路径或者减一条 说
  • pageoffice 骑缝章_PageOffice 页面中打开office编辑文档

    pom xml com zhuozhengsoft pageoffice 4 5 0 6 web xml poserver com zhuozhengsoft pageoffice poserver Server poserver pose
  • FDFS_Ubuntu部署fdfs测试上传文件不成功

    开启服务 sudo service fdfs trackerd start sudo service fdfs storaged start 查看服务是否开启 ps aux grep fdfs 执行完上述的操作之后 在ps 命令中完美显示开
  • 字符串相关,可变长字符串,异常

    字符串相关 String 字符串常量 本质char String str1 abc String str2 abc System out prrintln str1 str2 同时也会带来这样的问题 String a a a a b ab
  • Vue axios的使用

  • cmake知识点总结

    CMake的所有的语句都写在一个叫 CMakeLists txt 的文件中 当 CMakeLists txt 文件确定后 可以用 ccmake 命令对相关的变量值进行配置 这个命令必须指向 CMakeLists txt 所在的目录 配置完成
  • 操作系统_第四章_存储管理之 页式存储管理

    思考一个问题 是否有可能把相对地址连续的作业信息分散存放到几个不连续的主存区域中 且仍然能保证作业正确执行 若可行的话 既可充分利用主存空间又可减少移动所花费的开销 页式存储管理就是这样的管理方式 一 页式存储管理的基本原理 定义 页式存储
  • Vue3打包后无法运行

    描述 使用Vue3打包项目后 使用Live Server打开无法运行 放到服务器上也是一样 如图所示错误 分析 错误提示为js文件未找到 所以可能是路径的问题 关于Vue公共基础路径问题 https cn vitejs dev guide
  • android开发笔记(1-5)(易错点以及技术难点攻克)

    1 scrollview中嵌套有listview或者gridview 从其他页面返回到这个页面 焦点总是跑到listview或者gridview上 解决办法 重写scrollview的下边方法 Override protected int
  • 使用cloudflare搭建个人博客网站实践

    使用cloudflare搭建个人博客网站 首先配置好基本的环境 建议使用LNMP工具建立基本的环境 按照上面的教程可以基本完成采用http网站的初步建立 但是对于https的支持上面说的并不好 因此需要进一步的改进 要自己配置https其实
  • MySQL进阶 -- 视图

    MySQL进阶 视图 一 介绍 二 语法 三 检查选项 CASCADED 级联 LOCAL 本地 四 视图更新 五 视图作用 六 案例 一 介绍 视图 view 是一个虚拟表 非真实存在 其本质是根据SQL语句获取动态的数据集 并为其命名