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

【MYSQL】视图

【MYSQL】视图

  • 一、视图的概念
      • 1.1 视图的概念
      • 1.2 为什么要用视图
  • 二、创建视图
      • 2.1 创建单表查询视图
      • 2.2 创建多表联合视图
      • 2.3 基于视图创建视图
  • 三、查询视图
      • 3.1 查看数据库的表对象、视图对象
      • 3.2 查看视图的结构
      • 3.3 查看视图的详细定义信息
      • 3.4 展示视图的详细内容
  • 四、修改视图
      • 4.1 修改基表数据
      • 4. 2 修改视图数据
  • 五、删除视图
  • 六、视图的总结
      • 6.1 优点
      • 6.2 缺点

一、视图的概念

1.1 视图的概念

在MySQL中,视图(View)是一种虚拟表,其内容由SQL查询定义。视图并不实际存储数据,而是基于一个或多个基础表(或视图)的查询结果动态生成数据。视图可以看作是一个保存了特定查询的“窗口”,通过这个窗口可以查看或操作数据,而无需直接操作底层的物理表。

1.2 为什么要用视图

视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。比如,公司发工资,我们通过查询就只能看到自己的工资,不能看到全部人的工资。

视图的应用场景有很多,这里只是列举一个,最后,总结出视图的优点

二、创建视图

语法:

CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;

OR REPLACE(可选):如果视图已经存在,OR REPLACE选项会替换掉旧的视图定义。如果没有这个选项,尝试创建已存在的视图会报错。

事先创建好两个表student和student_score,方便接下来的演示。
student表:
在这里插入图片描述
student_score表:
在这里插入图片描述

2.1 创建单表查询视图

举例:

CREATE view student_name_sex 
as select name,sex from student;

结果:
在这里插入图片描述

2.2 创建多表联合视图

举例:
注意

create view student_name_course_score_sex as
 select name,sex,course,score from student s,
 student_score sc where s.name=sc.name;

在这里插入图片描述
当我们多表创建视图的时候会出现这个错误,这是因为两个表中包含相同的字段名,此时查询时未明确指定字段所属的表,就会导致该错误。
修改

create view student_name_course_score_sex as
select s.name,sex,course,score from student s,
student_score sc where s.name=sc.name;

在这里插入图片描述

2.3 基于视图创建视图

举例:

create view student_name_course_score as
SELECT name,course,score from 
student_name_course_score_sex;

结果:
在这里插入图片描述

三、查询视图

3.1 查看数据库的表对象、视图对象

SHOW TABLES;

3.2 查看视图的结构

DESC / DESCRIBE 视图名称;

3.3 查看视图的详细定义信息

SHOW CREATE VIEW 视图名称;

3.4 展示视图的详细内容

SELECT * FROM 视图名称;

四、修改视图

4.1 修改基表数据

在这里插入图片描述
这里我们看到视图显示的数据:张三的java成绩是99,我们将张三Java成绩改为9分,看下视图的成绩会不会发生变化。
在这里插入图片描述

修改基表数据会影响视图的数据!!!

4. 2 修改视图数据

这里我们已经将基表:张三的java成绩改为9分,接下来,我们将视图的张三Java成绩改为99,看能否对基表产生影响。
视图:
在这里插入图片描述
基表:
在这里插入图片描述

修改视图数据会对基表数据产生影响!!!

注意:

  • 修改真实表会影响视图,修改视图同样也会影响真实表

以下视图不可更新:

  • 创建视图时使⽤聚合函数的视图
  • 创建视图时使⽤ DISTINCT
  • 创建视图时使⽤ GROUP BY 以及 HAVING ⼦句
  • 创建视图时使⽤ UNION 或 UNION ALL
  • 查询列表中使⽤⼦查询
  • 在FROM⼦句中引⽤不可更新视图
    例子:
    在这里插入图片描述

值得注意的是:虽然可以更新视图数据,但总的来说,视图作为 虚拟表 ,主要用于 方便查询 ,不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的。

五、删除视图

语法:

DROP VIEW IF EXISTS 视图名称;

在这里插入图片描述

drop view student_name_course_score_2;

在这里插入图片描述

谨慎删除!!!

六、视图的总结

6.1 优点

  • 简化复杂查询

视图可以封装复杂的SQL查询逻辑,使得用户可以通过简单的SELECT语句访问数据,而无需每次都编写复杂的查询语句。
举例:通过视图可以隐藏多表连接、分组统计等复杂操作,使得查询更加直观。

  • 提高数据安全性

视图可以限制用户对某些数据的访问权限,用户只能通过视图访问数据,而无法直接访问底层表,从而实现数据的安全性和隔离。
举例:通过视图隐藏敏感字段(如薪资信息),只展示允许访问的数据。

  • 逻辑独立性

视图提供了一种逻辑上的抽象,使得应用程序与底层数据表的结构解耦。即使底层表的结构发生变化(如字段名更改、表结构调整等),只要视图的定义仍然有效,应用程序代码无需修改。
举例:如果底层表的字段名被修改,只需调整视图的定义,而无需修改所有依赖该表的应用程序代码。

  • 重用SQL逻辑

视图可以将常用的查询逻辑保存起来,避免重复编写相同的SQL语句,减少代码量并提高代码的可维护性。
举例:多个应用程序或模块可以共享同一个视图,而不必各自实现相同的查询逻辑。

  • 动态数据展示

视图是动态的,其内容会随着底层表数据的变化而实时更新。这意味着视图始终反映最新的数据状态,无需手动维护数据的一致性。
举例:基于视图的报表可以实时反映最新的业务数据。

  • 简化多表查询

视图可以将多个表的数据整合在一起,隐藏复杂的JOIN操作,使得查询更加直观和简单。 举例:通过视图将订单表和订单明细表整合,简化查询逻辑。

6.2 缺点

如果我们在实际数据表的基础上创建了视图,那么,如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。 特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患。因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本。

相关文章:

  • 蓝桥杯小白打卡第五天
  • 什么是算法的空间复杂度和时间复杂度,分别怎么衡量。
  • 【故障处理】- 执行命令crsctl query crs xxx一直hang
  • 采用分布式部署deepseek
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_memalign函数
  • van-field的maxlength属性为空会导致输入框的值被清空。
  • SSML语音合成标记语言开发指南:从基础语法到实战案例解析
  • [250217] x-cmd 发布 v0.5.3:新增 DeepSeek AI 模型支持及飞书/钉钉群机器人 Webhook 管理
  • windows 设置poppler
  • unordered_set 和 unordered_map的模拟实现(c++)
  • 【Go入门篇】第一章:从 Java/Python 开发者的视角入门go语言
  • 半导体制造中的“魔法盾牌”:二氧化硅
  • 前端知识速记--HTML篇:HTML5的新特性
  • vLLM专题(六)-Pooling模型
  • floodfill算法系列一>扫雷游戏
  • vue基础(十)
  • 如何使用 Ollama 在本地设置和运行 DeepSeek R1
  • 如何使用 Docker 搭建 FastAPI 环境, 本地仅编辑代码
  • 力扣LeetCode: 931 下降路径最小和
  • 【小白学AI系列】NLP 核心知识点(七)Embedding概念介绍
  • 国家发改委下达今年第二批810亿超长期特别国债资金,支持消费品以旧换新
  • 王星昊再胜连笑,夺得中国围棋天元赛冠军
  • 伊朗港口爆炸已致46人死亡
  • 促进产销对接,安徽六安特色产品将来沪推介
  • 广州海关原党委委员、副关长刘小威被开除党籍
  • 十四届全国人大常委会第十五次会议在京举行,审议民营经济促进法草案等