5.1.2 视图的创建与管理
视图不是实体的数据表,但却可以把相关联的表的数据汇集到一个“表”中,可以一次查出所需数据,并且操作方便,就像从一个表中查出数据一样。
1.创建视图的语法格式
通过该语句可以创建视图,其中若给定了[or replace],则表示当已存在同名的视图时,将覆盖原视图。
语法说明:
algorithm:表示视图选择的算法(可选参数)。
undefined:MySQL将自动选择所要使用的算法。
merge:将视图的语句与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。
temptable:将视图的结果存入临时表,然后使用临时表执行语句。
字段列表:使用可选的字段列表为视图定义明确的字段名称,在字段列表中使用逗号隔开字段名,字段名称数目必须等于select语句检索的列数。若使用与源表或视图中相同的字段名,则可以省略字段列表。
查询语句:这个查询语句可从表或其他的视图中查询所需数据。
视图属于数据库,因此需要指定数据库的名称,若未指定,表示在当前的数据库创建新视图。
创建视图时,最好加上with[cascaded|local]check option参数,这种方式比较严格,可以保证数据的安全性。
表和视图共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且视图的字段名也不能重复。
【例5.1】在empMIS数据库中创建一个名为v_employee的视图,该视图显示employees表中员工编号是3开头的员工信息,包含eno、ename、ejob三列数据。
代码如下:
创建成功后,使用查询语句检查视图中包含的数据。
创建视图注意事项:
①运行创建视图的语句需要用户具有创建视图(create view)的权限,若加了[or replace],还需要用户具有删除视图(drop view)的权限;
②select语句不能包含from子句中的子查询;
③select语句不能引用系统或用户变量;
④select语句不能引用预处理语句参数;
⑤在存储子程序内,定义不能引用子程序参数或局部变量;
⑥在定义中引用的表或视图必须存在;
⑦在定义中不能引用临时表,不能创建临时视图;
⑧不能将触发程序与视图关联在一起;
⑨在视图定义中允许使用order by子句,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的子句,它将被忽略。
2.查看视图
在MySQL中,show tables不仅可以用于查看当前数据库中存在的所有数据表,同时也可以查看到当前数据库中存在的所有视图。
不过,如果仅仅使用show tables语句,在输出结果中,根本无法区分到底哪些是视图,哪些才是真实的数据表(当然,视图的命名可以统一约定以“v_”开头)。此时,需要使用命令show full tables,该命令可以列出额外的table_type列。如果对应输出行上该列的值为“view”,则表示这是一个视图。
当通过上述命令找到所需要的视图之后,可以使用如下命令查看创建该视图的详细语句:
例如,使用该命令查看创建视图v_employee的SQL语句:
3.修改视图
修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。MySQL中通过create or replace view语句或alter语句来修改视图。
MySQL中使用create or replace view语句修改视图,语法如下:
可以看到,修改视图的语句和创建视图的语句是完全一样的。当视图已经存在时,修改语句对视图进行修改;当视图不存在时,创建视图。
【例5.2】修改视图v_employee,显示所有员工信息。
代码如下:
首先通过desc查看更改之前的视图:
执行修改视图语句后,查看修改后的视图,语句如下:
从执行的结果来看,相比原来的视图,新的视图多了很多字段。
alter语句是MySQL提供的另外一种修改视图的方法,语法如下:
该语句用于更改已有视图的定义,其语法与createview类似。
【例5.3】使用alter语句修改视图v_employee,视图显示employees表中员工编号是3开头的员工信息,包含eno、ename两列数据。
代码如下:
通过alter语句同样可以达到修改视图的目的,从上面执行过程来看,视图v_employee只剩下eno、ename两个字段,修改成功。
4.删除视图
在MySQL中删除视图的方法非常简单,其详细语法如下:
其中,关键字ifexists用于防止因视图不存在而提示出错,此时,只有存在该视图,才会执行删除操作。dropview语句可以一次性删除多个视图,只需要在多个视图名称之间以英文逗号隔开即可。如果多个视图存在于不同的数据库中,视图名称之前还必须加上数据库名字作为前缀,如删除视图[数据库名.]v_employee。
注意,视图可以和基本表一样被查询,但是利用视图进行数据增、删、改操作,会受到一定的限制。以下类型视图不可以使用语句修改基本表数据。
①由两个以上的基本表导出的视图。
②视图的字段来自字段表达式函数。
③视图定义中有嵌套查询。
④在一个不允许更新的视图上定义的视图。