MySql的视图
视图是从一个或多个表中导出的表。是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库表中数据,而只关心对自己有用的数据。视图可以使用户的操作更方便,而且可以保障数据库系统的安全性。
数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中,使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。
视图是存储在数据库中的查询的sql语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,例如:员工信息表,可以用视图只显示姓名、工龄、地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。
视图的作用
对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其他数据库的一个或多个表,或者其他视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。下面将视图的作用归纳为如下几点:
1.简单性
看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化对数据的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的每次操作指定全部的条件。
2.安全性
视图的安全性可以防止未授权用户查看特定的行或列,权限用户只能看到表中特定行的方法如下:
(1)在表中增加一个标志用户名的列;
(2)建立视图,是用户只能看到标有自己用户名的行;
(3)把视图授权给其他用户。
3.逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,程序一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。视图可以在以下几个方面使程序与数据独立:
(1)如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而应用程序可以不动。
(2)如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图屏蔽应用的变化,从而使数据库表不动。
(3)如果应用建立在视图上,当数据库表发生变化时,可以在表上修改视图,通过视图屏蔽表的变化,从而应用程序可以不动。
(4)如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而数据库可以不动。
创建视图
创建视图是指在已经存在的数据库表上建立视图。视图可以建立在一张表中,也可以建立在多张表中。
创建视图需要具有CREATE VIEW的权限,同时应该具有查询涉及的列的SELECT权限。可以使用SELECT语句来查询这些权限信息,查询语法如下:
SELECT select_priv, create_view_priv FROM mysql.user WHERE user='root';
MySQL中,创建视图是通过CREATE VIEW语句实现的。其语法如下:
CREATE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}] VIEW视图名 [(属性清单)]
AS SELECT语句 WITH [CASCADED|LOCAL] CHECK OPTION;
ALGORITHM是可选参数,表示视图选择的算法;
“视图名”参数表示要创建的视图名称;
“属性清单”是可选参数,指定视图中各个属性的名词,默认情况下与SELECT语句中查询的属性相同;
SELECT语句参数是一个完整的查询语句,表示从某个表中查出某些满足条件的记录,将这些记录导入视图中;
WITH CHECK OPTION是可选参数,表示更新视图时要保证在该视图的权限范围之内。
CREATE ALGORITHM=MERGE VIEW book_view1(a_sort, a_talk, a_books, a_name) AS SELECT sort, talk, books, tb_user.name FROM tb_book, tb_user WHERE tb_book.id=tb_user.id WITH LOCAL CHECK OPTION;
创建视图时需要注意以下几点:
(1)运行创建视图的语句需要用户具有创建视图(create view)的权限,若添加了[or replace]时,还需要用户具有删除视图(drop view)的权限;
(2)select语句不能包含from子句中的子查询;
(3)select语句不能引用系统或用户变量;
(4)select语句不能引用预处理语句参数;
(5)在存储子程序内,定义不能引用子程序参数或局部变量;
(6)在定义中引用的表或视图必须存在。但是创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用check table语句;
(7)在定义中不能引用temporary表,不能创建temporary视图;
(8)在视图定义中命名的表必须已存在;
(9)不能将触发程序与视图关联在一起;
(10)在视图定义中允许使用order by,但是,如果从特定视图进行了选择,而该视图使用了具有自己order by的语句,它将被忽略。
查看视图
查看视图是指查看数据库中已存在的视图。查看视图必须要有SHOW VIEW的权限。查看视图的方法主要包括DESCRIBE语句、SHOW TABLE STATUS语句、SHOW CREATE VIEW语句等。select * from information_schema.views;
1.DESCRIBE语句
DESCRIBE可以缩写成DESC, DESC语句的格式如下:
DESCRIBE 视图名;
2.SHOW TABLE STATUS语句
在MYSQL中,可以使用SHOW TABLE STATUS语句查看视图的信息。其语法格式如下:
SHOW TABLE STATUS LIKE '视图名';
“LIKE”表示后面匹配的是字符串;
“视图名”参数指要查看的视图名称,需要用单引号定义。
3.SHOW CREATE VIEW语句
在MYSQL中,SHOW CREATE VIEW语句可以查看视图的详细定义。其语法格式如下:
SHOW CREATE VIEW 视图名
修改视图
修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER语句来修改视图。
1.CREATE OR REPLACE VIEW
在MYSQL中,CREATE OR REPLACE VIEW语句可以用来修改视图。该语句的使用非常灵活。在视图已经存在的情况下,对视图进行修改;视图不存在时,可以创建视图。CREATE OR REPLACE VIEW语句的语法如下:
CREATE OR REPLACE [ALGORITHM={UNDEFINED|MERGE|TEMPTABLE}]
VIEW视图 [(属性清单)] AS SELECT语句
WITH [CASCADED|LOCAL] CHECK OPTION;
2.ALTER
ALTER VIEW语句改变了视图的定义,包括被索引视图,但不影响所依赖的存储过程或触发器。该语句与CREATE VIEW语句有着同样的限制,如果删除并重建了一个视图,就必须重新为它分配权限。
alter view语句的语法如下:
alter view [algorithm={merge|temptable|undefined}]
view view_name [(column_list)]
as select_statement with [cascaded|local] check option;
ps:在创建视图时,在使用了WITH CHECK OPTION, WITH ENCRYPTION, WITH SCHEMABING或VIEW_METADATA选项时,如果想保留这些选项提供的功能,必须在ALTER VIEW语句中将它们包括进去。
更新视图
对视图的更新其实就是对表的更新,更新视图是指通过视图来插入(INSERT)、更新(UPDATE)和删除(DELETE)表中的数据。因为视图是一个虚拟表,其中没有数据。通过视图更新时,都是转换到基本表来更新。更新视图时,只能更新权限范围内的数据。超出了范围,就不能更新。
1.更新视图
与表的更新使用类似
2.更新视图的限制
并不是所有的视图都可以更新,以下几种情况是不能更新视图的:
(1)视图中包含COUNT()、SUM()、MAX()和MIN()等函数。例如:
CREATE VIEW book_view1(a_sort, a_book)
AS SELECT sort, books, COUNT(name)FROM tb_book;
(2)视图中包含UNION、UNION ALL、DISTINCT、GROUP BY和HAVIG等关键字。例如:
CREATE VIEW book_view1(a_sort, a_book)
AS SELECT sort, books, FROM tb_book GROUP BY id;
(3)常量视图。例如:
CREATE VIEW book_view1
AS SELECT 'Aric' as a_book;
(4)视图中的SELECT中包含子查询。例如:
CREATE VIEW book_view1(a_sort)
AS SELECT(SELECT name FROM tb_book);
(5)由不可更新的视图导出的视图。例如:
CREATE VIEW book_view1
AS SELECT*FROM book_view2;
(6)创建视图时,ALGORITHM为TEMPTABLE类型。例如:
CREATE ALGORITHM=TEMPTABLE
VIEW book_view1
AS SELECT*FROM tb_book;
(7)视图对应的表上存在没有默认值的列,而且该列没有包含在视图里。例如,表中包含的name字段没有默认值,但是视图中不包括该字段。那么这个视图是不能更新的。因为,在更新视图时,这个没有默认值的记录将没有值插入,也没有NULL值插入。数据库系统是不会允许这样的情况出现的,其会阻止这个视图更新。
上面的几种情况其实就是一种情况,规则就是,视图的数据和基本表的数据不一样了。
ps:视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,可能会造成数据更新失败。
删除视图
删除视图是指删除数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。MySQL中,可以使用DROP VIEW语句来删除视图,但是,用户必须拥有DROP权限。
DROP VIEW语句的语法如下:
DROP VIEW IF EXISTS <视图名> [RESTRICT|CASCADE]
IF EXISTS参数指判断视图是否存在,如果存在则执行,不存在则不执行;
“视图名列表”参数表示要删除的视图的名称和列表,各个视图名称之间用逗号隔开。
该语句从数据字典中删除指定的视图定义;如果该视图导出了其他视图,则使用CASCADE级联删除,或者先显式删除导出的视图,再删除该视图;删除基表时,由该基表导出的所有视图定义都必须显式删除。