【MySQL】浅谈视图
创始人
2024-04-08 05:21:58
0

文章目录

  • 1. 视图概述
  • 2. 创建视图
  • 3. 修改视图
  • 4. 更新视图
  • 5. 其他操作

1. 视图概述

什么是视图?

  • 视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。
  • 数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中
  • 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

视图有什么特点?

  1. 当视图来自多张基本表的时候,不允许添加和删除数据
  2. 视图的建立和删除不影响基本表。
  3. 对视图内容的更新(添加,删除和修改)直接影响基本表。

视图有什么优点?

  • 简化复杂查询
  • 数据库视图有助于限制对特定用户的数据访问
    • 如一张表中有很多数据,很多信息不希望让所有人看到,此时可以使用视图视,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,可以对不同的用户,设定不同的视图。

视图有什么缺点?

  • 从性能方面来看,从视图查询数据可能会很慢,特别是视图是基于其他视图创建的时候。
  • 从表依赖关系看,将根据数据库的基础表创建一个视图**。每当更改与其相关联的表的结构时,都必须更改视图。**

视图的使用场景有哪些?

视图在开发中还是有蛮多场景的, 比如: 采购单:有价格、数量、税率、含税金额,多半没有不含税金额、税额,而这些字段在很多报表中有都会用到,所以我们可以创建一个含有计算列字段的视图来解决这个问题。


2. 创建视图

create [or replace] [algorithm = {undefined | merge | temptable}]view view_name [(column_list)]as select_statement[with [cascaded | local] check option]

参数说明:

  1. algorithm:可选项,表示视图选择的算法。
  2. view_name :表示要创建的视图名称。
  3. column_list:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同。
  4. select_statement:表示一个完整的查询语句,将查询记录导入视图中。
  5. [with [cascaded | local] check option]:可选项,表示更新视图时要保证在该视图的权限范围之内。
create or replace view view1_emp
as 
select ename,job from emp; 

3. 修改视图

修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER VIEW语句来修改视图

alter view view1_emp
as 
select a.deptno,a.dname,a.loc,b.ename,b.sal from dept a, emp b where a.deptno = b.deptno;

4. 更新视图

某些视图是可更新的。也就是说,可以在UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。

但是并不是所有的视图都可更新,比如视图包含下述结构中的任意一种,它就是不可更新的。

  • 聚合函数(SUM(), MIN(), MAX(), COUNT()等)
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNION或UNION ALL
  • 位于选择列表中的子查询
  • JOIN
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询,引用FROM子句中的表。
  • 仅引用文字值(在该情况下,没有要更新的基本表)
--  ---------更新视图-------
create or replace view view1_emp
as 
select ename,job from emp;update view1_emp set ename = '周瑜' where ename = '鲁肃';  -- 可以修改
insert into view1_emp values('孙权','文员');  -- 不可以插入-- ----------视图包含聚合函数不可更新--------------
create or replace view view2_emp
as 
select count(*) cnt from emp;insert into view2_emp values(100);
update view2_emp set cnt = 100; 
-- ----------视图包含distinct不可更新---------
create or replace view view3_emp
as 
select distinct job from emp;insert into view3_emp values('财务');-- ----------视图包含goup by 、having不可更新------------------create or replace view view4_emp
as 
select deptno ,count(*) cnt from emp group by deptno having  cnt > 2;insert into view4_emp values(30,100);
-- ----------------视图包含union或者union all不可更新----------------
create or replace view view5_emp
as 
select empno,ename from emp where empno <= 1005
union 
select empno,ename from emp where empno > 1005;insert into view5_emp values(1015,'韦小宝');-- -------------------视图包含子查询不可更新--------------------
create or replace view view6_emp
as 
select empno,ename,sal from emp where sal = (select max(sal) from emp);insert into view6_emp values(1015,'韦小宝',30000);
-- ----------------------视图包含join不可更新-----------------
create or replace view view7_emp
as 
select dname,ename,sal from emp a join  dept b  on a.deptno = b.deptno;insert into view7_emp(dname,ename,sal) values('行政部','韦小宝',30000);-- --------------------视图包含常量文字值不可更新-------------------
create or replace view view8_emp
as 
select '行政部' dname,'杨过'  ename;insert into view8_emp values('行政部','韦小宝');

视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。


5. 其他操作

重命名视图

-- rename table 视图名 to 新视图名; 
rename table view1_emp to my_view1

删除视图

-- drop view 视图名[,视图名…];
drop view if exists view_student;

删除视图时,只能删除视图的定义,不会删除数据。


参考:

  • 2022新版黑马程序员MySQL知识精讲+mysql实战案例_零基础mysql数据库入门到高级全套教程
  • 金三银四面试常问MySQL面试题 - MySQL视图_java晴天过后的博客-CSDN博客_mysql视图面试题

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...