mysql中的视图表

news2024/10/27 21:06:12

视图(View)是数据库中的一种对象,它是基于 SQL 语句的结果集的可视化的表。视图包含行和列,类似于一个真实的表,但它并不在数据库中以存储的数据值集形式存在。视图的内容由查询定义,可以来自单个表或多个表,甚至可以来自其他视图。视图的创建和删除只影响视图本身,不影响对应的基表,但是对视图中的数据进行增加、删除和修改操作时,会相应地影响基表中的数据。

1. 视图表的特点
  • 视图是数据的特定子集,是从其他表里提取出数据而形成的虚拟表,也可以说是临时表。其内容由查询定义,不占用物理存储空间。
  • 创建视图表需依赖一个查询。
  • 视图是不会自己消失的,一定要手动删除。
  • 视图有时对提高效率有帮助,临时表不会对性能有帮助,是资源的消耗者。
  • 视图一般随该数据库存放在一起,临时表永远都是在tempdb里生成。
  • 视图适合多表连接浏览时使用,不适合增删改,这样可以提高执行效率。
  • 视图表的名称一般以v-为前缀,可以与正常表进行区分。
  • 对原表的修改会影响到视图中的数据,对视图表的修改也会影响到原表的数据,原表和视图表是联动的。
  • 可以简化代码,可以把重复使用的查询封装成视图重复使用,同时可以使复杂的查询易于理解和使用。
  • 安全,如果一张表中有很多列数据,一些列的信息不希望让所有人看到,此时可以使用视图表,如员工信息表,可以用视图只显示姓名、id,而不显示工资和奖金,可以对不同的用户设定不同的视图。
2. 视图表的创建和删除语法
  • 创建
create [or replace] view view_name as
select column_name(s)
from table_name
where condtion
  • 示例:

    – 创建数据库demo4

    create database demo4;
    use demo4;
    

    – 创建部门表,并插入数据

    create table dept(
    	dno varchar(8) primary key,
    	dname varchar(8),
    	local varchar(8)
    )charset=utf8;
    
    insert into dept values(10, '研发部', '北京'),(20,'生产部','上海'),(30,'销售部','广州'),(40,'财务部','武汉');
    

    – 创建员工表,并插入数据

    create table emp(
    	eno varchar(8) primary key,
    	ename varchar(8),
    	job varchar(16),
    	mgr_id varchar(8),
    	hiredate date,
    	salary double,
    	bonus double,
    	e_dno varchar(8),
        foreign key (e_dno) references dept (dno)
    )charset=utf8;
    
    insert into emp values('1001','阿紫','文员','1013','2000-12-17',8000,null,'20'),
    ('1002','阿朱','销售员','1006','2001-02-20',16000,3000,'30'),
    ('1003','段誉','销售员','1006','2001-02-22',12500,5000,'30'),
    ('1004','乔峰','经理','1009','2001-04-02',29750,null,'20'),
    ('1005','诸葛亮','销售员','1006','2001-09-28',12500,14000,'30'),
    ('1006','洪七公','经理','1009','2001-05-01',28500,null,'30'),
    ('1007','黄药师','经理','1009','2001-09-01',24500,null,'10'),
    ('1008','黄蓉','分析师','1004','2007-04-19',30000,null,'20'),
    ('1009','成吉思汗','董事长',null,'2001-11-17',50000,null,'10'),
    ('1010','周瑜','销售员','1006','2001-09-08',15000,0,'30'),
    ('1011','黄盖','文员','1008','2007-05-23',11000,null,'20'),
    ('1012','黄忠','文员','1006','2001-12-03',9500,null,'30'),
    ('1013','鲁肃','分析师','1004','2001-12-03',30000,null,'20'),
    ('1014','蒋干','文员','1007','2002-01-23',13000,null,'10');
    

    – 创建工资等级表并插入数据

    create table grade(
    	grade int(8),
    	l_salary double,
    	h_salary double
    )charset=utf8;
    
    insert into grade values(1,7000,12000),(1,12010,14000),
    (3,14010,20000),(4,20010,30000),(5,30010,99990);
    

    – 创建视图

    create or replace view v1_emp as select ename, job from emp;
    

    – 查看视图表

    show full tables; -- 比show tables多了一列table_type
    

在这里插入图片描述
– 查看视图的数据(可以将视图表当成表来使用)

select * from v1_emp;

在这里插入图片描述

3. 视图表的修改
  • 语法

    alter view view_name as select语句
    
  • 示例

    alter view v1_emp
    as
    select a.dno, a.dname, a.local, b.ename, b.salary from dept as a, emp as b where a.dno = b.e_dno;
    
    select * from v1_emp;
    

在这里插入图片描述

4. 视图表的更新
  • 某些视图表可以使用update、delete、insert等语句更新,实际上更新的是基表的内容。这些视图表中的行和基表中的行之间必须是一对一的关系

    create or replace view v2_emp
    as
    select ename, job from emp;
    
    select * from v2_emp;
    

在这里插入图片描述

update v2_emp set ename = '陆逊' where ename = '鲁肃'; --实际上更新的是基表
select * from v2_emp;
select * from emp;

在这里插入图片描述
在这里插入图片描述

  • 如果视图表中包含以下任何一种情况,那么它就不能更新:

    1、视图表是否能被修改,依赖于创建视图表时的算法值ALGORITHM,ALGORITHM有3个可选值:undfined,merge,temptable

    • undfined:默认值,表示视图表允许被修改

    • merge:视图表也允许被修改

    • temptable:视图表不允许被修改

    – 创建视图表时可以指定算法:

create algorithm=temptable view view_name as
select column_name(s)
from table_name
where condtion
-- 此时创建的视图表不能被修改

​ 2、select语句中包含聚合函数(sum()、min()、max()、count()等)

create or replace view v3_emp
as
select count(*) as ct from emp;

insert into v3_emp values(100); --报错
update v3_emp set cnt = 100; --报错

3、select语句中包含distinct关键字的

create or replace view v4_emp
as
select distinct job from emp;

4、select语句中包含group by

5、select语句中包含having

6、select语句中包含union或union all

7、select语句中包含子查询

create or replace view v8_emp
as
select eno, ename, salary from emp where salary = (select max(salary) from emp);

8、select语句中包含join

9、from子句中的不可更新视图

10、select语句中包含常量文字值

create or replace view v11_emp
as
select '销售部' dname, '黄蓉' ename;
5、视图表的重命名和删除
  • 重命名视图语法

    rename table view_name to new_view_name;
    
  • 删除视图:删除视图时只能删除视图的定义,不会删除基表数据

    drop view [if exists] view_name1 [,view_name2...];
    
6、视图表的练习

— 在demo4中查询部门平均薪水最高的部门名称

-- 使用嵌套查询方式
select *
from dept as a, (
					select *
					from(
    						select *, rank() over(order by avg_salary desc) rn 
							from(
    						select e_dno, avg(salary) as avg_salary from emp group by e_dno
								) as t1
						) as t2
					where rn = 1
    			) as t3
where a.dno = t3.e_dno; 

-- 使用视图表方式
create view v_avg_salary 
as
select e_dno, avg(salary) as avg_salary from emp group by e_dno;

create view v_rn
as
select *, rank() over(order by avg_salary desc) as rn from v_avg_salary;

create view v_rn1
as
select * from v_rn where rn = 1;

select * from dept, v_rn1 where dno = e_dno;

– 查询员工比所属领导薪资高的部门名,员工姓名,员工领导编号

--子查询方式
select * from(
	select a.eno, a.ename, a.salary as a_salary, a.mgr_id, b.salary as b_salary from
    	emp a join emp b on a.mgr_id = b.eno
    ) t where t.a_salary > t.b_salary;
    
-- 视图表方式
create view v1
as
select a.eno, a.ename, a.salary a_salary, a.mgr_id, b.salary b_salary from
	emp a join emp b on a.mgr_id = b.eno;

select * from v1 where a_salary > b_salary;

– 查询工资等级为4级,2000年以后入职的工作地点在北京的员工编号,姓名和工资,并查询出薪资在前三名的员工信息

create view v_grade as
select * from dept d 
	join emp e on e.e_dno = d.dno and hiredate > 2000-12-31 and d.local = '上海'
	join grade g on grade = 4 and (e.salary between g.l_salary and g.h_salary);

select *, rank() over(order by salary) as rn from v_grade t where t.rn <= 3;

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

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

相关文章

docker 镜像详解

Docker镜像是一种轻量级、可移植的软件打包格式&#xff0c;它包含了运行应用程序所需的一切&#xff0c;是构建和分发应用程序的基础。以下是对Docker镜像的详细解释&#xff1a; 一、镜像的定义 镜像本质上是一个只读文件&#xff0c;包含了文件系统、源码、库文件、依赖、…

openpnp - 解决“底部相机高级校正成功后, 开机归零时,吸嘴自动校验失败的问题“

文章目录 openpnp - 解决"底部相机高级校正成功后, 开机归零时&#xff0c;吸嘴自动校验失败的问题"概述笔记问题现象1问题现象2原因分析现在底部相机和吸嘴的位置偏差记录修正底部相机位置现在再看看NT1在底部相机中的位置开机归零&#xff0c;看看是否能通过所有校…

ubuntu进程相关操作

进程相关操作 1.查看进程top/htop top 命令输出解释 在 top 命令中&#xff0c;字段通常表示如下&#xff1a; USER&#xff1a;进程的所有者。PR&#xff1a;优先级。NI&#xff1a;nice 值&#xff08;优先级调整&#xff09;。VIRT&#xff1a;进程使用的虚拟内存总量。…

深度解析百度搜索引擎点击结果:如何提高网站曝光率和用户满意度

在互联网时代&#xff0c;搜索引擎已成为广大网民获取信息的重要途径。作为国内领先的搜索引擎&#xff0c;百度拥有庞大的用户群体。本文将为您分析百度搜索引擎点击搜索结果&#xff0c;助您提高网站曝光率和用户满意度。 一、百度搜索引擎点击搜索结果的重要性 提高网站曝…

jsMind:炸裂项目,用JavaScript构建的思维导图库,GitHub上的热门开源项目

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 jsMind 是一个基于 JavaScript 的思维导图库&#xff0c;它利用 HTML5 Canvas 和 SVG 技术构建&#xff0c;可以轻松地在网页中嵌入和编辑思维导图。它以 …

LeetCode --- 420周赛

题目列表 3324. 出现在屏幕上的字符串序列 3325. 字符至少出现 K 次的子字符串 I 3326. 使数组非递减的最少除法操作次数 3327. 判断 DFS 字符串是否是回文串 一、出现在屏幕上的字符串序列 根据题目意思进行模拟即可&#xff0c;代码如下 class Solution { public:vector…

ASP.NET Core8.0学习笔记(二十三)——EF Core自引用

一、什么是自引用 1.在常见的树状目录中&#xff0c;其结构如下&#xff1a; 每一个菜单可能有父级菜单&#xff0c;也可能有子菜单。但是无论是哪一级菜单&#xff0c;他们都是同属于菜单对象。将这个菜单对象使用代码进行描述&#xff1a; 在上面的代码中&#xff0c;主…

【论文精读】LTGC: Long-tail Recognition via Leveraging LLMs-driven Generated Content

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;论文精读_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 摘要 2. …

系统聚类比较——最短距离法、最长距离法、重心法和类平均法

系统聚类概述 系统聚类&#xff0c;又称分层聚类法&#xff0c;是一种用于分析数据的统计方法&#xff0c;在生物学、分类学、社会网络等领域有广泛应用。以下是对系统聚类的详细概述&#xff1a; 一、基本思想 系统聚类的基本思想是将每个样品&#xff08;或数据点&#xf…

深入理解C++模板编程:从基础到进阶

引言 在C编程中&#xff0c;模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型&#xff0c;极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识&#xff0c;包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。 一…

《分布式机器学习模式》:解锁分布式ML的实战宝典

在大数据和人工智能时代&#xff0c;机器学习已经成为推动技术进步的重要引擎。然而&#xff0c;随着数据量的爆炸性增长和模型复杂度的提升&#xff0c;单机环境下的机器学习已经难以满足实际需求。因此&#xff0c;将机器学习应用迁移到分布式系统上&#xff0c;成为了一个不…

世界酒中国菜与另可数字平台达成战略合作

世界酒中国菜与另可数字平台达成战略合作&#xff0c;共推行业发展新高度 近日&#xff0c;在行业内引起广泛关注的“世界酒中国菜”项目&#xff0c;与“另可”数字平台成功举行了战略合作签约仪式。这一重要合作不仅是双方发展历程中的重要里程碑&#xff0c;更是继世界酒中…

如何通过视频建立3d模型

通过视频建立3D模型通常包括几个关键步骤&#xff1a;从视频中提取帧、对帧中的物体进行特征提取、将多帧中的信息结合起来恢复三维结构。Python中有一些库和工具可以帮助实现这个过程&#xff0c;例如OpenCV、Open3D、COLMAP等。以下是一个简化的流程和代码框架&#xff1a; 步…

量子计算突破:下一个科技革命的风口浪尖在哪里?

内容概要 在当今科技飞速发展的时代&#xff0c;量子计算如同一颗璀璨的明珠&#xff0c;正闪烁着无尽的可能性。它不仅是解决科学难题的钥匙&#xff0c;更是即将引领科技革命的先锋。如今&#xff0c;随着技术的不断突破&#xff0c;量子计算已经步入了一个崭新的阶段。想象…

使用React构建现代Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用React构建现代Web应用 1 引言 2 React简介 3 安装React 4 创建React项目 5 设计应用结构 6 创建组件 7 使用组件…

Docker本地安装Minio对象存储

Docker本地安装Minio对象存储 1. 什么是 MinIO&#xff1f; MinIO 是一个开源的对象存储服务器。这意味着它允许你在互联网上存储大量数据&#xff0c;比如文件、图片、视频等&#xff0c;而不需要依赖传统的文件系统。MinIO 的特点在于它非常灵活、易于使用&#xff0c;同时…

【ruoyi-vue】ruoyi-vue 去掉数据库和redis

场景&#xff1a;采用ruoyi-vue作为一个简单的后台框架&#xff0c;不需要使用数据库&#xff0c;redis。因此采取以下方法去掉相关配置&#xff0c;防止启动时造成数据和redis不存在的报错。 1、去掉数据库 注释掉framework下的DruidConfig.java 2、去掉部分数据启动时的初…

将公有云变成本地磁盘的几种方式

因为微信更改了推送机制&#xff0c;不按照号主发文时间排序了。现在的规则是综合多种因素&#xff0c;你可能在今天收到昨天的推送&#xff0c;甚至前天的&#xff01; 如果你认可菜鸟小白的学习分享的话&#xff0c;就星标一下吧&#xff0c;只需要两步&#xff01; 这样你可…

猫头虎 分享:Python库 Click 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎 分享&#xff1a;Python库 Click 的简介、安装、用法详解入门教程 今天猫头虎带您一起探索 Click 库&#xff01;最近有位粉丝私信猫哥&#xff0c;问到在项目中如何用 Python 简单又高效地实现命令行工具。大家熟悉的 argparse 虽然功能齐全&#xff0c…

深入理解gPTP时间同步过程

泛化精确时间协议(gPTP)是一个用于实现精确时间同步的协议,特别适用于分布式系统中需要高度协调的操作,比如汽车电子、工业自动化等。 gPTP通过同步主节点(Time Master)和从节点(Time Slave)的时钟,实现全局一致的时间参考。 以下是gPTP实现主从时间同步的详细过程:…