mysql視圖作用

用視圖的理由是什麼?

1、安全性:一般是這樣做的:創建一個視圖,定義好該視圖所操作的數據。

之後將用戶權限與視圖綁定,這樣的方式是使用到了一個特性:grant語句可以針對視圖進行授予權限。

2、查詢性能提高

3、有靈活性的功能需求後,需要改動表的結構而導致工作量比較大,那麼可以使用虛擬表的形式達到少修改的效果。

這是在實際開發中比較有用的

4、複雜的查詢需求,可以進行問題分解,然後將創建多個視圖獲取數據。將視圖聯合起來就能得到需要的結果了。

創建視圖

創建視圖的語法

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
其中,CREATE:表示新建視圖;

REPLACE:表示替換已有視圖

ALGORITHM :表示視圖選擇算法

view_name :視圖名

column_list:屬性列

select_statement:表示select語句

[WITH [CASCADED | LOCAL] CHECK OPTION]參數表示視圖在更新時保證在視圖的權限範圍之內

可選的ALGORITHM子句是對標準SQL的MySQL擴展。

ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。

如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。

對於MERGE,會將引用視圖的語句的文本與視圖定義合併起來,使得視圖定義的某一部分取代語句的對應部分。

對於TEMPTABLE,視圖的結果將被置於臨時表中,然後使用它執行語句。

對於UNDEFINED,MySQL自己選擇所要使用的算法。如果可能,它傾向於MERGE而不是TEMPTABLE,

這是因爲MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的。

LOCAL和CASCADED爲可選參數,決定了檢查測試的範圍,默認值爲CASCADED。

腳本 視圖的數據來自於兩個表

複製代碼
CREATE TABLE student (stuno INT ,stuname NVARCHAR(60))

CREATE TABLE stuinfo (stuno INT ,class NVARCHAR(60),city NVARCHAR(60))

INSERT INTO student VALUES(1,‘wanglin’),(2,‘gaoli’),(3,‘zhanghai’)

INSERT INTO stuinfo VALUES(1,‘wuban’,‘henan’),(2,‘liuban’,‘hebei’),(3,‘qiban’,‘shandong’)

– 創建視圖
CREATE VIEW stu_class(id,NAME,glass) AS SELECT student.stuno,student.stuname,stuinfo.class
FROM student ,stuinfo WHERE student.stuno=stuinfo.stuno

SELECT * FROM stu_class
複製代碼

查看視圖

查看視圖必須要有SHOW VIEW權限

查看視圖的方法包括:DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW

DESCRIBE查看視圖基本信息

DESCRIBE 視圖名
DESCRIBE stu_class

結果顯示了視圖的字段定義、字段的數據類型、是否爲空、是否爲主/外鍵、默認值和額外信息

DESCRIBE一般都簡寫成DESC

SHOW TABLE STATUS語句查看查看視圖基本信息

查看視圖的信息可以通過SHOW TABLE STATUS的方法

SHOW TABLE STATUS LIKE ‘stu_class’
複製代碼
Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment


stu_class (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) (NULL) VIEW
複製代碼
COMMENT的值爲VIEW說明該表爲視圖,其他的信息爲NULL說明這是一個虛表,如果是基表那麼會基表的信息,這是基表和視圖的區別

SHOW CREATE VIEW語句查看視圖詳細信息

SHOW CREATE VIEW stu_class
複製代碼
View Create View character_set_client collation_connection


stu_class CREATE ALGORITHM=UNDEFINED DEFINER=root@localhost SQL SECURITY DEFINER VIEW stu_class AS select student.stuno AS id,student.stuname AS name,stuinfo.class AS class from (student join stuinfo) where (student.stuno = stuinfo.stuno) utf8 utf8_general_ci
複製代碼
執行結果顯示視圖的名稱、創建視圖的語句等信息

在VIEWS表中查看視圖的詳細信息

在MYSQL中,INFORMATION_SCHEMA VIEWS表存儲了關於數據庫中的視圖的信息

通過對VIEWS表的查詢可以查看數據庫中所有視圖的詳細信息

SELECT * FROM information_schema.VIEWS
複製代碼
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION


def school stu_class select school.student.stuno AS id,school.student.stuname AS name,school.stuinfo.class AS class from school.student join school.stuinfo where (school.student.stuno = school.stuinfo.stuno) NONE YES root@localhost DEFINER utf8 utf8_general_ci
複製代碼
當前實例下只有一個視圖stu_class

修改視圖

修改視圖是指修改數據庫中存在的視圖,當基本表的某些字段發生變化時,可以通過修改視圖來保持與基本表的一致性。

MYSQL中通過CREATE OR REPLACE VIEW 語句和ALTER語句來修改視圖

語法如下:

ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
該語句用於更改已有視圖的定義。其語法與CREATE VIEW類似。當視圖不存在時創建,存在時進行修改

修改視圖

複製代碼
DELIMITER $$

CREATE OR REPLACE VIEW stu_class AS
SELECT
student.stuno AS id
FROM (student JOIN stuinfo)
WHERE (student.stuno = stuinfo.stuno)$$

DELIMITER ;
複製代碼

通過DESC來查看更改之後的視圖定義

DESC stu_class

可以看到只查詢一個字段

ALTER語句修改視圖

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
這裏關鍵字跟前面的一樣,這裏不做介紹

使用ALTER語句修改視圖 stu_class

ALTER VIEW stu_class AS SELECT stuno FROM student;
使用DESC查看

DESC stu_class

更新視圖

更新視圖是指通過視圖來插入、更新、刪除表數據,因爲視圖是虛表,其中沒有數據。

通過視圖更新的時候都是轉到基表進行更新,如果對視圖增加或者刪除記錄,實際上是對基表增加或刪除記錄

我們先修改一下視圖定義

ALTER VIEW stu_class AS SELECT stuno,stuname FROM student;
查詢視圖數據

UPDATE

UPDATE stu_class SET stuname=‘xiaofang’ WHERE stuno=2
查詢視圖數據

更新成功

INSERT

INSERT INTO stu_class VALUES(6,‘haojie’)

插入成功

DELETE

DELETE FROM stu_class WHERE stuno=1

刪除成功

當視圖中包含如下內容的時候,視圖的更新操作將不能被執行

(1)視圖中包含基本中被定義爲非空的列

(2)定義視圖的SELECT語句後的字段列表中使用了數學表達式

(3)定義視圖的SELECT語句後的字段列表中使用聚合函數

(4)定義視圖的SELECT語句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句

視圖已存在,則創建:create or replace view的意思就是若數據庫中已經存在這個名字的視圖的話,就替代它,若沒有則創建視圖;

create則不進行判斷,若數據庫中已經存在的話,則報錯,說對象已存在;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章