視圖是一個(gè)虛擬表,表中是無數(shù)據(jù)的,其內(nèi)容由查詢定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲(chǔ)的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時(shí)動(dòng)態(tài)生成。視圖的數(shù)據(jù)是來自與基表。
二、為什么使用視圖
1.安全性。視圖可以隱藏一些數(shù)據(jù),當(dāng)我們數(shù)據(jù)表中有些字段 不方便透露的時(shí)候,我們可給視圖表創(chuàng)建字段來接受視圖查詢出來的字段。如下,我們創(chuàng)建了三個(gè)字段來接受查詢的結(jié)果。
CREATE VIEW query_view(id,name,class) as SELECT B.u_id, B.u_name, A.class_name FROM t_class as A INNER JOIN t_name AS B ON A.u_id = B.u_id;
2.視圖能簡化用戶操作。這可以讓我們專心在數(shù)據(jù)處理上,因?yàn)槲覀円晥D的數(shù)據(jù)是來自基表的。視圖存儲(chǔ)的數(shù)據(jù)一般都是我們常用的字段,使用視圖就直接查詢出我們要用的數(shù)據(jù)。
3.視圖對(duì)重構(gòu)數(shù)據(jù)庫提供了一定程度的邏輯獨(dú)立性。數(shù)據(jù)的物理獨(dú)立性是指用戶的應(yīng)用程序不依賴于數(shù)據(jù)庫的物理結(jié)構(gòu)。數(shù)據(jù)的邏輯獨(dú)立性是指當(dāng)數(shù)據(jù)庫重構(gòu)造時(shí),如增加新的關(guān)系或?qū)υ械年P(guān)系增加新的字段,用戶的應(yīng)用程序不會(huì)受影響。層次數(shù)據(jù)庫和網(wǎng)狀數(shù)據(jù)庫一般能較好地支持?jǐn)?shù)據(jù)的物理獨(dú)立性,而對(duì)于邏輯獨(dú)立性則不能完全的支持。
三、如何使用視圖
1.數(shù)據(jù)準(zhǔn)備
// 創(chuàng)建年級(jí)表
DROP TABLE IF EXISTS `t_class`;
CREATE TABLE `t_class` (
`class_id` int(1) NOT NULL AUTO_INCREMENT COMMENT '班級(jí)編號(hào)',
`class_name` varchar(10) NOT NULL COMMENT '班級(jí)名稱',
`u_id` int(1) NOT NULL COMMENT '外鍵t_name中的u_id',
PRIMARY KEY (`class_id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
// 插入測(cè)試數(shù)據(jù)
INSERT INTO `t_class` VALUES ('1', '高一', '1');
INSERT INTO `t_class` VALUES ('2', '高一', '1');
INSERT INTO `t_class` VALUES ('3', '高一', '1');
INSERT INTO `t_class` VALUES ('4', '高一', '1');
INSERT INTO `t_class` VALUES ('5', '高一', '1');
INSERT INTO `t_class` VALUES ('6', '高一', '1');
INSERT INTO `t_class` VALUES ('7', '高一', '1');
INSERT INTO `t_class` VALUES ('8', '高一', '1');
INSERT INTO `t_class` VALUES ('9', '高一', '1');
INSERT INTO `t_class` VALUES ('10', '高二', '4');
INSERT INTO `t_class` VALUES ('11', '高二', '4');
INSERT INTO `t_class` VALUES ('12', '高二', '4');
INSERT INTO `t_class` VALUES ('13', '高二', '4');
// 創(chuàng)建學(xué)生表
DROP TABLE IF EXISTS `t_name`;
CREATE TABLE `t_name` (
`u_id` int(1) NOT NULL AUTO_INCREMENT COMMENT '編號(hào)',
`u_name` varchar(20) NOT NULL COMMENT '昵稱',
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
// 插入測(cè)試數(shù)據(jù)
INSERT INTO `t_name` VALUES ('1', '王五1');
INSERT INTO `t_name` VALUES ('2', '李四');
INSERT INTO `t_name` VALUES ('3', '李四');
INSERT INTO `t_name` VALUES ('4', '李四');
INSERT INTO `t_name` VALUES ('5', '李四');
INSERT INTO `t_name` VALUES ('6', '李四');
INSERT INTO `t_name` VALUES ('7', '李四');
INSERT INTO `t_name` VALUES ('8', '李四');
INSERT INTO `t_name` VALUES ('9', '李四');
INSERT INTO `t_name` VALUES ('10', '李四');
INSERT INTO `t_name` VALUES ('11', '李四');
2.創(chuàng)建視圖
// 創(chuàng)建視圖語法
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
CREATE VIEW query_view(id,name,class) as SELECT B.u_id, B.u_name, A.class_name FROM t_class as A INNER JOIN t_name AS B ON A.u_id = B.u_id;
3.刪除視圖
DROP VIEW IF EXISTS query_view;
4.使用視圖
SELECT * FROM query_view;
5.查詢視圖結(jié)構(gòu)
DESCRIBE query_view;
6.顯示視圖狀態(tài)
SHOW TABLE STATUS LIKE 'query_view';
7.修改視圖
視圖是一張?zhí)摫?,表中并無數(shù)據(jù),所以我們是不能對(duì)存儲(chǔ)表做修改的,只能對(duì)基表進(jìn)行修改。
更多建議: