当前位置: 首页 > article >正文

MySQL-视图(VIEW)

文章目录

    • 1. 什么是视图?
    • 2. 视图 VS 数据表
    • 3. 视图的优点
    • 4. 视图相关语法
      • 4.1 创建视图
      • 4.2 查看视图
      • 4.3 修改视图
      • 4.4 删除视图
      • 4.5 检查选项
    • 5. 案例
    • 6. 注意事项

1. 什么是视图?

  • MySQL 视图( View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变

2. 视图 VS 数据表

  • 视图并不同于数据表,它们的区别在于以下几点

    1. 视图不是数据库中真实的表,而是一张虚拟表,其结构和数据是建立在对数据中真实表的查询基础上的。
    2. 存储在数据库中的查询操作 SQL 语句定义了视图的内容,列数据和行数据来自于视图查询所引用的实际表,引用视图时动态生成这些数据。
    3. 视图没有实际的物理记录,不是以数据集的形式存储在数据库中的,它所对应的数据实际上是存储在视图所引用的真实表中的。
    4. 视图是数据的窗口,而表是内容。表是实际数据的存放单位,而视图只是以不同的显示方式展示数据,其数据来源还是实际表
    5. 视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些 SQL 语句的集合。从安全的角度来看,视图的数据安全性更高使用视图的用户不接触数据表,不知道表结构。
    6. 视图的建立和删除只影响视图本身,不影响对应的基本表

3. 视图的优点

  1. 定制用户数据,聚焦特定的数据

    • 在实际的应用过程中,不同的用户可能对不同的数据有不同的要求。例如,当数据库同时存在时,如学生基本信息表、课程表和教师信息表等多种表同时存在时,可以根据需求让不同的用户使用各自的数据。学生查看修改自己基本信息的视图,安排程人员查看修改课程表和教师信息的视图,教师查看学生信息和课程信息表的视图。
  2. 简化数据操作

    • 在使用查询时,很多时候要使用聚合函数,同时还要显示其他字段的信息, 可能还需要关联到其他表,语句可能会很长,如果这个动作频繁发生的话,可以创建视图来简化操作。
  3. 提高数据的安全性

    • 视图是虚拟的,物理上是不存在的。可以只授予用户视图的权限,而不具体指定使用表的权限,来保护基础数据的安
      全。
  4. 共享所需数据

    • 通过使用视图,每个用户不必都定义和存储自己所需的数据,可以共享数据库中的数据,同样的数据只需要存储一次。
  5. 更改数据格式

    • 通过使用视图,可以重新格式化检索出的数据,并组织输出到其他应用程序中。
  6. 重用 SQL 语句

    • 视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图。

4. 视图相关语法

4.1 创建视图

  • 创建视图的语法如下:

    CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [CASCADED | LOCAL ] CHECK OPTION ]
    
  • 默认情况下,创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图

    CREATE VIEW v_students_info (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
    AS SELECT id,name,dept_id,age,sex,height,login_date
    FROM tb_students_info;
    
  • 注意事项:

    1. WITH CHECK OPTION 的意思是,修改视图时,检查插入的数据是否符合 WHERE 设置的条件。
    2. SELECT 语句不能包含 FROM 子句中的子查询
    3. SELECT 语句不能引用系统或用户变量。
    4. 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他视图的相关权限。

4.2 查看视图

  • 查看视图的字段信息:

    DESC 视图名;
    
  • 查看视图的详细信息:

    SHOW CREATE VIEW 视图名;
    

4.3 修改视图

  • 可以使用 ALTER VIEW 语句来对已有的视图进行修改。语法格式如下:

    ALTER VIEW <视图名> AS <SELECT 语句>
    
  • 修改视图的内容:对视图的修改就是对基本表的修改,因此在修改时,要满足基本表的数据定义。某些视图是可更新的。也就是说,可以使用 UPDATE、 DELETE 或 INSERT 等语句更新基本表的内容。对于可更新的视图,视图中的行和基本表的行之间必须具有一对一的关系。有一些特定的其他结构,这些结构会使得视图不可更新。更具体地讲,如果视图包含以下结构中的任何一种,它就是不可更新的:

    1. 聚合函数 SUM()、 MIN()、 MAX()、 COUNT() 等。
    2. DISTINCT 关键字。
    3. GROUP BY 子句。
    4. HAVING 子句。
    5. UNION 或 UNION ALL 运算符。
    6. 位于选择列表中的子查询。
    7. FROM 子句中的不可更新视图或包含多个表。
    8. WHERE 子句中的子查询,引用 FROM 子句中的表。
    9. ALGORITHM 选项为 TEMPTABLE(使用临时表总会使视图成为不可更新的)的时候。

    用户可以通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟的表,没有数据。通过视图更新时转到基本表上进行更新,如果对视图增加或删除记录,实际上是对基本表增加或删除记录。

4.4 删除视图

  • 删除视图是指删除 MySQL 数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据

     DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...
    

4.5 检查选项

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

  • CASCADED(级联): 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。

  • LOCAL(本地): 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。 则在执行检查时,知会检查v2,不会检查v2的关联视图v1。

5. 案例

  1. 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段。

    create view tb_user_view as select id,name,profession,age,gender,status,createtime from tb_user;
    
  2. 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图。

    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;
    

6. 注意事项

  1. 视图可以嵌套,即从其他视图中检索数据的查询来创建视图。
  2. 视图不能索引,也不能有关联的触发器、默认值或规则。
  3. ORDER BY 子句可以用在视图中,但若该视图检索数据的 SELECT 语句中也含有 ORDER BY 子句,则该视图中的 ORDER BY 子句将被覆盖。

http://www.kler.cn/a/233859.html

相关文章:

  • 大数据开发面试宝典
  • Android中桌面小部件的开发流程及常见问题和解决方案
  • jmeter常用配置元件介绍总结之后置处理器
  • 读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录
  • 文献解读-DNAscope: High accuracy small variant calling using machine learning
  • ️️一篇快速上手 AJAX 异步前后端交互
  • 基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)
  • 【数据结构】双向链表(链表实现+测试+原码)
  • 练习:鼠标类设计之1_类内容解析
  • JVM-双亲委派机制
  • 一步步建立一个C#项目(连续读取S7-1200PLC数据)
  • 监控概述、安装zabbix、配置zabbixagent、添加被控端主机、常用监控指标、自定义监控项
  • 2024年华为OD机试真题-密码解密-Java-OD统一考试(C卷)
  • 精灵图,字体图标,CSS3三角
  • css2复合选择器
  • 云计算市场分析
  • 深入探索MySQL的虚拟列:发展、原理与应用
  • 吉他学习:右手拨弦方法,右手拨弦训练 左手按弦方法
  • VSCode:替换空行
  • 【计算机网络】协议层次及其服务模型
  • 结构体的大小以及内存对齐问题
  • 搭建yum仓库服务器
  • C++ dfs 的状态表示(五十一)【第十一篇】
  • vue学习——集成sass
  • Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(三)
  • ideal打包,如何访问项目根目录的libs中的jar包