MySQL —— 视图

news2024/9/20 17:24:02

概念

视图是一张虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。

视图本身不存储数据,而是通过执行查询来动态生成数据,用户可以像操作普通表一样使用视图来进行查询更新与管理等操作。

视图本身也不占用物理存储空间,它仅仅是一个查询的逻辑表示,物理上它依赖于基础表中的数据。

视图的创建与使用

语法:create view view_name [(column_list)] as select_statement;

当我们有一个复杂的 sql 查询时,如果每次都有这个需求,那么每次就要写相同的 sql 语句,例如:现在有四张表,如下所示,学生表,成绩表,班级表和课程表

在这里插入图片描述
现在有一个需求:查询学生的 id ,姓名,对应的班级 ,课程名字以及对应的成绩,我们自然而然会写出下面的sql 语句:

select st.student_id as id, st.name as '姓名', cl.name as '班级', c.name as '课程', sc.score as '成绩' 
from student st, class cl, course c, score sc 
where st.class_id = cl.class_id and sc.student_id = st.student_id and sc.course_id = c.course_id
order by st.student_id asc;

在这里插入图片描述
当我们每次都想获得这张表的时候,都需要写这么长的 sql 语句,为了以后能便捷地获得这张表,我们可以使用视图,通过视图来保存这次 sql 查询的结果集。

create view v_student_course_score as  (
select st.student_id as id, st.name as '姓名', cl.name as '班级', c.name as '课程', sc.score as '成绩' 
from student st, class cl, course c, score sc 
where st.class_id = cl.class_id and sc.student_id = st.student_id and sc.course_id = c.course_id
order by st.student_id asc
);

通过视图的创建,我们来查看表的数量,发现视图已经在数据库中:
在这里插入图片描述

当我们还有上面的 sql 查询需求的时候,我们直接查询视图就可以得到结果集了。

select * from v_student_course_score;

在这里插入图片描述

注意:

如果视图的创建的时候,如果select_statement 没有使用别名,并且发现有些名字是有重复的话,就会创建失败:

在这里插入图片描述
这三个的列名都是 name,视图无法区分,并且报下面的警告:

在这里插入图片描述
警告的意思是有重复的 name


所以在创建视图的时候要避免列名的重复,解决方法有两种,一种是在 select_statement 中就定义好别名,另一种就是在创建视图的时候在视图中定义别名,第一种方法在上面已经演示过,现在来演示第二种方法:

create view v_student_course_score2 (
id, 姓名, 班级,课程, 分数
)
as  (
select st.student_id, st.name, cl.name, c.name, sc.score 
from student st, class cl, course c, score sc 
where st.class_id = cl.class_id and sc.student_id = st.student_id and sc.course_id = c.course_id
order by st.student_id asc
);

注意取中文列名的时候不用加单引号

在这里插入图片描述


我们可以通过show create view view_name; 来查看视图的创建信息包括视图名,视图创建语句,视图使用的字符编码集和排列规则
在这里插入图片描述

视图的更新

一句话:在视图能更新的情况下,视图的更新会影响到基本表,基本表的更新也会影响到视图,二者是相互影响的关系。

下面是学生表,我们将学生表的黑旋风李逵改名为李逵:
在这里插入图片描述
在这里插入图片描述

现在我们来看一下视图,会发现视图的黑旋风李逵也被修改为李逵:
在这里插入图片描述


当我们修改视图,将李逵的id 修改为50:
在这里插入图片描述
我们会发现无法对视图进行修改,说明不是所有的视图都能进行修改,上面的信息说视图使用了 order by 子句,无法进行更新操作,在后面我会做个不能进行更新操作的视图的总结。

既然如此,我们新建立一个视图:
在这里插入图片描述

然后将李逵修改回黑旋风李逵。
在这里插入图片描述

看一下视图内容发现修改成功:
在这里插入图片描述

最后看一下学生表,也是成功被修改了:

在这里插入图片描述


现在来总结,什么样的视图不能被修改:

  1. 创建视图使用了聚合函数
  2. 使用了 distinct
  3. 使用了order by 以及 having
  4. 使用了合并查询union 或者 union all
  5. 使用了子查询
  6. 在创建视图的 from 子句中引用了不可更新的视图

视图的删除

语法:drop view view_name;

演示:视图 v_student_course_score 被删除成功。

在这里插入图片描述

小结

视图具有如下的优点:

  1. 简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
  2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,⼀个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
  3. 逻辑数据独立性:视图提供了⼀种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
  4. 重命名列:视图允许用户重命名列名,以增强数据可读性

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

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

相关文章

网络安全学习(五)Burpsuite

经过测试,发现BP需要指定的JAVA才能安装。 需要的软件已经放在我的阿里云盘。 (一)需要下载Java SE 17.0.12(LTS) Java Downloads | Oracle 1.2023版Burp Suite 完美的运行脚本的环境是Java17 2.Java8不支持 看一下是否安装成功&#xff0c…

开源AI应用安全指导框架 — OWASP AI Exchange

在当今信息化迅猛发展的时代,网络专业人士正竞相提升人工智能(AI)安全领域的专业技能。随着这一趋势的推进,他们的企业也在快速地引入各类AI工具、平台、应用程序和服务,业界也相应涌现出众多资源,以协助从…

电梯电动车检测-目标检测数据集(包括VOC格式、YOLO格式)

电梯电动车检测-目标检测数据集(包括VOC格式、YOLO格式) 数据集: 链接:https://pan.baidu.com/s/1qRMdF08Jinx_5CRa3al24A?pwd3twc 提取码:3twc 数据集信息介绍: 共有 5347 张图像和一一对应的标注文件 …

web基础—dvwa靶场(五)File Upload

File Upload(文件上传) 上传的文件对 web 应用程序来说是一个巨大的风险,许多攻击的第一步是上传攻击代码到被攻击的系统上,然后攻击者只需要找到方法来执行代码即可完成攻击。也就是是说,文件上传是攻击者需要完成的第一步。 不受限制的文件…

c#中给winform定义快捷键的几种方式

快捷键的使用在日常的开发中频率比较高,这里总结了最常见的各种快捷键的设置方式,需要的时候大家直接照抄就可以了,不用再去查询如何实现了。 文章目录 一、按钮快捷键二、菜单快捷键三、窗体快捷键四、全局快捷键1、重写ProcessCmdKey2、使…

C++内存管理详解:各类变量的存储区域

在C中,变量的存储位置取决于它们的类型和生命周期。那么不同的各个变量究竟存储在哪个区域呢? 1.不同类型的变量 我们首先从变量类型的不同来说明: 1. 全局变量和静态变量 - 存储区:全局/静态区(静态区&#xff0…

深度学习----------------------文本预处理

目录 文本预处理读取数据集词源化词表该部分总代码该部分总代码 整合所有功能该部分总代码 文本预处理 文本预处理:把文本当作一个时序序列 将解析文本的常见预处理步骤。 这些步骤通常包括: ①将文本作为字符串加载到内存中。 ②将字符串拆分为词元&…

Redis的存储原理和数据模型

一、Redis是单线程还是多线程呢? 我们通过跑redis的代码,查看运行的程序可以得知,Redis本身其实是个多线程,其中包括redis-server,bio_close_file,bio_aof_fsync,bio_lazy_free,io_t…

Python如何导入自定义包?

在 Python 中,导入包是日常开发的基础操作之一。Python 通过其模块化设计,使得代码可以组织成模块和包,提升了代码的复用性和可维护性。而当开始构建复杂的Python项目时,通常会发现将代码组织在各种模块和包中是非常有帮助的。自定…

【C++】list常见用法

🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:C从小白到高手 🌹往期回顾🌹:[C]vector常见用法 🔖 流水不争,争的是滔滔不息。 文章目录 一、list的介绍li…

JVM 调优篇6 可视化性能监控工具-JVisual VM

一 Visual VM 1.1 概述 Visual VM是一个功能强大的多合一故障诊断和性能监控的可视化工具。 它集成了多个JDK命令行工具,使用Visual VM可用于显示虚拟机进程及进程的配置和环境信息(jps,jinfo),监视应用程序的CPU、GC、堆、方法区及线程的信息(jstat…

Celery的使用

Celery 一、Celery概述1. 特点:2. celery组成3. 安装与使用4. 邮箱配置二、Celery的使用实操——发送邮件1. 安装2. 配置一、Celery概述 1. 特点: 2. celery组成 配置任务队列Broker,采用redis保存要执行的任务队列 Client:任务的发出者 Worker:任务的处理者 3. 安装与使用…

从0-1 用AI做一个赚钱的小红书账号(不是广告不是广告)

大家好,我是胡广!是不是被标题吸引过来的呢?是不是觉得自己天赋异禀,肯定是那万中无一的赚钱天才。哈哈哈,我告诉你,你我皆是牛马,不要老想着突然就成功了,一夜暴富了,瞬…

信奥初赛解析:1.2-计算机系统的基本结构

目录 知识要点 一、概述 二、计算机硬件系统 (一)处理器 (二)存储器 (1)内存储器 (2)外存储器 ①固态硬盘存储器 ②机械硬盘存储器 ③闪存 (三)输入设备 (四)输出设备 (五)总线结构 (六)主要的性能指标 1.字长 2.运…

计算机毕业设计 网上书店系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

JVM OutOfMemoryError 与 StackOverflowError 异常

目录 前言 堆溢出 虚拟机栈和本地方法栈溢出 方法区溢出 前言 JVM规范中规定, 除了程序计数器之外, 其他的运行时数据区域, 例如堆栈, 方法区, 都会出现OutOfMemoryError异常. 那么到底是怎么样的代码, 才会引起堆溢出, 栈溢出, 或者是方法区的溢出呢? 如果遇到了又该如何…

书生大模型全链路开源体系,学习

优点 书生浦语开源大模型,是一个开源的大模型,大家可以一起学习 还有配套的教学视频,很快就能上手,而且还奖励算力,可以直接训练,讨论学习,非常nice。 教学视频 书生浦语大模型全链路开源开…

FastAPI与环境变量:实现无缝切换与高效运维

在现代软件开发中,尤其是构建RESTful API时,环境变量的管理显得尤为重要。它们不仅允许我们在不同环境中(如开发、测试、生产)灵活地调整应用的行为,还极大地增强了应用的安全性和可维护性。FastAPI作为一个新兴的、高…

ROS组合导航笔记1:融合传感器数据

使用机器人定位包(robot_localization package)来合并来自不同传感器的数据,以改进机器人定位时的姿态估计。 基本概念 在现实生活中操作机器人时,有时我们需要处理不够准确的传感器数据。如果我们想要实现机器人的高精度定位&am…

苍穹外卖 修改nginx的端口后websocket连接失败解决

苍穹外卖 修改nginx的端口后websocket连接失败解决 问题: 后端配置好websocket后前端仍显示如图所示的错误 解决: 先用websocket在线工具测试后端是否能正常连接(这个基本上不会出现问题)用f12观察前端发送的请求 正常来说这个请…