目录
1.sql中的视图,其实是一个虚拟表,使用时动态检索查询数据,如何理解这个概念呢?我们先建立基础表,语句如下:
- DROP TABLE IF EXISTS `user_info`;
- CREATE TABLE `user_info` (
- `id` int(20) NOT NULL AUTO_INCREMENT,
- `arts_name` varchar(20) DEFAULT NULL,
- `user_name` varchar(20) DEFAULT NULL,
- `user_pwd` varchar(20) DEFAULT NULL,
- `rank_id` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `FK1gy0qoa8oxhd6lv5j41ubn0if` (`rank_id`),
- CONSTRAINT `FK1gy0qoa8oxhd6lv5j41ubn0if` FOREIGN KEY (`rank_id`) REFERENCES `user_rank` (`rank_id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8;
-
- -- ----------------------------
- -- Records of user_info
- -- ----------------------------
- INSERT INTO `user_info` VALUES ('1', '扫地僧', 'admin', '000000', '6');
- INSERT INTO `user_info` VALUES ('2', '降龙十八掌', '萧峰', '111111', '5');
- INSERT INTO `user_info` VALUES ('3', '六脉神剑', '段誉', '111111', '5');
- INSERT INTO `user_info` VALUES ('4', '小无相功', '虚竹', '222222', '5');
- INSERT INTO `user_info` VALUES ('5', '易筋经', '游坦之', '222222', '3');
- INSERT INTO `user_info` VALUES ('6', '斗转星移', '慕容复', '1111', '3');
- INSERT INTO `user_info` VALUES ('7', '化功大法', '丁春秋', '11111', '3');
- INSERT INTO `user_info` VALUES ('8', '天长地久不老长春功', '天山童姥', '222', '4');
- INSERT INTO `user_info` VALUES ('9', '天山六阳掌', '无崖子', '333', '4');
- INSERT INTO `user_info` VALUES ('11', '小无相功', '李秋水', '555', '3');
- INSERT INTO `user_info` VALUES ('12', '颜值', '王语嫣', '2222222', '1');
- INSERT INTO `user_info` VALUES ('13', '毒', '阿紫', '111111', '1');
- INSERT INTO `user_info` VALUES ('14', '易容术', '阿朱', '111111', '2');
- INSERT INTO `user_info` VALUES ('15', '一阳指', '段正淳', '111111', '2');
- INSERT INTO `user_info` VALUES ('16', '鳄嘴剪', '南海鳄神', '111111', '2');
- INSERT INTO `user_info` VALUES ('17', '轻功', '云中鹤', '111111', '1');
- INSERT INTO `user_info` VALUES ('20', '嘴炮', '钟万仇', '666666', '1');
- DROP TABLE IF EXISTS `user_rank`;
- CREATE TABLE `user_rank` (
- `rank_id` int(11) NOT NULL AUTO_INCREMENT,
- `user_rank_name` varchar(20) DEFAULT NULL,
- PRIMARY KEY (`rank_id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
-
- -- ----------------------------
- -- Records of user_rank
- -- ----------------------------
- INSERT INTO `user_rank` VALUES ('1', '青铜');
- INSERT INTO `user_rank` VALUES ('2', '白银');
- INSERT INTO `user_rank` VALUES ('3', '黄金');
- INSERT INTO `user_rank` VALUES ('4', '铂金');
- INSERT INTO `user_rank` VALUES ('5', '钻石');
- INSERT INTO `user_rank` VALUES ('6', '王者');
2.建表完毕,我们利用create view as select xxx ——>在mysql中建立视图
- CREATE VIEW view_name
- AS
- SELECT * FROM table_name ;
-
- >>>>>示例<<<<<
- CREATE VIEW userView
- AS
- SELECT * FROM user_info ; //创建视图
-
- SELECT * FROM userView; //查询视图
-
- UPDATE userView SET user_pwd='admin' WHERE user_name='admin'; //使用视图更新底层数据
视图的数据和表中的数据是不一致的情况
如果先建立视图,然后修改对应表中数据,视图是不会改变的
- CREATE VIEW userView2
- AS
- SELECT * FROM user_info WHERE id<10
-
- SELECT * FROM userView2;
-
- INSERT INTO `user_info` VALUES ('22', '梅剑', '333', 'new', '1');
创建了一个只展示1-10的视图数据,向底层user_info表插入一条数据,在该userView2中是看不到的,所以实际应用中可以在创建或修改视图时使用WITH CHECK OPTION(确保视图的一致性),使用了WITH CHECK OPTION,用户只能显示或更新通过视图可见的数据,比如:
CREATE VIEW itema_view AS SELECT * FROM tb_item WITH CHECK OPTION;

总结:
1)简单化,数据所见即所得(比如5张表关联,但是查询只需要每一张表中的1-2个字段,建立视图最合适)
2)实现访问性控制,更加安全(用户只能查询或修改Where限制的数据,所以可以隐蔽真实表中的数据结构)
缺点:
1)性能相对较差(如果视图是基于其他视图创建,查询会相当慢)
2)修改不便
要创建可更新视图,定义视图的SELECT语句不能包含以下任何元素:
➢聚合函数;
➢distinct 子句;
➢group by 子句;
➢having 子句;
➢union 和 union all 子句;
➢外连接
注意:不建议使用基于多表创建的视图进行更新操作。
- >>>>>查看视图<<<<<
- SHOW TABLE STATUS [LIKE 'view_name%'] ; (查看基本信息)
-
- DESC view_name ; 或者 DESCRIBE view_name; (查看基本信息)
-
- SHOW CREATE VIEW view_name ; (查看详细信息)
-
- SELECT * FROM information_schema.views; (查看数据库中所有视图详细信息)
-
- >>>>>删除视图<<<<<
- DROP VIEW IF EXISTS view_name ;