一、視圖
視圖是數據庫中的一個虛擬表,其內容由查詢語句查詢出來的。就像真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。它的行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。我們可以向視圖添加 SQL 函數、WHERE 以及 JOIN 語句,我們也可以提交數據,就像這些來自於某個單一的表。
視圖優點如下:
-- ---------------------------- -- 學生表 -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stu_no` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `age` int(11) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`stu_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- ---------------------------- -- 學生記錄 -- ---------------------------- INSERT INTO `student` VALUES ('10001', '張三', '20', 'zhang123'); INSERT INTO `student` VALUES ('10002', '李四', '21', 'lisi123'); INSERT INTO `student` VALUES ('10003', '王五', '22', 'wang123'); -- ---------------------------- -- 學生成績表 -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` ( `id` int(11) NOT NULL AUTO_INCREMENT, `stu_no` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `score` int(11) NOT NULL, PRIMARY KEY (`id`), KEY `id_fk` (`stu_no`), CONSTRAINT `id_fk` FOREIGN KEY (`stu_no`) REFERENCES `student` (`stu_no`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; -- ---------------------------- -- 學生成績記錄 -- ---------------------------- INSERT INTO `course` VALUES ('1', '10001', 'c++', '70'); INSERT INTO `course` VALUES ('2', '10001', 'java', '80'); INSERT INTO `course` VALUES ('3', '10001', 'lisp', '90'); INSERT INTO `course` VALUES ('4', '10002', 'c++', '75'); INSERT INTO `course` VALUES ('5', '10002', 'java', '80'); INSERT INTO `course` VALUES ('6', '10003', 'lisp', '91'); INSERT INTO `course` VALUES ('7', '10003', 'c++', '73');
學生表與學生成績表通過stu_no學生學號這個字段進行關聯。
1、視圖創建
語法如下:
CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
ALGORITHM子句:
ALGORITHM子句是可選的,是對標准SQL的MySQL擴展。ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。
對於MERGE,會將引用視圖的語句的文本與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分。
對於TEMPTABLE,視圖的結果將被置於臨時表中,然後使用它執行語句。
對於UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它應該傾向於MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。明確選擇TEMPTABLE的1個原因在於,創建臨時表之後、並在完成語句處理之前,能夠釋放基表上的鎖定。與MERGE算法相比,鎖定釋放的速度更快,這樣,使用視圖的其他客戶端不會被屏蔽過長時間。
WITH CHECK OPTION可用於對於可更新視圖,可給定WITH CHECK OPTION子句來防止插入或更新行,除非作用在行上的select_statement中的WHERE子句為“真”。
查詢學生的最高科目成績。
DROP VIEW IF EXISTS highest_course; CREATE VIEW highest_course AS SELECT s.NAME AS stuname, c.NAME AS course, max(c.score) AS score FROM course AS c, student AS s WHERE s.stu_no = c.stu_no GROUP BY c.stu_no;
執行DESCRIBE highest_course;可以查看這個視圖的結構,如字段,字段大小是否為空等。執行結果如下:
執行SELECT * FROM highest_course;即可查詢視圖數據內容,結果如下:
我們也可以查詢名稱為張三的最高科目成績,執行SELECT * FROM highest_course WHERE stuname='張三';即可查詢視圖內容,結果如下: 2、視圖結構的修改 語法如下: ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]AS
select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
在原來的視圖增加一個studentno字段
1 -- 修改mysql視圖 2 ALTER VIEW highest_course AS 3 SELECT s.stu_no AS studentno, s.NAME AS stuname, c.NAME AS course, max(c.score) AS score 4 FROM 5 course AS c, student AS s 6 WHERE 7 s.stu_no = c.stu_no 8 GROUP BY 9 c.stu_no; 10 DESCRIBE highest_course;
修改mysql
執行第10行之後視圖結構如下:
已經增加了一個字段studentno。
3、刪除視圖
DROP VIEW highest_course;
4、關於查看視圖的相關語句
SELECT * FROM highest_course; -- 查詢視圖的所有內容 DESCRIBE highest_course; -- 查詢視圖的每個字段的信息 SHOW CREATE VIEW highest_course; -- 查詢視圖的創建語句
三、視圖主要點
視圖定義服從下述限制:
對於更新視圖的內容,我們可以通過更新表數據的方式從而間接地去更新視圖內容。
視圖的內容是否更新與WITH CHECK OPTION子句有關,有些視圖是可以更新,有些視圖是不能。也與視圖的可更新性可能會受到系統變量updatable_views_with_limit的值的影響。
視圖是存儲在數據庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易於理解和使用。
視圖:查看圖形或文檔的方式。
視圖是從一個或多個表或視圖中導出的表,其結構和數據是建立在對表的查詢基礎上的。和表一樣,視圖也是包括幾個被定義的數據列和多個數據行,但就本質而言這些數據列和數據行來源於其所引用的表。
所以視圖不是真實存在的基礎表而是一張虛表,視圖所對應的數據並不實際地以視圖結構存儲在數據庫中,而是存儲在視圖所引用的表中。
視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表那樣又在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。對視圖的操作與對表的操作一樣,可以對其進行查詢、修改(有一定的限制)、刪除。
當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化,同時,若基本表的數據發生變化,則這種變化也可以自動地反映到視圖中。
視圖有很多優點,主要表現在:
•視點集中
•簡化操作
•定制數據
•合並分割數據
•安全性
視圖是存儲在數據庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易於理解和使用。
視圖:查看圖形或文檔的方式。
視圖是從一個或多個表或視圖中導出的表,其結構和數據是建立在對表的查詢基礎上的。和表一樣,視圖也是包括幾個被定義的數據列和多個數據行,但就本質而言這些數據列和數據行來源於其所引用的表。
所以視圖不是真實存在的基礎表而是一張虛表,視圖所對應的數據並不實際地以視圖結構存儲在數據庫中,而是存儲在視圖所引用的表中。
視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表那樣又在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。對視圖的操作與對表的操作一樣,可以對其進行查詢、修改(有一定的限制)、刪除。
當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化,同時,若基本表的數據發生變化,則這種變化也可以自動地反映到視圖中。
視圖有很多優點,主要表現在:
•視點集中
•簡化操作
•定制數據
•合並分割數據
•安全性