MySQL高級(jí)開(kāi)發(fā)中視圖的詳細(xì)教程
1.介紹
視圖(View)是一種虛擬存在的表。視圖中的數(shù)據(jù)并不在數(shù)據(jù)庫(kù)中實(shí)際存在,行和列數(shù)據(jù)來(lái)自定義視 圖的查詢中使用的表,并且是在使用視圖時(shí)動(dòng)態(tài)生成的。
通俗的講,視圖只保存了查詢的SQL邏輯,不保存查詢結(jié)果。所以我們?cè)趧?chuàng)建視圖的時(shí)候,主要的工作 就落在創(chuàng)建這條SQL查詢語(yǔ)句上。
2.語(yǔ)法
1). 創(chuàng)建
CREATE [OR REPLACE] VIEW 視圖名稱(chēng)[(列名列表)] AS SELECT語(yǔ)句 [ WITH [
CASCADED | LOCAL ] CHECK OPTION ]
2). 查詢
查看創(chuàng)建視圖語(yǔ)句:SHOW CREATE VIEW 視圖名稱(chēng);
查看視圖數(shù)據(jù):SELECT * FROM 視圖名稱(chēng) ...... ;
3). 修改
方式一:CREATE [OR REPLACE] VIEW 視圖名稱(chēng)[(列名列表)] AS SELECT語(yǔ)句 [ WITH
[ CASCADED | LOCAL ] CHECK OPTION ]
方式二:ALTER VIEW 視圖名稱(chēng)[(列名列表)] AS SELECT語(yǔ)句 [ WITH [ CASCADED |
LOCAL ] CHECK OPTION ]
4). 刪除
DROP VIEW [IF EXISTS] 視圖名稱(chēng) [,視圖名稱(chēng)] ...
演示示例:
-- 創(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;
上述我們演示了,視圖應(yīng)該如何創(chuàng)建、查詢、修改、刪除,那么我們能不能通過(guò)視圖來(lái)插入、更新數(shù)據(jù) 呢? 接下來(lái),做一個(gè)測(cè)試。
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,我們會(huì)發(fā)現(xiàn),id為6和17的數(shù)據(jù)都是可以成功插入的。 但是我們執(zhí)行查詢,查詢出 來(lái)的數(shù)據(jù),卻沒(méi)有id為17的記錄。
因?yàn)槲覀冊(cè)趧?chuàng)建視圖的時(shí)候,指定的條件為 id<=10, id為17的數(shù)據(jù),是不符合條件的,所以沒(méi)有查 詢出來(lái),但是這條數(shù)據(jù)確實(shí)是已經(jīng)成功的插入到了基表中。
如果我們定義視圖時(shí),如果指定了條件,然后我們?cè)诓迦搿⑿薷?、刪除數(shù)據(jù)時(shí),是否可以做到必須滿足 條件才能操作,否則不能夠操作呢? 答案是可以的,這就需要借助于視圖的檢查選項(xiàng)了。
3.檢查選項(xiàng)
當(dāng)使用WITH CHECK OPTION子句創(chuàng)建視圖時(shí),MySQL會(huì)通過(guò)視圖檢查正在更改的每個(gè)行,例如 插 入,更新,刪除,以使其符合視圖的定義。 MySQL允許基于另一個(gè)視圖創(chuàng)建視圖,它還會(huì)檢查依賴視 圖中的規(guī)則以保持一致性。為了確定檢查的范圍,mysql提供了兩個(gè)選項(xiàng):
CASCADED 和 LOCAL ,默認(rèn)值為 CASCADED 。
1). CASCADED
級(jí)聯(lián)。 比如,v2視圖是基于v1視圖的,如果在v2視圖創(chuàng)建的時(shí)候指定了檢查選項(xiàng)為 cascaded,但是v1視圖 創(chuàng)建時(shí)未指定檢查選項(xiàng)。 則在執(zhí)行檢查時(shí),不僅會(huì)檢查v2,還會(huì)級(jí)聯(lián)檢查v2的關(guān)聯(lián)視圖v1。
2). LOCAL
本地。
比如,v2視圖是基于v1視圖的,如果在v2視圖創(chuàng)建的時(shí)候指定了檢查選項(xiàng)為 local ,但是v1視圖創(chuàng) 建時(shí)未指定檢查選項(xiàng)。 則在執(zhí)行檢查時(shí),知會(huì)檢查v2,不會(huì)檢查v2的關(guān)聯(lián)視圖v1。
4.視圖的更新
要使視圖可更新,視圖中的行與基礎(chǔ)表中的行之間必須存在一對(duì)一的關(guān)系。如果視圖包含以下任何一 項(xiàng),則該視圖不可更新:
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;
上述的視圖中,就只有一個(gè)單行單列的數(shù)據(jù),如果我們對(duì)這個(gè)視圖進(jìn)行更新或插入的,將會(huì)報(bào)錯(cuò)。
insert into stu_v_count values(10);
5.視圖作用
1). 簡(jiǎn)單
視圖不僅可以簡(jiǎn)化用戶對(duì)數(shù)據(jù)的理解,也可以簡(jiǎn)化他們的操作。那些被經(jīng)常使用的查詢可以被定義為視 圖,從而使得用戶不必為以后的操作每次指定全部的條件。
2). 安全
數(shù)據(jù)庫(kù)可以授權(quán),但不能授權(quán)到數(shù)據(jù)庫(kù)特定行和特定的列上。通過(guò)視圖用戶只能查詢和修改他們所能見(jiàn) 到的數(shù)據(jù) 1 create view stu_v_count as select count(*) from student; 1 insert into stu_v_count values(10);
3). 數(shù)據(jù)獨(dú)立 視圖可幫助用戶屏蔽真實(shí)表結(jié)構(gòu)變化帶來(lái)的影響。
6.案例
1). 為了保證數(shù)據(jù)庫(kù)表的安全性,開(kāi)發(fā)人員在操作tb_user表時(shí),只能看到的用戶的基本字段,屏蔽 手機(jī)號(hào)和郵箱兩個(gè)字段。
create view tb_user_view as select id,name,profession,age,gender,status,createtime from tb_user; select * from tb_user_view;
2). 查詢每個(gè)學(xué)生所選修的課程(三張表聯(lián)查),這個(gè)功能在很多的業(yè)務(wù)中都有使用到,為了簡(jiǎn)化操 作,定義一個(gè)視圖。
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;
到此這篇關(guān)于MySQL高級(jí)開(kāi)發(fā)中視圖的詳細(xì)教程的文章就介紹到這了,更多相關(guān)MySQL視圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)設(shè)置字段長(zhǎng)度
這篇文章主要介紹了mysql數(shù)據(jù)庫(kù)實(shí)現(xiàn)設(shè)置字段長(zhǎng)度,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01MySQL?Binlog日志的記錄模式寫(xiě)入機(jī)制文件操作詳解
這篇文章主要介紹了MySQL?Binlog日志的記錄模式寫(xiě)入機(jī)制文件操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07mysql 數(shù)據(jù)庫(kù)取前后幾秒 幾分鐘 幾小時(shí) 幾天的語(yǔ)句
這篇文章主要介紹了mysql 數(shù)據(jù)庫(kù)中取前后幾秒 幾分鐘 幾小時(shí) 幾天的語(yǔ)句,需要的朋友可以參考下2018-01-01MySql用DATE_FORMAT截取DateTime字段的日期值
MySql截取DateTime字段的日期值可以使用DATE_FORMAT來(lái)格式化,使用方法如下2014-08-08