视图是从一个或者多个表中导出来的表,是一种虚拟存在的表,视图就像一个窗口,通过它可以看到系统专门提供的数据。 视图可以使用户的操作方便,保证并且数据库系统的安全。 内容: 视图的作用 创建视图 查看视图 修改视图 更新视图 删除视图 视图简介视图从已经存在的表中导出,还可以从已经存在的视图导出,数据库只保存视图的定义,而没有存放视图的数据。视图的数据还是保存在原来的表中。视图的数据依赖于原来的表,一旦原来的表发生改变,视图的数据也相应变化。 如果需要经常查询多个表的制定字段的数据,可以在这些表上建立一个视图 MySQL的视图不支持输入参数的功能。 视图的作用:可以起到筛选器的作用,那些对用户没有用或者用户没有权限了解的信息可以直接屏蔽掉,归纳为: 使操作简化,增加数据的安全性,提高表的逻辑独立性 创建视图mysql通过create view实现创建视图,语法: create [algorithm={undifined|merge|temptable}] view view_name [(properties)] as select * [with [CASCADED|LOCAL] check option]; 解析: algorithm是可选参数,表示视图选择的算法,undefined表示mysql自动选择算法,merge表示将使用视图的语句与视图定义合并,使视图的定义部分取代语句的对应部分,temptable表示视图的结构保存到临时表,然后使用临时表执行语句。 view_name表示要创建的视图的名字。 properties是可选参数,指定视图中各属性的名词,默认与select中查询的相同。 select是一个完整的查询语句从某个表中查询某些满足条件的记录并导入视图中。 with check option是可选参数,表示更新视图是要保证在视图的权限范围之内。 最好使用with cascaded check option参数 权限查询:在mysql数据库的user表中保存着权限信息,使用如下语句查询 select select_priv, create_view_priv from mysql.user whrer user='username'; 其中‘username’是数据库用户的用户名。 查询结果: mysql> select select_priv, create_view_priv from mysql.user where user = 'root'; +-------------+------------------+ | select_priv | create_view_priv | +-------------+------------------+ | Y | Y | | Y | Y | +-------------+------------------+ 2 rows in set (0.09 sec) 在单表创建视图: mysql> use login; Database changed mysql> select * from login; +-----+----------+----------------------------------+ | uid | username | password | +-----+----------+----------------------------------+ | 1 | test | 098f6bcd4621d373cade4e832627b4f6 | | 2 | test1 | 5a105e8b9d40e1329780d62ea2265d8a | | 3 | test2 | ad0234829205b9033196ba818f7a872b | | 4 | user | ee11cbb19052e40b07aac0ca060c23ee | | 5 | testk | f2fc2720249d97db37e2a5a3330baa4e | +-----+----------+----------------------------------+ 5 rows in set (0.05 sec) mysql> create view login_view as select * from login where uid >= 2 and uid <=4; Query OK, 0 rows affected (0.12 sec) mysql> desc login_view; +----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+-------+ | uid | int(11) | NO | | 0 | | | username | varchar(32) | NO | | NULL | | | password | varchar(32) | NO | | NULL | | +----------+-------------+------+-----+---------+-------+ 3 rows in set (0.07 sec) mysql> select * from login_view; +-----+----------+----------------------------------+ | uid | username | password | +-----+----------+----------------------------------+ | 2 | test1 | 5a105e8b9d40e1329780d62ea2265d8a | | 3 | test2 | ad0234829205b9033196ba818f7a872b | | 4 | user | ee11cbb19052e40b07aac0ca060c23ee | +-----+----------+----------------------------------+ 3 rows in set (0.04 sec)
查看视图1:使用desc语句 2:show table status语句查询视图基本信息。 show table status like 'view_name';
mysql> show table status like 'login_view' \G; *************************** 1. row *************************** Name: login_view Engine: NULL Version: NULL Row_format: NULL Rows: NULL Avg_row_length: NULL Data_length: NULL Max_data_length: NULL Index_length: NULL Data_free: NULL Auto_increment: NULL Create_time: NULL Update_time: NULL Check_time: NULL Collation: NULL Checksum: NULL Create_options: NULL Comment: VIEW
mysql> show table status like 'login' \G; *************************** 1. row *************************** Name: login Engine: InnoDB Version: 10 Row_format: Compact Rows: 5 Avg_row_length: 3276 Data_length: 16384 Max_data_length: 0 Index_length: 16384 Data_free: 7340032 Auto_increment: 6 Create_time: 2012-10-28 18:28:57 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.01 sec)
mysql> show create view login_view \G; *************************** 1. row *************************** View: login_view Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIE W `login_view` AS select `login`.`uid` AS `uid`,`login`.`username` AS `username`,`login`.`password` AS `password` from `login` where ((`login`.`uid` >= 2) and (`login`.`uid` <= 4)) character_set_client: gbk collation_connection: gbk_chinese_ci 1 row in set (0.00 sec)
select * from information_schema.views \G; information_schema是mysql自带的一个数据库。查询结果如下: mysql> select * from information_schema.views \G; *************************** 1. row *************************** TABLE_CATALOG: def TABLE_SCHEMA: login TABLE_NAME: login_view VIEW_DEFINITION: select `login`.`login`.`uid` AS `uid`,`login`.`login`.`username` AS `username` ,`login`.`login`.`password` AS `password` from `login`.`login` where ((`login`.`login`.`uid` >= 2) a nd (`login`.`login`.`uid` <= 4)) CHECK_OPTION: NONE IS_UPDATABLE: YES DEFINER: root@localhost SECURITY_TYPE: DEFINER CHARACTER_SET_CLIENT: gbk COLLATION_CONNECTION: gbk_chinese_ci 1 row in set (0.10 sec) 修改视图create or replace view语句与alter语句修改 1.create or replace view 语法:
create or replace [algorithm={undefined|merge|temptable}] view view_name [(propertise)] as selecte * [with [cascaded|local] check option]; 有点像create view,create or replace在视图不存在的情况下创建视图,视图已存在则修改视图。 2.alter语句 alter [algorithm={undefined|merge|temptable}] view view_name [(propertise)] as selecte * [with [cascaded|local] check option]; 参数和create view相同。 更新视图update,注意不要写成updata。 语法:update view_name set property_1=a[, property_2=b..]; 注意:更新会修改源表,而不只是修改视图,因为视图没有存储,实际操作都是针对源表。主键字段不能update。update会修改视图中的所有数据。 不能更新视图的情况
删除视图删除视图时只删除视图的定义,而不删除视图源表的数据。 语法: drop view [if exits] view_name_list [restrict|cascad]; 解析: if exits判断视图是否存在,存在则执行删除,不存在则不执行。 可以一次删除多个视图。 mysql> drop view if exits login_view; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'exits login_view' at line 1 mysql> drop view if exists login_view; Query OK, 0 rows affected (0.00 sec) mysql> desc login_view; ERROR 1146 (42S02): Table 'login.login_view' doesn't exist 删除视图需要权限允许。查看是否有删除权限的命令: select Drop_priv from mysql.user where user='username'; 结果为: mysql> select drop_priv from mysql.user where user = 'root'; +-----------+ | drop_priv | +-----------+ | Y | | Y | +-----------+ 2 rows in set (0.00 sec)
|
|