首页 > 代码库 > Mysql--视图
Mysql--视图
使用视图的意义
在表上查询与在视图上查询语句是一样的。但是,视图是一种更加安全、灵活的方式。
安全:可以将用户权限与视图绑定(grant语句可以对视图进行授予权限)。
灵活: 可以根据在表C上建立A、B视图来支持对大表C上的部分查询。而不需要单独再建立一个A表和B表。
创建视图
视图是对原真实表的一种引用。我们可以通过视图来操作真实表。视图就是一张表,虚拟表!所以创建视图的时候可能会出现重名。
看一个例子,创建一个表‘result’:
CREATE TABLE `result` (`MATH_NO` INT(10) NOT NULL unsigned AUTO_INCREMENT PRIMARY KEY, `TEAMNO` INT(10) NOT NULL, `PLAYERNO` INT(10) NOT NULL, `WON` VARCHAR(10) NOT NULL, `LOST` VARCAHR(10) NOT NULL, `CAPTAIN` INT(10) NOT NULL COMMIT ‘就是PLAYERNO的另外名字‘, `DIVISION` VARCHAR(10) NOT NULL ) ENGINE=MYISAM DEFAULT CHARSET=utf8 COMMIT=‘重新组的新表‘ AUTO_INCREMENT=1
ENGINE=MYISAM or InnoDB 这个是指定数据库的存储引擎,两者主要区别是 INnoDB支持事务,MYISAM 不支持但是速度更快。
在表 result 上创建一个视图
CREATE VIEW teams(TEAMNO,PLAYERNO,DIVISION) AS SELECT DISTINCT TEAMNO,CAPTAIN,DIVISION FROM result
通过更新视图的方式来更新真实表
with check option:对视图进行更新操作的时,需要检查更新后的值是否还是满足视图公式定义的条件。通俗点,就是所更新的结果是否还会在视图中存在。如果更新后的值不在视图范围内,就不允许更新如果创建视图的时候,没有加上with check option,更新视图中的某项数据的话,mysql并不会进行有效性检查。删掉了就删掉了。在视图中将看不到了。
视图内部管理
视图的记录都保存在information_schema数据库中的一个叫views的表中。具体某个视图的定义代码以及属于哪个数据库等信息可以从里面看到理解视图的两种工作机制,举个例子:
语句:select * from teams
1.替换法:select *from (SELECT DISTINCT TEAMNO, CAPTAIN, DIVISION FROM result) 然后交给mysql处理
2.具体化法:mysql先得到了视图执行的结果,星辰给一个中间结果存在内存中,然后在外面的select调用中间结果。
Mysql--视图