PART1. 视图概述
视图是从一个或者多个表中导出的,视图的行为与表非常相似,但是试图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。视图操作方便,而且可以保障数据库系统的安全。
1. 视图的含义
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基础上定义。
视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中在存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改和删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化;同时,若基本表的数据发生变化,则这种变化也可以自动反映到视图中。
2. 视图的作用
1.简单化
看到的就是需要的。试图不仅可以简化用户对数据的理解,也可以简化它们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。
2. 安全性
通过视图用户只能查询和修改它们所能见到的数据。数据库中的其他数据则即看不见也取不到。数据库授权命令可以使每个用户对数据库的检索先知道特定的数据库对象上,但不能授权到数据库特定行和特定的列上。通过视图,用户可以被限制在数据的不同子集上:
(1)使用权限可被限制在基表的行的子集上。
(2)使用权限可被限制在基表上列的子集上。
(3)使用权限可被限制在基表的行和列的子集上。
(4)使用权限可被限制在多个基表的连接所限定的行上。
(5)使用权限可被限制在及表中的数据的统计汇总上。
(6)使用权限可被限制在另一个视图的一个子集上,或是一些视图和基表合并后的子集上。
3. 逻辑数据独立性
视图可帮助用户屏蔽真实表结构变化带来的影响。
PART2. 创建视图
视图中包含了SELECT查询的结果,因此使徒的创建基于SELECT语句和已存在的数据表。试图可以建立在一张表上,也可以建立在多张表上。
1. 创建视图的语法形式
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [()]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
2. 在单表上创建视图
MySQL可以在单个数据表上创建视图。
CREATE TABLE t (quantity INT, price INT);
INSERT INTO t VALUE(3,50);
创建视图语句为:
CREATE VIEW view_t AS SELECT quantity, price, quantity *price FROM t;
查询视图,执行如下:
默认情况下创建的视图和基本表的字段是一样的,也可以通过视图字段的名称来创建视图。
3. 在多表上创建视图
MySQL中也可以在两个或者两个以上的表上创建视图,可以使用CREATE VIEW语句实现。
create table student(s_id INT, name VARCHAR(40));
CREATE TABLE stu_info(s_id INT,glass VARCHAR(40),addr VARCHAR(90));
INSERT INTO student VALUES(1,'wanglin1'),(2,'gaoli'),(3,'zhanghai');
INSERT INTO stu_info VALUES(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong');
CREATE VIEW stu_glass (id,name,glass) AS SELECT student.s_id, student.name, stu_info.glass
FROM student ,stu_info WHERE student.s_id = stu_info.s_id;
SELECT * FROM stu_glass;
PART3. 查看视图
1. 使用DESCRIBE语句查看视图基本信息
DESCRIBE 视图名;
2. 使用SHOW TABLE STATUS语句查看视图基本信息
查看视图的信息可以通过SHOW TABLE STATUS的方法完成,具体的语法如下:
SHOW TABLE STATUS LIKE '视图名';
执行结果显示,表的说明Comment的值为VIEW,说明该表为视图,其他的信息为NULL,说明这是一个虚表。用同样的语句来查看一个数据表t的信息,执行结果如下:
从查询结果来看,这里的信息包含了存储引擎、创建时间等,comment 信息为空,这就是视图和表的区别。
3. 使用SHOW CREATE VIEW语句查看视图详情信息
SHOW CREATE VIEW 视图名;
执行结果显示视图的名称、创建视图的语句等信息。
4. 在views表中查看视图详细信息
在MySQL中,information_schema 数据库下的views表中存储了所有视图的定义,通过对views表的查询,可以查看数据库中所有视图的详细信息:
SELECT * FROM information_schema.views;
查询的结果显示当前以及定义的所有视图的详细信息,在这里也可以看到前面定义的3个名称为stu_glass、view_t 和view_t2 视图的详细信息。
PART4. 修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。
1. 使用CREATE OR REPLACE VIEW语句修改视图
CREATE [OR REPLACE] [ALGORITHM = {UNDERINED | MERGE | TEMPTABLE}]VIEW view_name [(column_list)]AS SELECT_statement[WITH [CASCADED | LOCAL] CHECK OPTION]
修改视图的语句和创建视图的语句是完全一样的。当视图已经存在时,修改语句对试图进行修改;当时图不存在时,创建视图。
2. 使用ALTER语句修改视图
ALTER [ALGORITHM = (UNDEFINED | MERGE | TEMPTABLE)]VIEW view_name [(column_list)]AS SELECT_statement[WITH [CASCADED | LOCAL] CHECK OPTION]
PART5. 更新视图
更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对其表增加或者删除记录,主要方法有:INSERT、UPDATE和DELETE。
当视图view_t2中删除price=5的记录,视图的更新操作将不能被执行:
1)视图中不包含及表中被定义为非空的列。
2)在定义视图的SELECT 语句后的字段列表中使用了数学表达式。
3)在定义视图的SELECT 语句后的字段列表中使用聚合函数。
4)在定义视图的SELECT 语句中使用了 DISTINCT、UNION、TOP、GROUP BY 或 HAVING 子句。
PART6. 删除视图
当视图不再需要时,可以将其删除。删除一个或多个视图可以使用DROP VIEW语句:
DROP VIEW [IF EXISTS]view_name [, view_name] ...[RESTRICT | CASEADE]
view_name是要删除的视图名称,可以添加多个需要删除的视图名称,各个名称之间使用逗号分隔开。删除视图必须拥有DROP权限。
— end