2.使用视图有下列优点:
(1)为用户集中数据,简化用户的数据查询和处理。有时用户所需要的数据分散在多个表中,定义视图可将它们集中在一起,从而方便用户的数据查询和处理。
(2)屏蔽数据库的复杂性。用户不必了解复杂的数据库中的表结构,并且数据库表的更改也不影响用户对数据库的使用。
(3)简化用户权限的管理。只需授予用户使用视图的权限,而不必指定用户只能使用表的特定列,也增加了安全性。
(4)便于数据共享。各用户不必都定义和存储自己所需的数据,可共享数据库的数据,这样同样的数据只需存储一次。
(5)可以重新组织数据以便输出到其他应用程序中。
3. 使用create view语句创建视图
语法格式:
CREATE [re replace] [algorithm = {undefined | merge |temptable}] view 视图名[(column_list)]
as select_statement [with[cascaded| local] check option]
例:create view v_view as select * from tablename;
(tablename为表名)
说明:
● column_list:要想为视图的列定义明确的名称,可使用可选的column_list子句,列出由逗号隔开的列名。column_list中的名称数目必须等于SELECT语句检索的列数。若使用与源表或视图中相同的列名时可以省略column_list。
● or replace:给定了OR REPLACE子句,语句能够替换已有的同名视图。
● algorithm子句:可选的ALGORITHM子句是对标准SQL的MySQL扩展,规定了MySQL的算法,算法会影响MySQL处理视图的方式。ALGORITHM可取3个值:MERGE、TEMPTABLE或UNDEFINED。如果没有ALGORITHM子句,默认算法是UNDEFINED(未定义的)。指定了MERGE选项,会将引用视图的语句的文本与视图定义合并起来,使得视图定义的某一部分取代语句的对应部分。MERGE算法要求视图中的行和基表中的行具有一对一的关系,如果不具有该关系,必须使用临时表取而代之。指定了TEMPTABLE选项,视图的结果将被置于临时表中,然后使用它执行语句。
● select_statement:用来创建视图的SELECT语句,可在SELECT语句中查询多个表或视图。但对SELECT语句有以下的限制:
(1)定义视图的用户必须对所参照的表或视图有查询(即可执行SELECT语句)权限;
(2)不能包含FROM子句中的子查询;
(3)不能引用系统或用户变量;
(4)不能引用预处理语句参数;
(5)在定义中引用的表或视图必须存在;
(6)若引用不是当前数据库的表或视图时,要在表或视图前加上数据库的名称;
(7)在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDERBY的语句,则视图定义中的ORDER BY将被忽略。
(8)对于SELECT语句中的其他选项或子句,若视图中也包含了这些选项,则效果未定义。例如,如果在视图定义中包含LIMIT子句,而SELECT语句使用了自己的LIMIT子句,MySQL对使用哪个LIMIT未做定义。
● WITH CHECKOPTION:指出在可更新视图上所进行的修改都要符合select_statement所指定的限制条件,这样可以确保数据修改后,仍可通过视图看到修改的数据。当视图是根据另一个视图定义的时,WITH CHECKOPTION给出两个参数:LOCAL和CASCADED。它们决定了检查测试的范围。Local关键字使CHECKOPTION只对定义的视图进行检查,cascaded则会对所有视图进行检查。如果未给定任一关键字,默认值为CASCADED。
4. 注意,使用视图时,要注意下列事项:
(1)在默认情况下,将在当前数据库创建新视图。要想在给定数据库中明确创建视图,创建时,应将名称指定为db_name.view_name。
(2)视图的命名必须遵循标志符命名规则,不能与表同名,且对每个用户视图名必须是唯一的,即对不同用户,即使是定义相同的视图,也必须使用不同的名字。
(3)不能把规则、默认值或触发器与视图相关联。
(4)不能在视图上建立任何索引,包括全文索引。
5.例1:假设当前数据库是TEST,创建XSCJ数据库上的CS_KC视图,包括计算机专业各学生的学号、其选修的课程号及成绩。要保证对该视图的修改都要符合专业名为计算机这个条件。
CREATEOR REPLACE VIEW XSCJ.CS_KC
AS SELECT XS.学号,课程号,成绩
FROMXSCJ.XS, XSCJ.XS_KC
WHERE XS.学号= XS_KC.学号AND XS.专业名='计算机' WITH CHECK OPTION;