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 ;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章