程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 視圖,識圖

視圖,識圖

編輯:MySQL綜合教程

視圖,識圖


一、視圖

  視圖是數據庫中的一個虛擬表,其內容由查詢語句查詢出來的。就像真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。它的行和列數據來自由定義視圖的查詢所引用的表,並且在引用視圖時動態生成。我們可以向視圖添加 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; -- 查詢視圖的創建語句

三、視圖主要點

  視圖定義服從下述限制:

  • SELECT語句不能包含FROM子句中的子查詢。
  • SELECT語句不能引用系統或用戶變量。
  • SELECT語句不能引用預處理語句參數。
  • 在存儲過程內,定義不能引用子程序參數或局部變量。
  • 在定義中引用的表或視圖必須存在。但是,創建了視圖後,能夠刪除定義引用的表或視圖。要想檢查視圖定義是否存在這類問題,可使用CHECK TABLE語句。
  • 在定義中不能引用臨時表,不能創建臨時視圖。
  • 在視圖定義中命名的表必須已存在。
  • 不能將觸發程序與視圖關聯在一起。
  • 在視圖定義中使用了ORDER BY,但是調用的時候使用了新的ORDER BY,那麼視圖中定義的ORDER BY 將失效,會按照調用時候的ORDER BY排序。

  對於更新視圖的內容,我們可以通過更新表數據的方式從而間接地去更新視圖內容。

  視圖的內容是否更新與WITH CHECK OPTION子句有關,有些視圖是可以更新,有些視圖是不能。也與視圖的可更新性可能會受到系統變量updatable_views_with_limit的值的影響。


視圖是什?

視圖是存儲在數據庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易於理解和使用。
視圖:查看圖形或文檔的方式。

視圖是從一個或多個表或視圖中導出的表,其結構和數據是建立在對表的查詢基礎上的。和表一樣,視圖也是包括幾個被定義的數據列和多個數據行,但就本質而言這些數據列和數據行來源於其所引用的表。
所以視圖不是真實存在的基礎表而是一張虛表,視圖所對應的數據並不實際地以視圖結構存儲在數據庫中,而是存儲在視圖所引用的表中。
視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表那樣又在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。對視圖的操作與對表的操作一樣,可以對其進行查詢、修改(有一定的限制)、刪除。
當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化,同時,若基本表的數據發生變化,則這種變化也可以自動地反映到視圖中。
視圖有很多優點,主要表現在:
•視點集中
•簡化操作
•定制數據
•合並分割數據
•安全性
 

視圖是什?

視圖是存儲在數據庫中的查詢的SQL 語句,它主要出於兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等,另一原因是可使復雜的查詢易於理解和使用。
視圖:查看圖形或文檔的方式。

視圖是從一個或多個表或視圖中導出的表,其結構和數據是建立在對表的查詢基礎上的。和表一樣,視圖也是包括幾個被定義的數據列和多個數據行,但就本質而言這些數據列和數據行來源於其所引用的表。
所以視圖不是真實存在的基礎表而是一張虛表,視圖所對應的數據並不實際地以視圖結構存儲在數據庫中,而是存儲在視圖所引用的表中。
視圖一經定義便存儲在數據庫中,與其相對應的數據並沒有像表那樣又在數據庫中再存儲一份,通過視圖看到的數據只是存放在基本表中的數據。對視圖的操作與對表的操作一樣,可以對其進行查詢、修改(有一定的限制)、刪除。
當對通過視圖看到的數據進行修改時,相應的基本表的數據也要發生變化,同時,若基本表的數據發生變化,則這種變化也可以自動地反映到視圖中。
視圖有很多優點,主要表現在:
•視點集中
•簡化操作
•定制數據
•合並分割數據
•安全性
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved