MySQL视图示例
什么是视图?视图是干什么用的?
视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。 通过视图,可以展现基表的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。基表:用来创建视图的表叫做基表base table.
为什么要使用视图?
. 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。 . 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。 . 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
如何创建视图
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
. OR REPLACE:表示替换已有视图 . ALGORITHM:表示视图选择算法,默认算法是UNDEFINED(未定义的):MySQL自动选择要使用的算法 ;merge合并;temptable临时表 . columnlist:视图字段,显示指定视图列名,要求视图名后面的列的数量必须匹配select子句中的列的数量。 . selectstatement:表示select语句 . [WITH [CASCADED | LOCAL] CHECK OPTION]:表示视图在更新时保证在视图的权限范围之内 . cascade是默认值,表示更新视图的时候,要满足视图和表的相关条件 . local表示更新视图的时候,要满足该视图定义的一个条件即可推荐使用WHIT [CASCADED|LOCAL] CHECK OPTION选项,可以保证数据的安全性.
查看视图内部结构
show create view 视图名;
删除视图
drop view 视图名;
如何查看库中的视图
. 第一种方式
mysql> show table status where comment='view';
(说明:Mysql5.1支持视图,视图被看作一种抽象表,因此显示视图状态的语句与显示表状态的语句相同,只是在comment列中以‘view’区分) . 第二种方式
mysql> select * from information_schema.tables where
table_schema='你当前的数据库名' and table_type='view';
(说明:这种方法通过系统表查找,效果同上,显示信息更详细。如果不能正确显示结果,可能是大小写的问题,Mysql在不同系统平台不同配置参数下的显示结果可能不同,注意这点。)
视图更新限制
. 视图中如果包含了group by、union等有关的聚合函数,此时视图是不能做更新操作的. . 视图中如果出现了关联多表的sql语句,此时修改的字段必须来源同一个基表. . 视图如果在定义的时候,使用了临时表的算法是无法进行更新操作.
视图的限制
. 视图中无法创建索引 . 视图中无法创建触发器 . 视图中不支持物化视图(不过可以自定义物化视图或者使用一个mysql管理工具实现flexview(https://github.com/greenlion/swanhart-tools),这个工具还在研究中,后期单独写一篇文章来讲解MySQL如何实现物化视图) . 无法保存视图定义的sql语句
使用演示
mysql> create view v_user
-> as
-> select * from user
-> with check option;
mysql> select * from v_user;
+----+--------+-----+------+
| id | name | age | sex |
+----+--------+-----+------+
| 1 | 张三 | 12 | 男 |
| 2 | 小红 | 10 | 女 |
| 3 | 李倩 | 12 | 女 |
+----+--------+-----+------+
3 rows in set (0.00 sec)
mysql> show create view v_userG;
*************************** 1. row ***************************
View: v_user
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_user` AS select `user`.`id` AS `id`,`user`.`name` AS `name`,`user`.`age` AS `age`,`user`.`sex` AS `sex` from `user` WITH CASCADED CHECK OPTION
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
mysql> drop view v_user;
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- php 使用 __call实现重载功能示例
- laravel excel 上传文件保存到本地服务器功能
- PHP用swoole+websocket和redis实现web一对一聊天
- Yii框架布局文件的动态切换操作示例
- 关于laravel 子查询 & join的使用
- PHPUnit + Laravel单元测试常用技能
- php接口隔离原则实例分析
- laravel实现按月或天或小时统计mysql数据的方法
- laravel model模型处理之修改查询或修改字段时的类型格式案例
- 对laravel的session获取与存取方法详解
- php 中self,this的区别和操作方法实例分析
- Laravel使用原生sql语句并调用的方法
- Yii框架自定义数据库操作组件示例
- laravel 使用事件系统统计浏览量的实现
- PHP之多条件混合筛选功能的实现方法