日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

c mysql 视图_mysql 视图

發布時間:2024/1/18 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c mysql 视图_mysql 视图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

六、mysql 視圖

6.1、什么是視圖

① 定義

視圖是指計算機數據庫中的視圖,是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖并不在數據庫中以存儲的數據值集形式存在。行和列數據來自由定義視圖的查詢所引用的表,并且在引用視圖時動態生成。

② 為什么需要視圖

關系型數據庫中的數據是由一張一張的二維關系表所組成,簡單的單表查詢只需要遍歷一個表,而復雜的多表查詢需要將多個表連接起來進行查詢任務。對于復雜的查詢事件,每次查詢都需要編寫MySQL代碼效率低下。為了解決這個問題,數據庫提供了視圖(view)功能。

③ 通俗易懂的解釋

朕想要了解皇宮的國庫的相關情況,想知道酒窖有什么酒,剩多少,窖藏多少年,于是派最信任的高公公去清點,高公公去國庫清點后報給了朕;朕又想知道藏書情況,于是又派高公公去清點并回來報告給朕,又想知道金銀珠寶如何,又派高公公清點。。。過一段時間又想知道藏書情況,高公公還得重新再去清點,皇上問一次,高公公就得跑一次路。

后來皇上覺得高公公不容易,就成立了國庫管理部門,小鄧子負責酒窖,小卓子負責藏書,而小六子負責金庫的清點。。。后來皇上每次想了解國庫就直接問話負責人,負責人就按照職責要求進行匯報。

安排專人管理后,每次皇上想要了解國庫情況,就不必讓高公公每次都跑一趟,而是指定的人員按照指定的任務完成指定的匯報工作就可以了。

和數據庫相對應,每次進行查詢工作,都需要編寫查詢代碼進行查詢;而視圖的作用就是不必每次都重新編寫查詢的SQL代碼,而是通過視圖直接查詢即可。因此:視圖是虛擬表,本身不存儲數據,而是按照指定的方式進行查詢。

6.2、例子

① 創建數據//創建部門表

create?table?department(

id?int?primary?key?auto_increment,

name?char(30)?not?null

);

//創建員工表

create?table?employee(

id?int?primary?key?auto_increment,

department_id?int?not?null,

name?char(30)?not?null

);

//插入數據

insert?into?department(name)?values("人事部"),("研發部");

insert?into?employee(department_id,name)?values(1,"小明"),(2,"大明");

② 創建視圖

在創建視圖前應先看看是否有權限:mysql>?SELECT?SELECT_priv,create_view_priv?from?mysql.user?WHERE?user="root";

+-------------+------------------+

|?SELECT_priv?|?create_view_priv?|

+-------------+------------------+

|?Y???????????|?Y????????????????|

|?Y???????????|?Y????????????????|

|?Y???????????|?Y????????????????|

+-------------+------------------+

Y表示有創建的權限。

單表上創建視圖:create?view?v_view1(id,name)?as?select?id,name?from?employee;

查看視圖:mysql>?select?*?from?v_view1;

+----+------+

|?id?|?name?|

+----+------+

|??1?|?小明?|

|??2?|?大明?|

+----+------+

多表上創建視圖:create?view?v_view2(id,name,department)?as?select?a.id,a.name,b.name?from?employee?a,department?b?where?a.department_id=b.id;

查看視圖:mysql>?select?*?from?v_view2;

+----+------+------------+

|?id?|?name?|?department?|

+----+------+------------+

|??1?|?小明?|?人事部?????|

|??2?|?大明?|?研發部?????|

+----+------+------------+

③ 更新視圖update?v_view1?set?name="小紅"?where?name="小明";

查看更新后的兩個視圖:mysql>?select?*?from?v_view1;

+----+------+

|?id?|?name?|

+----+------+

|??1?|?小紅?|

|??2?|?大明?|

+----+------+

mysql>?select?*?from?v_view2;

+----+------+------------+

|?id?|?name?|?department?|

+----+------+------------+

|??1?|?小紅?|?人事部?????|

|??2?|?大明?|?研發部?????|

+----+------+------------+

查看更新后的數據表:mysql>?select?*?from?employee;

+----+---------------+------+

|?id?|?department_id?|?name?|

+----+---------------+------+

|??1?|?????????????1?|?小紅?|

|??2?|?????????????2?|?大明?|

+----+---------------+------+

小結:更新視圖,則對應的真實表上的數據也發生改變

更新視圖,相關視圖的數據也發生改變

視圖中雖然可以更新數據,但是有很多的限制。一般情況下,最好將視圖作為查詢數據的虛擬表,而不要通過視圖更新數據。因為,使用視圖更新數據時,如果沒有全面考慮在視圖中更新數據的限制,就可能會造成數據更新失敗。

④、不可更新的視圖

某些視圖是可更新的。也就是說,可以在諸如UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對于可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系。

還有一些特定的其他結構,這類結構會使得視圖不可更新。更具體地講,如果視圖包含下述結構中的任何一種,那么它就是不可更新的:

聚合函數(SUM(), MIN(), MAX(), COUNT()等)、DISTINCT、GROUP BY、HAVING、UNION或UNION ALL、位于選擇列表中的子查詢、Join、FROM子句中的不可更新視圖、WHERE子句中的子查詢,引用FROM子句中的表、僅引用文字值(在該情況下,沒有要更新的基本表)、ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成為不可更新的)

⑤、WITH[CASCADED|LOCAL] CHECK OPTION

創建或者修改視圖的時候加入參數 with check option 決定視圖是否能更新:LOCAL參數表示更新視圖時只要滿足該視圖本身定義的條件即可。

CASCADED參數表示更新視圖時需要滿足所有相關視圖和表的條件。沒有指明時,該參數為默認值。

比如:create?view?v_view3(id,?name,?department_id)?as?select?id,?name,?department_id?from?employee?where?department_id=1?with?local?check?option;mysql>?select?*?from?v_view3;

+----+------+---------------+

|?id?|?name?|?department_id?|

+----+------+---------------+

|??1?|?小紅?|?????????????1?|

+----+------+---------------+

插入數據:insert?into?v_view3(name,department_id)?values("小綠",1);

查看視圖:mysql>?select?*?from?v_view3;

+----+------+---------------+

|?id?|?name?|?department_id?|

+----+------+---------------+

|??1?|?小紅?|?????????????1?|

|??3?|?小藍?|?????????????1?|

|??4?|?小綠?|?????????????1?|

+----+------+---------------+

插入數據:mysql>?insert?into?v_view3(name,department_id)?values("大綠",2);

ERROR?1369?(HY000):?CHECK?OPTION?failed?"test.v_view3"

結果顯示插入失敗。因為視圖 v_view3 中 where department_id=1,當你插入 department_id=2的時候就無法插入。

⑥、刪除視圖DROP?VIEW?IF?EXISTS?視圖名

6.3、視圖存在的意義

①、為何存在

視圖是存儲在數據庫中的查詢的SQL 語句,它主要出于兩種原因:安全原因, 視圖可以隱藏一些數據,如:社會保險基金表,可以用視圖只顯示姓名,地址,而不顯示社會保險號和工資數等。

另一原因是可使復雜的查詢易于理解和使用。這個視圖就像一個“窗口”,從中只能看到你想看的數據列。

②、視圖的好處

A 視圖能簡化用戶操作

視圖機制使用戶可以將注意力集中在所關心地數據上。如果這些數據不是直接來自基本表,則可以通過定義視圖,使數據庫看起來結構簡單、清晰,并且可以簡化用戶的的數據查詢操作。例如,那些定義了若干張表連接的視圖,就將表與表之間的連接操作對用戶隱藏起來了。換句話說,用戶所作的只是對一個虛表的簡單查詢,而這個虛表是怎樣得來的,用戶無需了解。

B 視圖使用戶能以多種角度看待同一數據

視圖機制能使不同的用戶以不同的方式看待同一數據,當許多不同種類的用戶共享同一個數據庫時,這種靈活性是非常必要的。

C ?視圖對重構數據庫提供了一定程度的邏輯獨立性

數據的物理獨立性是指用戶的應用程序不依賴于數據庫的物理結構。數據的邏輯獨立性是指當數據庫重構造時,如增加新的關系或對原有的關系增加新的字段,用戶的應用程序不會受影響。層次數據庫和網狀數據庫一般能較好地支持數據的物理獨立性,而對于邏輯獨立性則不能完全的支持。

在關系數據庫中,數據庫的重構造往往是不可避免的。重構數據庫最常見的是將一個基本表“垂直”地分成多個基本表。例如:將學生關系student(no,name,sex,age,dept),

分為x(no,name,age)和y(no,sex,dept)兩個關系。這時原表student為x表和y表自然連接的結果。如果建立一個視圖student:create?view?v_student(no,name,sex,age,dept)as?select?x.no,x.xname,y.sex,x.age,y.dept?from?x,y?WHERE?x.no=y.Sno;

這樣盡管數據庫的邏輯結構改變了(變為x和y兩個表了),但應用程序不必修改,因為新建立的視圖定義為用戶原來的關系,使用戶的外模式保持不變,用戶的應用程序通過視圖仍然能夠查找數據。

當然,視圖只能在一定程度上提供數據的邏輯獨立,比如由于視圖的更新是有條件的,因此應用程序中修改數據的語句可能仍會因為基本表構造的改變而改變。

D 視圖能夠對機密數據提供安全保護

有了視圖機制,就可以在設計數據庫應用系統時,對不同的用戶定義不同的視圖,使機密數據不出現在不應該看到這些數據的用戶視圖上。這樣視圖機制就自動提供了對機密數據的安全保護功能。例如,student表涉及全校15個院系學生數據,可以在其上定義15個視圖,每個視圖只包含一個院系的學生數據,并只允許每個院系的主任查詢和修改本原系學生視圖。

E 適當的利用視圖可以更清晰地表達查詢

例如經常需要執行這樣的查詢“對每個學生找出他獲得最高成績的課程號”。可以先定義一個視圖,求出每個同學獲得的最高成績:CREATE?VIEW?VMGRADE?AS?SELECT?Sno,MAX(Grade)?Mgrade?FROM?SC?GROUP?BY?Sno;

然后用如下的查詢語句完成查詢:SELECT?SC.Sno,Cno?FROM?SC,VMGRADE?WHERE?SC.Sno?=?VMGRADE.Sno?AND?SC.Grade?=?VMGRADE.Mgrade;

③、總結

A 視圖是從一個或多個表或視圖中導出的表,其結構和數據是建立在對表的查詢基礎上的

B 視圖不是真實存在的基礎表而是一張虛表,視圖所對應的數據并不實際地以視圖結構存儲在數據庫中,而是存儲在視圖所引用的表中。

總結

以上是生活随笔為你收集整理的c mysql 视图_mysql 视图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。