视图
视图是一种虚拟存在的表,对于使用视图的用户来说基本是透明的。
视图相对于普通表的优势:
1. 简单:使用视图的用户完全不需要关心后面对应的表的结构,关联条件和筛选条件,对用户来说已经是 过滤好的符合条件的结果集。
2. 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个 列,但是通过视图就可简单地实现。
3. 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响; 源表修改列名,则可以通过修改视图来解决,不会造成对访问的影响。
视图操作
创建或修改视图:
创建视图的语法:
CREATE
[OR REPLACE]
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
修改视图的语法:
ALTER
[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
范例:
-- 创建或更新视图
mysql> CREATE OR REPLACE VIEW city_list_view AS
-> SELECT id, city FROM city;
Query OK, 0 rows affected (0.07 sec)
MySQL视图定义有一些限制:
1. FROM关键字后面不能包含子查询。
2. 包含以下关键字的SQL语句:聚合函数(SUM, MIN,MAX,COUNT等),(DISTINCT, GROUP BY,HAVING, UNION, UNION ALL)。
3. 常量视图。
4. SELECT中包含子查询。
5. JOIN。
6. FROM一个不能更新的视图。
7. WHERE子句的子查询引用了FROM子句中的表。
对于WITH [CASCADED|LOCAL] CHECK OPTION:
1. LOCAL是只要满足本视图的条件就可以更新;
2. CASCADED则是必须满足所有针对该视图的所有视图的条件才可以更新。如,
删除视图
删除视图语法:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
mysql> drop view city_list_view;
Query OK, 0 rows affected (0.00 sec)
查看视图
-- MySQL5.1后, show tables也会列出视图
mysql> show tables;
+---------------------+
| Tables_in_mysqltest |
+---------------------+
| blob_test |
| city |
| city_list_view1 |
| city_list_view2 |
| city_list_view3 |
+---------------------+
5 rows in set (0.00 sec)
-- 模糊查询视图
mysql> show table status like 'city_list%' \G 具体视图相关的细节可参考:
不吝指正。