视图的概念:
视图是一张虚拟的表,是从数据库中一个或多个表中导出来的表;视图是不存在物理数据的;使用视图查询时,数据来源于数据库原表中的数据。具有普通表的结构,但是不实现数据存储。
视图的作用:
1.操作简便化:我们可以建立一些简单的视图,所见即所得。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
2.增加数据的安全性:比如写代码时使用视图,不直接操作数据库表。可能原数据库表中的某些字段有很重要的信息,我们不对外公开,使用视图可以屏蔽掉不使用,只能操作可见到的数据,这样数据更加安全。
3.提高表的逻辑独立性:视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
视图的缺点:
1.性能开销大:
数据库必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
2.修改限制:
当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的视图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。
参考表数据:
视图的创建:
这样,我们就创建好了一个视图:
下面我们来使用一下这个视图:
--从视图中检索数据,执行:
SELECT * FROM v1;
-- 定义一个只有书名和价格字段的视图:
create view v2 as select bookName,price from t_book;
--从v2视图中检索数据:
select * from v2;
这样只能检索到相关的列 保证了数据的安全性和独立性
你认为这样很安全吗?字段名还是被开发人员给看到了 我们可以给视图中的列单独取名字:
--创建单表视图(自定义列名):
create view v3(自定义的名字,p) as select bookName,price from t_book;
-- 执行:
select * from v3;
--结果:
--多表上创建视图:
create view v4 as select t1.bookName,t2.bookTypeName from t_book t1,t_booktype t2 WHERE t1.bookTypeId=t2.id;
--检索数据:
SELECT * FROM v4;
--结果:
查看视图:
1. DESCRIBE 语句查看视图基本信息
执行语句: DESCRIBE v4;
或者省略写法: DESC v4;
2.SHOW TABLE STATUS 语句查看视图基本信息:
执行语句:SHOW TABLE STATUS LIKE 'v4' 可以看到最后comment是View
可以对比执行:SHOW TABLE STATUS LIKE '表名' 看看 有什么不同
3.SHOW CREATE VIEW 语句查看视图详细信息
执行语句:SHOW CREATE VIEW v4
4.在 views 表中查看视图详细信息:
系统库中有一张VIEW表:
修改视图:是指修改数据库中,存在的视图的定义
比如,当基本表中的某些字段发生变化时,可以通过修改使徒的方式,来保持视图与基本表的一致性1.用 CREATE OR REPLACE VIEW 语句修改视图
我们把之前建立的V1 视图 改为只有bookName和price 两个字段:
执行语句:CREATE OR REPLACE VIEW v1(bookName,price) AS SELECT bookName,price FROM t_book
用这个命令时视图存在就修改,不存在就创建;
2. 用 ALTER 语句修改视图
ALTER VIEW v1 AS SELECT * FROM t_book
更新视图:更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟的表,其中没有数据。通过视图更新时,都是转换基本表来更新。更新视图时,只能更新权限范围内的数据。
超出了范围,就不能更新。
插入(INSERT):
INSERT INTO v1 VALUES(NULL,'java good','120','fang',1);
更新(UPDATE)
UPDATE v1 SET bookName='java very good',price=200 WHERE id=5;
删除(DELETE)
DELETE FROM v1 WHERE id=5;
删除视图:删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据;
删除V4视图:
DROP VIEW IF EXISTS v4;