滴水恩情 发表于 2024-11-28 13:38:20

【MySQL】视图

目录
1.什么是视图
2.视图的基本使用
2.1.预备工作
2.2.创建视图
3.视图与基表的相互影响
3.1.修改视图影响基表
3.2.修改基表影响视图
4.删除视图
 5.关于视图

 
1.什么是视图

        视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表现,其本质是对应于一条SELECT语句,效果集被赋予一个名字,即视图名字。
       视图本身并不包罗任何数据,它只包罗映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
        视图是一种虚拟表,其内容由查询(通常是SQL查询)界说。视图本身不存储数据,而是基于一个或多个基表(现实存储数据的表)天生。当访问视图时,数据库系统会自动实行界说视图的查询,并返回效果集。
特性

[*]虚拟性:视图不存储现实数据,只存储查询界说。因此,视图在数据库中占用的空间非常小。
[*]数据独立性:视图提供了一个逻辑层,使得应用程序可以独立于基表结构的变化。例如,即使基表的列名或结构发生变化,只要视图的查询界说保持不变,应用程序仍旧可以通过视图访问数据。
[*]安全性:视图可以用于限定用户访问基表中的敏感数据。通过界说视图,可以仅暴露用户需要访问的列和行,从而掩护数据的机密性。
[*]简化复杂查询:视图可以封装复杂的SQL查询,使得用户可以通过简单的查询语句访问复杂的数据集。
视图与基表的关系


[*]数据变化的影响:

[*]当视图中的数据发生变化时(例如通过INSERT、UPDATE或DELETE操作),这些变化会反映到基表中。但是,这种变化受到视图界说和数据库权限的限定。
[*]同样地,当基表中的数据发生变化时,这些变化也会反映到基于该基表的视图中。

[*]更新限定:

[*]并非所有视图都是可更新的。例如,假如视图包罗聚合函数(如SUM、AVG)、DISTINCT关键字、GROUP BY子句或子查询,则该视图通常是不可更新的。
[*]某些数据库系统允许通过视图进行更新操作,但会施加额外的限定以确保数据的一致性和完整性。

2.视图的基本使用

2.1.预备工作

首先我们去这个网站下载一个.sql文件:阿里云盘分享 (alipan.com)
https://i-blog.csdnimg.cn/direct/20d5822dae044a39a36065ba8b5b5003.png
https://i-blog.csdnimg.cn/direct/7c247ebd97b44bf7b0004722e0619305.png
拿到该数据库文件以后,我们可以先打开该文件进行检察其内容:
vim scott_data.sql
 https://i-blog.csdnimg.cn/direct/19c287f071af400496a1769215c66dae.png
我们会发现其里面都是SQL记载,对于MySQL我们备份其数据库时,其实备份的全部都是一条条有效的SQL记载,通过重新实行这些SQL,我们便可以或许得到和原来一摸一样数据库。
接下来我们就可以在mysql中将这个数据库给创建出来了: 
source 该文件的绝对路径;
 例如我这里是:
source /home/zs_113/scott_data.sql https://i-blog.csdnimg.cn/direct/19a5578a2851420e945c4a0d7aba1fad.png
然后我们查询我们的数据库,发现数据库中多了一个scott的数据库:
show databases;
https://i-blog.csdnimg.cn/direct/0b4f4dfabfcc49a48637d1414b92732f.png
我们进去看看 
use scott;
show tables; https://i-blog.csdnimg.cn/direct/ebc49d105a4b466ca9db652929ba76c6.png
 这三张表是


[*]EMP员工表
[*]DEPT部分表
[*]SALGRADE工资品级表
我们先分别检察一下表结构和表内容:


[*]EMP员工表
desc emp;
select * from emp;
https://i-blog.csdnimg.cn/direct/b1012e5a6e804b02a700ec4bf119d97f.png https://i-blog.csdnimg.cn/direct/b6e9d08175244f49a8175a1dcc31281d.png


[*] DEPT部分表
desc dept;

select * from dept; https://i-blog.csdnimg.cn/direct/081977eb8f3c456fb3a80f06295b7124.png


[*]SALGRADE工资品级表 
desc salgrade;
select * from salgrade; https://i-blog.csdnimg.cn/direct/956a0a8a4ad943188ea39fa1d3d33ee1.png
接下来我们的查询都会基于上面这一个数据库。
2.2.创建视图

语法:
create view 视图名 as select语句;
阐明:


[*]创建视图时会先实行select语句,然后用查询得到的效果来创建视图。
        例如下面的一个场景,当我们要查询每个员工及其对应的部分名称时,需要使用员工表和部分表进行多表查询,并筛选出员工的部分号便是部分的部分号的记载。如下:
select ename, dname from emp inner join dept on emp.deptno=dept.deptno;
         当您实行这个查询时,数据库会查找emp表和dept表中所有deptno字段值相匹配的行,并返回这些行的ename和dname字段值。
        例如,假如emp表中有一个员工其deptno为10,而dept表中有一个部分其deptno也为10,那么这个员工的名字和该部分的名字就会被一起返回作为查询效果的一部分。
 https://i-blog.csdnimg.cn/direct/a40da986677d4540a677b2b8dde394ed.png 
 假如该查询效果会被频仍用到,那我们就可以给上述查询效果创建视图,如许我们以后就可以直接访问该视图,而不用每次都先对表进行内连接,然后进行筛选。
create view v_ename_dname as select ename, dname from emp inner join dept on emp.deptno=dept.deptno;

 这是是一个创建视图的命令,该视图名为v_ename_dname,它基于emp(员工)表和dept(部分)表的INNER JOIN效果。这个视图将展示每个员工的名字(ename)和他们所属部分的名字(dname)。
 https://i-blog.csdnimg.cn/direct/02c89c2fffc04c8f8814551f35965379.png 
然后我们可以通过show tables命令就能看到这个视图。如下:
show tables;   https://i-blog.csdnimg.cn/direct/71ae553862f54957a874082459e0679a.png 
创建了这张v_ename_dname视图后,我们就可以直接通过查询视图,来检察每个员工及其对应的部分名称了。如下:
select * from v_ename_dname;
https://i-blog.csdnimg.cn/direct/317af8b35d7548eca0ce955c8cdcc4b0.png 
3.视图与基表的相互影响

3.1.修改视图影响基表

例如下面我们要在视图中修改员工SMITH的名称为小写:
update v_ename_dname set ename='smith' where ename='SMITH';
https://i-blog.csdnimg.cn/direct/675c16c3024c4d50ba89f40c0e8b14bd.png
 然后我们现在去emp表中检察这个更改是否见效了。
select * from emp;
https://i-blog.csdnimg.cn/direct/1d607dc512f149bb9364d9b100f9a275.png
 确实见效了,阐明修改视图会影响基表!
3.2.修改基表影响视图

参看部分表:
select * from dept; https://i-blog.csdnimg.cn/direct/a291eceec9524c88b11c8b3a55c6d1cd.png
假设我们现在要将accounting部分改为HR部分。
update dept set dname='HR' where deptno=10;
https://i-blog.csdnimg.cn/direct/a5c92c79fdbe4cc88493181782f857f8.png
然后我们检察视图v_ename_dname:
select * from v_ename_dname;
https://i-blog.csdnimg.cn/direct/37acde61c00f4db28559464708f90a91.png
发现视图中的数据被改变了!阐明修改基表会影响视图。
4.删除视图

删除视图的SQL如下:
DROP VIEW view_name;
比如将刚才创建的视图删除后,在数据库中就看不到这个视图了。如下:
drop view v_ename_dname; https://i-blog.csdnimg.cn/direct/f91574be8e594a65b832cf6c88400539.png
 5.关于视图


[*]命名唯一性:

[*]与普通表一样,每个视图在数据库中都必须有唯一的名称。这意味着您不能有两个同名的视图,也不能有一个视图和一个表具有相同的名称(在同一个数据库模式下)。

[*]视图数量:

[*]理论上,您可以创建任意数量的视图,但需要注意数据库的性能和资源限定。复杂的视图大概会增加查询处理的开销,特殊是在涉及大量数据或复杂连接时。

[*]索引和触发器:

[*]视图本身不支持索引。您不能在视图上直接创建索引,由于视图是基于查询界说的,不存储现实数据。
[*]同样,视图也不能有触发器与之关联。触发器是相应表上的特定变乱(如INSERT、UPDATE或DELETE)而自动实行的存储程序。由于视图不直接存储数据,因此无法在其上界说触发器。

[*]安全性:

[*]视图提供了一种进步数据访问安全性的方法。通过创建仅包罗用户需要访问的字段和行的视图,您可以限定用户对底层表的直接访问。用户只能看到视图界说的内容,而不能看到或修改其他数据。
[*]要访问视图,用户必须具有充足的权限。这意味着数据库管理员可以控制哪些用户可以检察或修改视图中的数据。

[*]ORDER BY子句:

[*]在创建视图时,您可以使用ORDER BY子句来指定视图中行的排序方式。然而,需要注意的是,当从该视图检索数据时,假如查询中也包罗ORDER BY子句,那么视图中的排序将被覆盖,以查询中的排序为准。
[*]现实上,在视图中使用ORDER BY子句通常是不推荐的,由于视图的目标是提供一种数据访问的抽象层,而不是对数据进行排序。排序应该在最终查询中根据需要进行。

[*]视图与普通表一起使用:

[*]视图可以像普通表一样在查询中使用。您可以对视图进行单表查询,也可以将视图与其他表或视图进行连接(内连接、外连接等)。
[*]这使得视图成为一种非常强盛的工具,可以简化复杂查询的编写和维护。通过创建视图来封装复杂的查询逻辑,您可以使数据库的使用更加直观和方便。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】视图