视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。
基表是实际存储数据的物理表,而视图是基于查询结果定义的虚拟表,用于简化数据访问和管理,增强数据安全性和灵活性。在实际应用中,基表和视图通常结合使用
基本使用
创建视图
create view 视图名 as select语句;
案例
比如我们使用员工表,想要查看员工姓名和职位;我们之前使用表内连形成一张临时表,但是我们如果高频繁地使用员工姓名和职位的话,我们得一直内连很不方便,所以我们可以使用视图方便;
内连操作:
mysql> select ename,dname from emp inner join dept on emp.deptno=dept.deptno;
每次都是这的话太麻烦了,不妨创建视图:mysql> create view myview as select ename,dname from emp inner join dept on emp.deptno=dept.deptno;
再次查看数据库的表:发现多了视图表,可以理解为将筛选的数据重新放到一个新表里
那么此时可以对这张进行操作:
说白了myview就是把刚才select查出来的东西最终变成了临时表结构放到一个表叫做视图,好处就是未来我高频繁查员工姓名和职位的时候不用多表查询而是直接视图查询即可;他的数据都是从基表(emp,dept)来的
修改了视图,对基表数据有影响
简单粗暴直接对视图做修改:mysql> update myview set ename='smith' where ename='SMITH';
查看修改结果:发现视图表数据被修改了
我们重新查询基表emp表:发现基表也被修改了
修改了基表,对视图有影响
直接对基表dept进行数据更新:mysql> update dept set dname='sssss' where deptno=30;
查找数据:发现基表dept被修改了
那么此时看视图是否有改变:发现视图表也被修改了
删除视图
语法:drop view 视图名;
再次查看发现没有视图表了:
视图规则和限制
1. 与表一样,必须唯一命名(不能出现同名视图或表名,因为视图在数据库中被当作表不能重名)
2. 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
3. 视图不能添加索引,也不能有关联的触发器或者默认值
4. 视图可以提高安全性,必须具有足够的访问权限
5. order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖
6. 视图可以和表一起使用(视图就是表,可以做内连外联等操作)