二級MySQL數據庫程序設計(七)

本博客爲《全國計算機等級考試二級MySQL數據庫程序設計教程》讀書筆記,請勿轉載用於其他商業用途。

課程目錄
第1章 數據庫的基本概念與設計方法
第2章 MySQL簡介
第3章 數據庫和表
第4章 表數據的基本操作
第5章 數據庫的查詢
第6章 索引
第7章 視圖
第8章 數據完整性約束與表維護語句
第9章 觸發器
第10章 事件
第11章 存儲過程與存儲函數
第12章 訪問控制與安全管理
第13章 備份與恢復
第14章 PHP和MySQL數據庫編程
第15章 開發實例

本章學習流程圖

在這裏插入圖片描述

本章學習大綱

在這裏插入圖片描述
視圖是數據庫系統中一種非常有用的數據庫對象。

視圖:一個虛擬表,其內容由查詢定義。同真實表一樣,視圖包含一系列帶有名稱的列和數據行,但視圖並不是數據庫真實存儲的信息。

7.1 視圖簡介

視圖是從一個、多個表或者視圖中導出的表,包含一系列帶有名稱的數據列和若干條數據行。但視圖不同於表,區別如下:

  • 視圖不是數據庫中真實的表,是一張虛擬表,其結構和數據是建立在對數據中真實表的查詢基礎上的。
  • 存儲在數據庫中的查詢操作SQL語句定義了視圖的內容,列數據和行數據來自於視圖查詢所引用的實際表,引用視圖時動態生成這些數據。
  • 視圖沒有實際的物理記錄,不是以數據集的形式存儲在數據庫中,它所對應的數據實際上是存儲在視圖所引用的真實表中。
  • 視圖是數據的窗口,而表是內容。
  • 視圖是查看數據表的一種方法,安全性更高。
  • 視圖的建立和刪除隻影響視圖本身,不影響對應的基本表。

視圖與表在本質上雖然不同,但視圖經過定義以後,結構形式和表一樣,可以進行查詢、修改、更新和刪除等操作。同時,視圖具有以下優點:

  • 定製用戶數據,聚焦特定的數據。
  • 簡化數據操作。
  • 提高基表數據的安全性。
  • 共享所需數據。
  • 更改數據格式。
  • 重用SQL語句。

7.2 創建和刪除視圖

❶ 創建視圖
可以使用CREATE VIEW語句來創建視圖。

語法格式:

CREATE VIEW <視圖名> AS <SELECT語句>

語法說明:

  • <視圖名>:指定視圖的名稱。該名稱在數據庫中必須是唯一的,不能與其他表或視圖同名。
  • <SELECT語句>:指定創建視圖的SELECT語句。它可用於查詢多個基礎表或源視圖。注意,對於SELECT語句的指定存在以下一些限制:
    ① 用戶除了用於CREATE VIEW權限,還具有操作中設計的基礎表和其他視圖的相關權限。
    ② SELECT語句不能引用系統或用戶變量。
    ③ SELECT語句不能包含FROM子句中的子查詢。
    ④ SELECT語句不能引用預處理語句參數。
    ⑤ 視圖定義中引用的表或視圖必須存在。但是,創建完視圖後,可以刪除定義引用的表或視圖。可使用CHECK TABLE語句檢查視圖定義是否存在這類問題。
    ⑥ 視圖定義中允許使用ORDER BY語句,但是,如果從特定視圖進行了選擇,而該視圖使用了自己的ORDER BY 語句,視圖定義中的ORDER BY將被忽略。
    ⑦ 定義中不能引用TEMPORARY表,不能創建TEMPORATY視圖。

【例7-1】在數據庫 my_test 中創建視圖 students_view,該視圖包含學生基本信息表 students 中所有男生的姓名、專業和年齡,並且要求今後對視圖數據的修改都必須符合“性別=男”這個條件。

Database changed
mysql> use my_test;
Database changed
mysql> create view my_test.students_view
    -> as
    -> select student_name,student_age,student_sex
    -> from students
    -> where student_sex='0'
    -> with check option;
Query OK, 0 rows affected (0.36 sec)

WITH CHECK OPTION的意思是:修改視圖時,檢查插入的數據是否符合WHERE設置的條件。

❷ 刪除視圖
可以使用DROP VIEW語句來刪除視圖。

語法格式:

DROP VIEW <視圖名1> [,視圖名2]...

語法說明:

  • <視圖名>:指定要刪除的視圖名。DROP VIEW語句可以一次刪除多個視圖,但是必須在每個視圖上擁有DROP權限。

例如,刪除例7-1中創建的視圖 students_view,輸入以下代碼即可:

DROP VIEW students_view;

7.3 修改和查看視圖定義

❶ 修改定義視圖
可以使用ALTER VIEW語句來對已有的視圖進行修改。

語法格式:

VIEW <視圖名> AS <SELECT語句>

ALTER VIEW語句的語法和CREATE VIEW類似,需要注意的是,對於ALTER VIEW語句的使用,需要用戶具有針對視圖的CREATE VIEWDROP權限,以及由SELECT語句選擇的每一列上的某些權限。
修改視圖的定義,除了通過ALTER VIEW,也可以使用DROP VIEW語句先刪除視圖,然後再使用CREATE VIEW語句來實現。

❷ 查看視圖定義
可以使用SHOW CREATE VIEW語句來查看已有視圖的定義。

語法格式:

SHOW CREATE VIEW <視圖名>

語法說明:

  • <視圖名>:要查看視圖的名稱。

【例7-2】查看數據庫 my_test 中的名爲 students_view 的視圖結構。

mysql> show create view students_view;
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View          | Create View                                                                                                                                                                                                                                                                                                                 | character_set_client | collation_connection |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| students_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `students_view` AS select `students`.`student_name` AS `student_name`,`students`.`student_age` AS `student_age`,`students`.`student_sex` AS `student_sex` from `students` where (`students`.`student_sex` = '0') WITH CASCADED CHECK OPTION | gbk                  | gbk_chinese_ci       |
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.41 sec)

7.4 更新視圖數據

視圖是一個虛擬表,實際的數據來自於基礎表,所以通過插入、修改和刪除操作更新視圖中的數據,實質上是在更新視圖所引用的基礎表的數據。

注意:對視圖的修改即是對基礎表的修改,因此在修改時,要滿足基礎表的數據定義。

某些視圖是可更新的。也就是說,可以使用UPDATEDELETE或者INSERT等語句,更新基表的內容。對於可更新的視圖,視圖中的行和基表中的行之間必須具有一對一的關係。
還有一些特定的其他結構,這類結構會使得視圖不可更新。更具體地講,如果視圖包含以下結構中的任何一種,都是不可更新的:

  • 聚合函數SUM( )、MIN( )、COUNT( )等。
  • DISTINCT 關鍵字。
  • GROUP BY 子句。
  • HAVING子句。
  • UNION 或 UNION ALL 運算符。
  • 位於選擇列表中的子查詢。
  • FROM 子句中的不可更新視圖或包含多個表。
  • WHERE 子句中的子查詢,引用 FROM 子句中的表。
  • ALGORITHM 選項爲 TEMPTABLE (使用臨時表總會使視圖稱爲不可更新的)的時候。

❶ 使用 INSERT 語句通過視圖向基礎表插入數據

【例7-3】在數據庫 my_test 中,向視圖 students_view 插入下面一條記錄:
(‘劉強’,‘地理空間專業’,‘19’,‘0’)

mysql> insert into my_test.students_view
    -> values('劉強','地理空間專業','19','0');
ERROR 1423 (HY000): Field of view 'my_test.students_view' underlying table doesn't have a default value

從結果可以看出,書中的方法並不能實現操作。

❷ 使用UPDATE語句通過視圖修改基礎表數據

【例7-4】將視圖 students_view 的 students_major 字段值“化學專業”改爲“材料化學專業”。

mysql> update my_test.students_view
    -> set student_major='材料化學專業'
    -> where student_major='化學專業';
Query OK, 1 row affected (0.58 sec)
Rows matched: 1  Changed: 1  Warnings: 0

注意,如果一個視圖依賴多個基礎表,則一次視圖修改操作只能改變一個基礎表中的數據。

❸ 使用DELETE語句通過視圖刪除基礎表數據

【例7-5】刪除視圖 students_view 中姓名爲“王五”的學生信息。

mysql> delete from students_view
    -> where student_name='王五';
Query OK, 0 rows affected (0.00 sec)

注意,對於依賴多個基礎表的視圖,不能使用DELETE語句。

7.5 查詢視圖數據

視圖一經定義之後,就可以如同查詢數據中表一樣,使用SELECT語句查詢視圖中的數據,語法和查詢基礎表的數據一樣。視圖用於查詢主要應用在以下幾個方面:

  • 使用視圖重新格式化檢索出的數據。
  • 使用視圖簡化複雜的表連接。
  • 使用視圖過濾數據。

【例7-6】在視圖 students_view 中查找姓名爲“蔣子涵”的學生,以及他的姓名和專業信息。

mysql> select student_name,student_major
    -> from my_test.students_view
    -> where student_name='蔣子涵';
+--------------+---------------+
| student_name | student_major |
+--------------+---------------+
| 蔣子涵       | 物理專業      |
+--------------+---------------+
1 row in set (0.00 sec)

7.6 視圖進階

使用視圖的時候,還應該注意以下幾點:

  • 創建視圖需要足夠的訪問權限。
  • 創建視圖的數目沒有限制。
  • 視圖可以嵌套,即從其他視圖中檢索數據的查詢來創建視圖。
  • 視圖不能索引,也不能有關聯的觸發器、默認值或規則。
  • 視圖可以和表一起使用。
  • 視圖不包含數據,所以每次使用視圖時,都必須執行查詢所需的任何一個檢索操作。
  • ORDER BY子句可以用在視圖中,但如果從該視圖檢索數據的SELECT語句中也含有 ORDER BY 子句,那麼該視圖中的 OEDER BY 子句將被覆蓋。

【例7-7】基於視圖 students_view 創建一個只包含專業爲“物理專業”的子視圖。

mysql> create view my_test.students_phy
    -> as
    -> select * from my_test.students_view
    -> where student_major='物理專業';
Query OK, 0 rows affected (0.17 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章