视图是一个或从多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户可以不看整个数据库表中的数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。
为什么要使用视图
对我个人而言来时,比如大学生在学校里参加期末考试,最终的学生考试的成绩一般都是老师在网上上传成绩,学生是无法改的而且只能看到自己的成绩别人的成绩是不知道的,学生看到的表就是视图。
为了提高复杂的SQL语句的复用性和表的操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储数据值的形式存在,行和列数据来自定义视图的查询所引用的基本表,并且在具体引用视图时动态生成。
视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务。这样程序员只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高数据库中数据的安全性。
创建视图
虽然视图可以被看成是一种虚拟表,但是其物理上是不存在的,即MySQL并没有专门的位置为视图存储数据,根据视图的概念可以发现其数据来源于查询语句,因此创建视图的基本语法如下:
CREATE[OR REPLACE] VIEW viewname[columnlist]AS SELECT statement;
其中,CREATE表示创建新的视图。REPLACE表示替换已经创建的视图。viewname为视图的名称。columnlist为属性列。select statement表示SELECT语句。
注意:创建视图需要登录用户有相应的权限,查看权限方法如下:
mysql> select user,Select_priv,Create_view_priv from mysql.user; #查看权限
这样就代表可以。
在单表上创建视图
代码示例:
mysql> create table class(id int,name varchar(64),private varchar(64)); #创建表
mysql> create view view_class as select id,name from class; #创建视图
mysql> desc view_class; #描述视图
mysql> desc class; #描述表
这里查看了定义视图view_class里并没有表class中的private字段。
在多表上创建视图
语法如下:
CREATE[OR REPLACE] VIEW viewname[columnlist]AS SELECT statement;
其中,CREATE表示创建新的视图;REPLACE表示替换已经创建的视图;viewname为视图的名称;columnlist为属性列;SELECT statement表示SELECT语句;与单表上创建视图不同的是,SELECT子句是涉及到多表的联合查询语句。
代码示例:
mysql> create table student(class_id int ,name varchar(64)); #创建表
mysql> create view view_class_student as select student.class_id,student.name,class.name class_name from class inner join student on class.id=student.class_id; #多表上创建视图
mysql> desc student; #描述表
mysql> desc view_class_student; #描述视图
查看视图
创建完视图后,像表一样,我们经常需要查看视图信息。在MySQL中,有许多可以实现查看视图的语句,如DESCRIBE、SHOW TABLES、SHOW CREATE VIEW。如果要使用这些语句,首先要确保拥有SHOW VIEW的权限。本节将详细讲解查看视图的方法。
使用DESCRIBE|DESC语句查看视图基本信息
前面我们已经详细讲解过使用DESCRIBE语句来查看表的基本定义。因为视图也是一张表,只是这张表比较特殊,是一张虚拟的表,所以同样可以使用DESCRIBE语句来查看视图的基本定义。DESCRIBE语句查看视图的语法如下:
DESCRIBE|DESC viewname;
在上述语句中,参数viewname表示要查看视图的名称。
使用SHOW TABLES语句查看视图基本信息
从MySQL5.1版本开始,执行SHOW TABLES语句不仅会显示表的名字,同时也会显示视图的名字。
下面演示通过SHOW TABLES语句查看数据库中的视图和表的功能。
代码如下:
mysql> show tables; #查看视图和表
这就是我们刚刚创建的表和视图。
使用show create view/table语句查看视图创建信息
代码示例:
mysql> show create view view_class; #查看创建视图的定义
会显示出创建视图或表时的定义信息。
更新视图数据
更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图实质是一个虚拟表,其中没有数据,通过视图更新时都是转换到基本表更新。更新视图时,只能更新权限范围内的数据,超出范围就不能更新了。
代码示例:
mysql> insert into view_class values(1,'小花'); #对视图插入数据
mysql> select*from view_class; #查看视图里的数据
mysql> update view_class set name='小花花'where name='小花'; #更新视图里的数据
mysql> select*from view_class;
mysql> delete from class where id=1; #删除视图里的数据
mysql> select*from view_class;
这是对插入,更新,删除的示例。
不能更新的情况:
①.视图中包含SUM()、COUNT()、MAX()和MIN()等函数
②.视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVING等关键字
③.视图对应的表存在没有默认值的列,而且该列没有包含在视图里
④.包含子查询的视图
⑤.其他特殊情况
修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。ALTER语句来修改视图。
使用ALTER语句修改视图
语法如下:
ALTER VIEW viewname[columnlist]AS SELECT statement;
这个语法中的所有关键字和参数除了alter外,其他都和创建视图是一样的。
代码示例:
mysql> alter view view_class as select id,name,private from class; #为view_class视图增加 private字段
mysql> desc view_class; #描述视图
删除视图
删除视图是指删除数据库中已经存在的视图。删除视图时,只能删除视图的定义,不会删除数据。
在MySQL中,可以使用DROP VIEW语句来删除视图,但是必须拥有DROP权限。删除视图的语法如下:
DROP VIEW viewname[viewname];
在上述语句中,参数viewname表示所要删除视图的名称,可同时指定删除多个视图。
代码示例:
mysql> drop view view_class,view_class_student; #删除视图
这样之前创建的两个视图就成功删除了。