一、学习任务1:为什么使用视图
通过前面章节的知识可以发现,数据库中关于数据的查询有时候非常复杂,例如表连接、子查询等,这种査询会让程序员感到非常痛苦,因为它逻辑太复杂、编写语句比较多。当这种査询需要重复使用时,则不会次次都能编写正确,从而降低了数据库的实用性。
在具体操作表前,有时候要求只能操作部分字段,而不是全部字段。例如,在公司中员工的工资一般是保密的,如果因为程序员一时疏忽向查询中多写入了关于“工资”的字段,则会让员工的 “工资”显示给所有能够查看该查询结果的人,这时就需要限制程序员操作的字段。
为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值形式存在。行和列数据来自定义视图的查询所引用基本表, 并且在具体引用视图时动态生成。
视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务。这样程序员只能看到视图中所定义的数据,而不是视图所引用表中的数据,从而提高了数据库中数据的安全性。
视图的特点如下:
• 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
• 视图是由基本表(实表)产生的表(虚表)。
• 视图的建立和删除不影响基本表。
• 对视图内容的更新(添加、删除和修改)直接影响基本表。
• 当视图来自多个基本表时,不允许添加和删除数据。
注意:MySQL数据库管理系统从5.0.1版本开始提供视图新特性。
二、学习任务2:创建视图
视图的操作包括创建视图、查看视图、删除视图和修改视图。本节将详细介绍如何创建视图。在创建视图时,首先要确保拥有CREATE VIEW的权限,并且同时确保对创建视图所引用的表也具有相应的权限。
创建视图的语法形式
虽然视图可以被看成是一种虚拟表,但是其在物理上是不存在的,即数据库管理系统没有专门的位置为视图存储数据。根据视图的概念可以发现其数据来源于查询语句,因此创建视图的语法为:
create view view_name AS查询语句;
和创建表一样,视图名不能和表名、也不能和其他的视图名重名。根据上述语法可以发现,视图的功能实际上就是封装了复杂的查询语句。
三、学习任务3:查看视图
创建完视图后,经常需要査看视图信息。那么如何在MySQL数据库管理系统中查看视图呢?查看帮助文档,可以发现有许多可以实现查看视图的语句,例如,SHOW TABLES、SHOW TABLE STATUS、SHOW CREATE VIEW—。如果要使用这些语句,首先要确保拥有SHOW VIEW的权限。
3.1 SHOW TABLES语句查看视图名
从MySQL5.1版本开始,执行SHOW TABLES语句时不仅会显示表的名字,同时也会显示出视图的名字。
下面演示通过SHOW TABLES语句查看数据库view中视图和表的功能,具体语句如下:
USE view;#选择数据库
SHOW TABLES;#查看视图
3.2 SHOW TABLE STATUS语句查看视图详细信息
与SHOW TABLE语句一样,SHOW TABLE STATUS语句不仅会显示表的详细信息,同时也会显示视图的详细信息。SHOWTABLESTATUS语句的语法如下:
SHOW TABLE STATUS 【FROM db_name】【LIKE 'pattern'】;
在上述语句中,参数db_name用来设置数据库,关键字SHOW TABLE STATUS表示将显示所设罝数据库里表和视图的详细信息。
SHOW TABLE STATUS语句返回表示表和视图各种信息的各种字段。
表 SHOW TABLE STATUS返回字段含义
字段名 | 含义 |
Name | 表和视图的名 |
Engine | 表的存储引擎 |
Version | 表的.frm文件的饭本号 |
Row_format | 表的行存储格式 |
Rows | 表中行的数目 |
Avg_row_length | 表中行平均行长度 |
Dala_length | 表数据文件的长度 |
Max_data_length | 表数据文件的最大长度 |
Index_length | 表索引文件的长度 |
Data_free | 表被整序后,但是未使用的宇节的数目 |
Auto_increment | 表中下一个Auto_increment值 |
Create_time | 表的创建时间 |
Update_time | 表的最后一次更新时间 |
Check_time | 表的最后一次检査时间 |
Collation | 表的字符集 |
Checksum | 表的活性校验 |
Create_options | 表的额外选项 |
Comment | 表的注解 |
3.3 SHOW CREATE VIEW语句查看视图定义信息
如果想査看关于视图的定义信息,可以通过语句SHOW CREATE VIEW来实现。SHOW CREATE VIEW语句的语法如下:
SHOW CREATE VIEW viewname;
在上述语句中,viewname参数表示所要査看定义信息的视图名称。
3.4 DESCRIBE|DESC语句查看视图定义信息
如果想査看关于视图的设计信息,可以通过语句DESCRIBE或DESC来实现。DESCRIBE和DESC语句的语法如下:
DESCRIBE | DESC viewname;
在上述语句中,viewname参数表示所要査看设计信息的视图名称。
3.5 通过系统表查看视图信息
当MySQL数据库安装成功后,会自动创建系统数据库information_schema。在该数据库中存在一个包含视图信息的表格views,可以通过查看表格views来查看所有视图的相关信息。
四、学习任务4:创建视图
视图的操作包括创建视图、查看视图、删除视图和修改视图。本节将详细介绍如何删除视图。 在删除视图时,首先要确保拥有DROP VIEW的权限。
删除视图的语法形式
通过DROP VIEW语句可以一次删除一个或者多个视图,关于删除视图的语法如下:
DROP VIEW view_name 【,view_name】 ...;
在上述语句中,view_name参数表示所要删除视图的名称。
五、学习任务5:修改视图
对于已经创建好的视图,当使用一段时间后,就会需要进行一些结构上的修改,即视图的修改操作。除了可以使用ALTER语句实现修改视图外,还可以通过CREATE OR REPLACE VIEW语句来修改视图。
5.1 CREATE OR REPLACE VIEW语句修改视图
对于已经创建好的表,尤其是已经有大量数据的表。通过先删除,然后再按照新的表定义重建表方式来修改表时,需要做许多额外的工作,例如数据的重新加载等。可是对于视图来说,由于其是“虚表”,并没有存储数据,所以完全可以通过该方式来修改视图。
5.2 ALTER语句修改视图
与修改表一样,ALTER语句也可以修改视图,修改视图的语法如下:
ALTER VIEW viewname as查询语句;
在上述语句中,参数viewname用来设置修改视图的名称。
六、学习任务6:利用视图操作基本表
在MySQL中可以通过视图检索基本表数据,这是视图最基本的应用,除此之外还可以通过视图修改基本表中的数据。
6.1检索(查询)数据
通过视图査询数据,与通过表进行査询完全相同,只不过通过视图査询比表更安全、更简单、实用。在具体实现时,只需把表名换成视图名即可。
6.2利用视图操作基本表数据
通过前面章节的知识可以知道,不仅可以对视图进行查询数据,而且还可以对视图进行更新(增加、删除和更新)数据操作。由于视图是“虚表”,所以对视图数据进行的更新操作,实际上是对其基本表数据进行更新操作。在具体更新视图数据时,需要注意以下两点:
•对视图数据进行添加、删除和更新操作直接影响基本表。
•视图来自多个基本表时,不允许添加和删除数据。