【MySQL数据库】:MySQL视图特性

目录

视图的概念

基本使用

准备测试表

创建视图

修改视图影响基表

修改基表影响视图

删除视图

视图规则和限制


视图的概念

  • 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。
  • 视图中的数据并不会单独存储在数据库中,其数据来自定义视图时查询所引用的表(基表),在每次引用视图时动态生成。
  • 由于视图和基表用的本质是同一份数据,因此对视图的修改会影响到基表,对基表的修改也会影响到视图。

基本使用

准备测试表

下面用员工表(emp)和部门表(dept)作为测试表!

员工表(emp)中包含如下字段:

  • 雇员编号(empno)
  • 雇员姓名(ename)
  • 雇员职位(job)
  • 雇员领导编号(mgr)
  • 雇佣时间(hiredate)
  • 工资月薪(sal)
  • 奖金(comm)
  • 部门编号(deptno)

部门表(dept)中包含如下字段:

  • 部门编号(deptno)
  • 部门名称(dname)
  • 部门所在地点(loc)

创建视图

复制代码
CREATE VIEW view_name AS SELECT ...;
创建视图时会先执行select语句,然后用查询得到的结果来创建视图

当我们要查询每个员工及其对应的部门名称 时,需要使用员工表(emp) 和 **部门表(dept)**进行多表查询,并筛选出员工的部门号等于部门的部门号的记录。

复制代码
select ename, dname from emp,dept where emp.deptno=dept.deptno;

如果该查询结果会被频繁用到,那我们就可以给上述查询结果创建视图,创建完毕后通过show命令就能看到这个视图。

复制代码
create view v_ename_dname as 
select ename, dname from emp,dept where emp.deptno=dept.deptno;

并且在数据库对应的目录下,会增加一个对应的xxx.frm文件,但并没有与之对应的xxx.ibd文件,这也证明了视图和基表使用的是同一份数据。

创建视图后就可以直接通过查询视图,来查看每个员工及其对应的部门名称了。

复制代码
select * from v_ename_dname;

修改视图影响基表

通过查询员工表(emp) ,可以看到员工CLARK所在部门的部门号为10

复制代码
select * from emp where ename='CLARK';

查询部门表(dept),可以看到10号部门的部门名称为ACCOUNTING

复制代码
select * from dept where deptno=10;

在视图中将员工CLARK的名字改为TEST后,会看到在**员工表(emp)**中的员工CLARK的名字也被改为TEST

复制代码
update v_ename_dname set ename='TEST' where ename='CLARK';
select * from emp where ename='CLARK';
select * from emp where ename='TEST';

根本原因就是因为视图和基表 使用的是同一份数据,将视图中员工CLARK的名字改为TEST后**员工表(emp)**中的员工CLARK的名字也被改为TEST!!!

修改基表影响视图

通过查询员工表(emp) ,可以看到员工JAMES所在部门的部门号为30。

复制代码
select * from emp where ename='JAMES';

30号部门的部门名为SALES,因此查询视图时可以看到JAMES所在的部门名为SALES。

复制代码
select * from v_ename_dname where ename='JAMES';

现在将**员工表(emp)**中,员工JAMES对应的部门号改为10。

复制代码
update emp set deptno=10 where ename='JAMES';
select * from v_ename_dname where ename='JAMES';

修改后再查询视图,就会发现JAMES所在部门的部门名,变成了10号部门的部门ACCOUNTING

复制代码
select * from v_ename_dname where ename='JAMES';

删除视图

复制代码
DROP VIEW view_name;

比如将刚才创建的**视图(v_ename_dname )**删除后,在数据库中就看不到这个视图了

复制代码
drop view v_ename_dname;

并且该视图(v_ename_dname ) 在数据库目录下对应的xxx.frm文件也会被删除。

视图规则和限制

  • 视图与普通表一样,视图的命名也必须是唯一的,不能出现同名视图或表名。
  • 创建视图的数目无限制,但要考虑复杂查询创建为视图之后的性能影响。
  • 视图不能添加索引,也不能有关联的触发器或者默认值。
  • 视图可以提高安全性,在访问视图时必须具有足够的访问权限。
  • 创建视图时可以使用order by子句,但如果从该视图检索数据时也含有order by子句,那么该视图中的order by将被覆盖。
  • 视图可以和普通表一起使用,比如进行多表查询,内外连接等。
相关推荐
betazhou1 小时前
Oracle ADG ,DGBroker管理,异常断电重启主备库的状态
数据库·oracle·goldengate·dgbroker
岁岁岁平安1 小时前
本机 MongoDB 注册系统服务、启用security认证
数据库·python·mongodb
007php0071 小时前
某游戏互联网大厂Java面试深度解析:Java基础与性能优化(一)
java·数据库·面试·职场和发展·性能优化·golang·php
数据库生产实战1 小时前
Oracle RAC灾备环境UNDO表空间管理终极指南:解决备库修改难题与性能优化实战
数据库·oracle·性能优化
姚远Oracle ACE2 小时前
Oracle AWR案例分析:精准定位SQL执行计划切换的时间点
数据库·sql·oracle
凉栀お_2 小时前
MySQL第四次作业(索引、视图)
数据库·mysql
睡前要喝豆奶粉2 小时前
.NET Core Web API中数据库相关配置
数据库·c#·.netcore
大G的笔记本3 小时前
高频 Redis 面试题答案解析
数据库·redis·缓存
万事大吉CC3 小时前
SQL语法基础教程
数据库·oracle
betazhou4 小时前
Oracle dgbroker常规命令管理简介
数据库·oracle·adg·dbbroker