視圖是一個虛擬表,表中是無數(shù)據(jù)的,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自由定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。視圖的數(shù)據(jù)是來自與基表。
二、為什么使用視圖
1.安全性。視圖可以隱藏一些數(shù)據(jù),當我們數(shù)據(jù)表中有些字段 不方便透露的時候,我們可給視圖表創(chuàng)建字段來接受視圖查詢出來的字段。如下,我們創(chuàng)建了三個字段來接受查詢的結(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ù)處理上,因為我們視圖的數(shù)據(jù)是來自基表的。視圖存儲的數(shù)據(jù)一般都是我們常用的字段,使用視圖就直接查詢出我們要用的數(shù)據(jù)。
3.視圖對重構(gòu)數(shù)據(jù)庫提供了一定程度的邏輯獨立性。數(shù)據(jù)的物理獨立性是指用戶的應用程序不依賴于數(shù)據(jù)庫的物理結(jié)構(gòu)。數(shù)據(jù)的邏輯獨立性是指當數(shù)據(jù)庫重構(gòu)造時,如增加新的關(guān)系或?qū)υ械年P(guān)系增加新的字段,用戶的應用程序不會受影響。層次數(shù)據(jù)庫和網(wǎng)狀數(shù)據(jù)庫一般能較好地支持數(shù)據(jù)的物理獨立性,而對于邏輯獨立性則不能完全的支持。
三、如何使用視圖
1.數(shù)據(jù)準備
// 創(chuàng)建年級表
DROP TABLE IF EXISTS `t_class`;
CREATE TABLE `t_class` (
`class_id` int(1) NOT NULL AUTO_INCREMENT COMMENT '班級編號',
`class_name` varchar(10) NOT NULL COMMENT '班級名稱',
`u_id` int(1) NOT NULL COMMENT '外鍵t_name中的u_id',
PRIMARY KEY (`class_id`)
) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
// 插入測試數(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)建學生表
DROP TABLE IF EXISTS `t_name`;
CREATE TABLE `t_name` (
`u_id` int(1) NOT NULL AUTO_INCREMENT COMMENT '編號',
`u_name` varchar(20) NOT NULL COMMENT '昵稱',
PRIMARY KEY (`u_id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
// 插入測試數(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í)摫恚碇胁o數(shù)據(jù),所以我們是不能對存儲表做修改的,只能對基表進行修改。
更多建議: