MySQL —— 视图

概念

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

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

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

视图的创建与使用

语法: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.mzph.cn/news/879612.shtml

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

相关文章

Redis基础数据结构之 Sorted Set 有序集合 源码解读

目录标题 Sorted Set 是什么?Sorted Set 数据结构跳表(skiplist)跳表节点的结构定义跳表的定义跳表节点查询层数设置 Sorted Set 基本操作 Sorted Set 是什么? 有序集合(Sorted Set)是 Redis 中一种重要的数据类型,…

SQL Server数据库简单的事务日志备份恢复

模拟数据库备份恢复过程 1.基础操作 1.创建TestDB数据库,并添加数据 USE [master] GO CREATE DATABASE TestDB CONTAINMENT NONE ON PRIMARY ( NAME NTestDB, FILENAME ND:\TestDB.mdf , SIZE 8192KB , MAXSIZE UNLIMITED, FILEGROWTH 65536KB ) LOG ON ( …

【ArcGIS Pro实操第七期】栅格数据合并、裁剪及统计:以全球不透水面积为例

【ArcGIS Pro实操第七期】批量裁剪:以全球不透水面积为例 准备:数据下载ArcGIS Pro批量裁剪数据集1 数据拼接2 数据裁剪3 数据统计:各栅格取值3.1 栅格计算器-精确提取-栅格数据特定值3.2 数据统计 4 不透水面积变化分析 参考 准备&#xff1…

DAY13信息打点-Web 应用源码泄漏开源闭源指纹识别GITSVNDS备份

#知识点 0、Web架构资产-平台指纹识别 1、开源-CMS指纹识别源码获取方式 2、闭源-习惯&配置&特性等获取方式 3、闭源-托管资产平台资源搜索监控 演示案例: ➢后端-开源-指纹识别-源码下载 ➢后端-闭源-配置不当-源码泄漏 ➢后端-方向-资源码云-源码泄漏 …

[C++进阶]AVL树

前面我们说了二叉搜索树在极端条件下时间复杂度为O(n),本篇我们将介绍一种对二叉搜索树进行改进的树——AVL树 一、AVL 树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找效率低下。因此,两位…

人工智能和大模型的简介

文章目录 前言一、大模型简介二、大模型主要功能1、自然语言理解和生成2、文本总结和翻译3、文本分类和信息检索4、多模态处理三、大模型的技术特性1、深度学习架构2、大规模预训练3、自适应能力前言 随着技术的进步,人工智能(Artificial Intelligence, AI)和机器学习(Mac…

【微服务】springboot 整合表达式计算引擎 Aviator 使用详解

目录 一、前言 二、表达式计算框架概述 2.1 规则引擎 2.1.1 什么是规则引擎 2.1.2 规则引擎用途 2.1.3 规则引擎使用场景 2.2 表达式计算框架 2.2.1 表达式计算框架定义 2.2.2 表达式计算框架特点 2.2.3 表达式计算框架应用场景 2.3 表达式计算框架与规则引擎异同点 …

Pytorch详解-Pytorch核心模块

Pytorch核心模块 一、Pytorch模块结构_pycache__Cincludelibautogradnnoptimutils 二、Lib\site-packages\torchvisiondatasetsmodelsopstransforms 三、核心数据结构——Tensor(张量)在深度学习中,时间序列数据为什么是三维张量?…

Imagen:重塑图像生成领域的革命性突破

目录 引言 一、Imagen模型的技术原理 1. 模型概述 2. 工作流程 3. 技术创新 二、Imagen模型的应用实例 1. 创意设计 2. 虚拟角色制作 3. 概念可视化 三、Imagen模型的优势与挑战 1. 优势 2. 挑战 四、Imagen模型的未来发展方向 1. 图像生成质量的提升 2. 多模态…

SIPp uac.xml 之我见

https://sipp.sourceforge.net/doc/uac.xml.html 这个 uac.xml 有没有问题呢&#xff1f; 有&#xff01; 问题之一是&#xff1a; <recv response"200" rtd"true" rrs"true"> 要加 rrs, 仔细看注释就能看到 问题之二是&#xff1…

vue3补充

form表单重置 const { proxy } getCurrentInstance()!; // 获取挂载在全局的上下文proxy.resetForm(ruleFormRef); // 在el-form中清空ref为ruleFormRef的表单注&#xff1a;不推荐使用 不推荐的原因 类型安全问题&#xff1a; 当在 TypeScript 环境中使用时&#xff0c;…

算法leecode笔记

具体代码&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hashtable;for (int i 0; i < nums.size(); i) {auto it hashtable.find(target - nums[i]);if (it ! hashtable.end…

Rust编写Windows服务

文章目录 Rust编写Windows服务一&#xff1a;Windows服务程序大致原理二&#xff1a;Rust中编写windows服务三&#xff1a;具体实例 Rust编写Windows服务 编写Windows服务可选语言很多, 其中C#最简单。本着练手Rust语言&#xff0c;尝试用Rust编写一个服务。 一&#xff1a;Win…

Git之如何删除Untracked文件(六十八)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

【编程基础知识】mysql根据某个int字段计算到每一行为止的累加值怎么实现

一、方式一&#xff1a;窗口函数 在MySQL中&#xff0c;可以使用窗口函数&#xff08;Window Functions&#xff09;来计算每一行的累加值。如果你使用的是MySQL 8.0或更高版本&#xff0c;可以使用 SUM() 窗口函数结合 OVER() 子句来实现这个需求。 假设你有一个名为 sales 的…

Oracle数据库中的动态SQL(Dynamic SQL)

Oracle数据库中的动态SQL是一种在运行时构建和执行SQL语句的技术。与传统的静态SQL&#xff08;在编写程序时SQL语句就已经确定&#xff09;不同&#xff0c;动态SQL允许开发者在程序执行过程中根据不同的条件或用户输入来构建SQL语句。这使得动态SQL在处理复杂查询、存储过程中…

【计算机网络】UDP 协议详解及其网络编程应用

文章目录 一、引言二、UDP1、UDP的协议格式2、UDP 报文的解包和分用3、UDP面向数据报的特点 三、UDP输入输出四、UDP网络编程 一、引言 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种网络通信协议&#xff0c;它属于传输层的协议。是一…

PostgreSQL - tutorial

本文翻译整理自&#xff1a;官方文档 Preface 和 第一部分&#xff08;I. Tutorial&#xff09; 有需要的可以前往官方文档查看&#xff1a;https://www.postgresql.org/docs/15/index.html 文章目录 序言1.什么是PostgreSQL&#xff1f;2. PostgreSQL简史2.1 伯克利POSTGRES项…

【linux】ln 命令

ln 命令在 Linux 系统中用于创建链接&#xff08;links&#xff09;&#xff0c;它允许你创建一个文件的引用&#xff0c;指向该文件系统中的另一个位置。这种链接可以是硬链接&#xff08;hard link&#xff09;或软链接&#xff08;软连接&#xff0c;也称为符号链接&#xf…

HTTP中的Cookie与Session

一、背景 HTTP协议是无状态无连接的。 无状态&#xff1a;服务器不会保存客户端历史请求记录&#xff0c;每一次请求都是全新的。 无连接&#xff1a;服务器应答后关闭连接&#xff0c;每次请求都是独立的。 无状态就导致服务器不认识每一个请求的客户端是否登陆过。 这时…