Mysql中的视图是什么?有什么作用?

Mysql中的视图,其实是一个虚拟表,使用时动态检索查询数据,如何理解这个概念呢?我们先建立基础表,语句如下:

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', '王者');

建表完毕,我们就可以建个视图,Mysql中建立视图语句如下(select语句前加create view 视图名 as)即可:

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,用户只能显示或更新通过视图可见的数据,比如:

通过视图更新id为11的密码为888,但是实际上更新是不成功的,因为userView3限制id<10。所以,视图有什么用呢?

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 ;
发布了224 篇原创文章 · 获赞 34 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_39309402/article/details/105233917