資料庫系統理論(九)

檢視表(VIEW)的用途與優缺點

    VIEW 檢視表 的主要用途,就是可以提供不同的使用者不同的查詢資訊。因此,我們可以歸納為下列幾項用途:
1.讓不同使用者對於資料有不同的觀點與使用範圍。
例如:教務處是以學生的「學業成績」為主要觀點;學務處是以學生的「操行成績」為主要觀點。
2.定義不同的視界,讓使用者看到的是過濾後的資料。
例如:一般使用者所看到的資訊只是管理者的部分子集合。
3.有保密與資料隱藏的作用
例如:個人可以看到個人全部資訊,但是,無法觀看他人的資料(如:薪資、紅利、年終獎金等)。
4.絕大部分的視界僅能做查詢,不能做更新。
優點
1.降低複雜度
如果我們要查詢的資料是來自多個資料表時,利用View檢視表就可以將所要查詢的欄位集合成檢視表中的欄位。亦即把複雜的表格關係利用View來表現,較能提高閱讀性。
例如:公司老闆所需要的摘要式資訊報表。
2.提高保密性
如果我們不想公開整個資料表中的全部欄位時,則利用View檢視表就可以有效地隱藏個人的隱私資料,以達到保密措施。亦即針對不同使用者,可產生不同權限設定的View。
例如:公司員工只能查詢個人的薪資,無法查詢他人。
3.提高程式維護性
當應用程式透過View檢視表來存取資料表時,如果基底表格的架構改變時,無需改變應用程式,只要修改View檢視表即可。
例如:當公司員工升遷為經理時,則查詢的權限直接升級。
缺點
1.執行效率差
因為View檢視表每次都是經過多個資料表合併產生的,所以,必須花費較多時間。
2.操作限制較多
因為View檢視表在進行「刪除及修改」,必須要符合某些特定的條件才能夠更新,例如:檢視表的建立指令不能包含GROUP BY 、 DISTINCT、聚合函數。

建立檢視表(CREATE VIEW)

定義
是指建立「檢視表」(或稱視界、虛擬資料表)

格式
CREATE VIEW 檢視表名稱[(欄位1,欄位2,...,欄位n)]
AS
SELECT<屬性集合>
FROM <基底表格>
[WHERE <條件>]
[GROUP BY <屬性集合>]
[HAVING<條件>]

注意
基本上,檢視表中的欄位名稱都是來自於Select_statement中的<屬性集合>,因此,「檢視表」中的欄位名稱之資料型態會與「基底表格」中的欄位名稱相同。
SQL指令
CREATE VIEW 學生成績單
AS
SELECT 姓名,課名,成績
FROM 學生表 AS A ,選課表 AS B ,課程表 AS C
WHERE A.學號=B.學號
AND C.課號=B.課號

怎麼有這種人、這種邏輯!


陸委會懲處將引爆寒蟬效應!蕭旭岑呼籲賴政府:高抬貴手

來台訪問的陸生團團員、復旦大學學生宋思瑤一句「向『中國台北隊』在棒球12強賽奪冠表示祝賀」,據悉陸委會將行政處分。對此,蕭旭岑今表示,陸委會高抬貴手,不要用戒嚴的心態來處理兩岸交流。

沒有平等的國家地位,算什麼交流!
明明就是矮化台灣,還辯說是:不小心說出的習慣說法。
要來台灣,根本沒把交流當一回事!

資料庫系統理論(八)

除法(Divsion)

定義
此種運算如同數學的除法一般,有二個運算元:第一個關聯表R1當作「被除表格」;第二個關聯表R2當作「除表格」。其中,「被除表格」的屬性必須比「除表格」中的任何屬性中的值域都要與「被除表格」中的屬性之值域相符合。
代表符號
R1/R2
概念圖
基本型格式

巢狀結構查詢
定義
是指在 Where 敘述中再嵌入另一個查詢敘述,此查詢敘述稱為「子查詢」。換言之,您可以將「子查詢」的結果拿來做為另一個查詢條件。

注意
「子查詢」可以獨立地被執行,其執行結果稱為「獨立子查詢」。
分類
1.傳回單一值(=)
2.傳回多值(IN)
3.測試子查詢是否存在(利用EXIST)
第一種作法:
範例
利用子查詢來找出選修「資料庫系統」的學生學號及姓名。
解答
SELECT A.學號,姓名
FROM 學生檔 AS A, 選課檔 AS B 主查詢
WHERE A.學號=B.學號 AND B.學號=
(SELECT C.課號 FROM 課程檔 AS C
WHERE 課名='資料庫系統') 子查詢

第二種作法
範例
利用子查詢來找出選修「課號為C005」的學生學號與姓名
解答
SELECT A.學號,姓名
FROM 學生檔 AS A 主查詢
WHERE A.學號 =
(SELECT 學號 FROM 選課檔 AS B
WHERE A.學號 = B.學號 AND B.課號='C005') 子查詢

SQL巢狀EXISTS/NOT EXISTS        有點難懂請看進一步說明

更簡單的想法:
1.外層是:學生檔(Student)
2.把內層當成學生檔(Student)X選課檔(Course)(做卡式積/Cross Join)
3.內層紀錄去和課程檔(CourseTaken)去做比對(存在/不存在)
4.外層的紀錄再和內層做比對(存在/不存在)
如上圖所示:
橘色:內層(Student表×Course表)中不存在於CourseTaken表的紀錄
意義:每個學生沒有修的課
綠色:外層(Student表)中不存在於橘色的紀錄
意義:沒有課沒修的學生,即為解答!
經過以上方式及可求得巢狀EXISTS/NOT EXISTS的答案。