MySQL高級開發(fā)中視圖的詳細教程
1.介紹
視圖(View)是一種虛擬存在的表。視圖中的數(shù)據(jù)并不在數(shù)據(jù)庫中實際存在,行和列數(shù)據(jù)來自定義視 圖的查詢中使用的表,并且是在使用視圖時動態(tài)生成的。
通俗的講,視圖只保存了查詢的SQL邏輯,不保存查詢結果。所以我們在創(chuàng)建視圖的時候,主要的工作 就落在創(chuàng)建這條SQL查詢語句上。
2.語法
1). 創(chuàng)建
CREATE [OR REPLACE] VIEW 視圖名稱[(列名列表)] AS SELECT語句 [ WITH [
CASCADED | LOCAL ] CHECK OPTION ]
2). 查詢
查看創(chuàng)建視圖語句:SHOW CREATE VIEW 視圖名稱;
查看視圖數(shù)據(jù):SELECT * FROM 視圖名稱 ...... ;
3). 修改
方式一:CREATE [OR REPLACE] VIEW 視圖名稱[(列名列表)] AS SELECT語句 [ WITH
[ CASCADED | LOCAL ] CHECK OPTION ]
方式二:ALTER VIEW 視圖名稱[(列名列表)] AS SELECT語句 [ WITH [ CASCADED |
LOCAL ] CHECK OPTION ]
4). 刪除
DROP VIEW [IF EXISTS] 視圖名稱 [,視圖名稱] ...
演示示例:
-- 創(chuàng)建視圖 create or replace view stu_v_1 as select id,name from student where id <= 10; -- 查詢視圖 show create view stu_v_1; select * from stu_v_1; select * from stu_v_1 where id < 3; -- 修改視圖 create or replace view stu_v_1 as select id,name,no from student where id <= 10; alter view stu_v_1 as select id,name from student where id <= 10; -- 刪除視圖 drop view if exists stu_v_1;
上述我們演示了,視圖應該如何創(chuàng)建、查詢、修改、刪除,那么我們能不能通過視圖來插入、更新數(shù)據(jù) 呢? 接下來,做一個測試。
create or replace view stu_v_1 as select id,name from student where id <= 10 ; select * from stu_v_1; insert into stu_v_1 values(6,'Tom'); insert into stu_v_1 values(17,'Tom22');
執(zhí)行上述的SQL,我們會發(fā)現(xiàn),id為6和17的數(shù)據(jù)都是可以成功插入的。 但是我們執(zhí)行查詢,查詢出 來的數(shù)據(jù),卻沒有id為17的記錄。
因為我們在創(chuàng)建視圖的時候,指定的條件為 id<=10, id為17的數(shù)據(jù),是不符合條件的,所以沒有查 詢出來,但是這條數(shù)據(jù)確實是已經成功的插入到了基表中。
如果我們定義視圖時,如果指定了條件,然后我們在插入、修改、刪除數(shù)據(jù)時,是否可以做到必須滿足 條件才能操作,否則不能夠操作呢? 答案是可以的,這就需要借助于視圖的檢查選項了。
3.檢查選項
當使用WITH CHECK OPTION子句創(chuàng)建視圖時,MySQL會通過視圖檢查正在更改的每個行,例如 插 入,更新,刪除,以使其符合視圖的定義。 MySQL允許基于另一個視圖創(chuàng)建視圖,它還會檢查依賴視 圖中的規(guī)則以保持一致性。為了確定檢查的范圍,mysql提供了兩個選項:
CASCADED 和 LOCAL ,默認值為 CASCADED 。
1). CASCADED
級聯(lián)。 比如,v2視圖是基于v1視圖的,如果在v2視圖創(chuàng)建的時候指定了檢查選項為 cascaded,但是v1視圖 創(chuàng)建時未指定檢查選項。 則在執(zhí)行檢查時,不僅會檢查v2,還會級聯(lián)檢查v2的關聯(lián)視圖v1。
2). LOCAL
本地。
比如,v2視圖是基于v1視圖的,如果在v2視圖創(chuàng)建的時候指定了檢查選項為 local ,但是v1視圖創(chuàng) 建時未指定檢查選項。 則在執(zhí)行檢查時,知會檢查v2,不會檢查v2的關聯(lián)視圖v1。
4.視圖的更新
要使視圖可更新,視圖中的行與基礎表中的行之間必須存在一對一的關系。如果視圖包含以下任何一 項,則該視圖不可更新:
A. 聚合函數(shù)或窗口函數(shù)(SUM()、 MIN()、 MAX()、 COUNT()等)
B. DISTINCT
C. GROUP BY
D. HAVING
E. UNION 或者 UNION ALL
示例演示:
create view stu_v_count as select count(*) from student;
上述的視圖中,就只有一個單行單列的數(shù)據(jù),如果我們對這個視圖進行更新或插入的,將會報錯。
insert into stu_v_count values(10);
5.視圖作用
1). 簡單
視圖不僅可以簡化用戶對數(shù)據(jù)的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視 圖,從而使得用戶不必為以后的操作每次指定全部的條件。
2). 安全
數(shù)據(jù)庫可以授權,但不能授權到數(shù)據(jù)庫特定行和特定的列上。通過視圖用戶只能查詢和修改他們所能見 到的數(shù)據(jù) 1 create view stu_v_count as select count(*) from student; 1 insert into stu_v_count values(10);
3). 數(shù)據(jù)獨立 視圖可幫助用戶屏蔽真實表結構變化帶來的影響。
6.案例
1). 為了保證數(shù)據(jù)庫表的安全性,開發(fā)人員在操作tb_user表時,只能看到的用戶的基本字段,屏蔽 手機號和郵箱兩個字段。
create view tb_user_view as select id,name,profession,age,gender,status,createtime from tb_user; select * from tb_user_view;
2). 查詢每個學生所選修的課程(三張表聯(lián)查),這個功能在很多的業(yè)務中都有使用到,為了簡化操 作,定義一個視圖。
create view tb_stu_course_view as select s.name student_name , s.no student_no , c.name course_name from student s, student_course sc , course c where s.id = sc.studentid and sc.courseid = c.id; select * from tb_stu_course_view;
到此這篇關于MySQL高級開發(fā)中視圖的詳細教程的文章就介紹到這了,更多相關MySQL視圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mysql數(shù)據(jù)庫實現(xiàn)設置字段長度
這篇文章主要介紹了mysql數(shù)據(jù)庫實現(xiàn)設置字段長度,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06mysql 數(shù)據(jù)庫取前后幾秒 幾分鐘 幾小時 幾天的語句
這篇文章主要介紹了mysql 數(shù)據(jù)庫中取前后幾秒 幾分鐘 幾小時 幾天的語句,需要的朋友可以參考下2018-01-01MySql用DATE_FORMAT截取DateTime字段的日期值
MySql截取DateTime字段的日期值可以使用DATE_FORMAT來格式化,使用方法如下2014-08-08