1. 程式人生 > >SQL學習十五、檢視

SQL學習十五、檢視

檢視是虛擬的表。與包含資料的表不一樣,檢視只包含使用時動態檢索 資料的查詢。 可以把檢視看作一個已經寫好的SQL,使用的時候直接呼叫對應的檢視以獲取對應的資料。

備註: 1、MySQL從版本 5起開始支援檢視,因此,檢視不能在較早版本的 MySQL中使用。 2、SQLite僅支援只讀檢視,所以檢視可以建立,可以讀,但其內容不能更改。

為什麼使用檢視

1、重用 SQL語句,檢視可以給多人使用,而不用重複書寫相同的SQL; 2、簡化複雜的 SQL操作。在編寫查詢後,可以方便地重用它而不必知道 其基本查詢細節; 3、使用表的一部分而不是整個表; 4、保護資料。可以授予使用者訪問表的特定部分的許可權,而不是整個表的 訪問許可權; 5、更改資料格式和表示。檢視可返回與底層表的表示和格式不同的資料。

建立檢視之後,可以用與表基本相同的方式使用它們。 可以對檢視執行 SELECT 操作,過濾和排序資料,將檢視聯結到其他檢視或表。

檢視的效能問題

因為檢視不包含資料,所以每次使用檢視時,都必須處理查詢執行時 需要的所有檢索。如果你用多個聯結和過濾建立了複雜的檢視或者嵌 套了檢視,效能可能會下降得很厲害。

檢視的規則和限制

1、與表一樣,檢視必須唯一命名(不能給檢視取與別的檢視或表相同的名字); 2、建立檢視的數目沒有限制; 3、檢視可以巢狀,即可以利用從其他檢視中檢索資料的查詢來構造檢視,巢狀的層級在不同的DBMS中有不同的限制; 4、許多 DBMS禁止在檢視查詢中使用 ORDER BY 子句; 5、有些 DBMS把檢視作為只讀的查詢; 6、在建立檢視前應該閱讀相關的DBMS文件。

建立檢視 CREATE VIEW

使用CREATE VIEW 進行檢視的建立,我們將前面的查詢國家內業圖斑中圖斑面積大於10畝的的圖斑分別擁有的附件數量的SQL,用檢視儲存,然後利用檢視進行查詢

  • 左外聯結的SQL
select SR.TBBH, count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBMJ > 10 and SR.TBLX = 'GJNYTB' 
where W.TCBM = 'GJNYTB' and W.TBBH = SR.TBBH 
group by SR.TBBH

查詢結果

  • 建立檢視 create view viewname As 查詢語句
create view FJ_AMOUNTByTBBH As
select SR.TBBH, count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBMJ > 10 and SR.TBLX = 'GJNYTB' 
where W.TCBM = 'GJNYTB' and W.TBBH = SR.TBBH 
group by SR.TBBH

執行結果

檢視建立成功

  • 利用檢視查詢 在檢視建立後之後,我們利用檢視來查詢國家內業圖斑中圖斑面積大於10畝的的圖斑分別擁有的附件數量
select *
from FJ_AMOUNTByTBBH

查詢結果

  • 優化檢視

上面的檢視,已經固定死了查詢的條件,只能查詢TBMJ > 10,TBLX = ‘GJNYTB’ 的圖斑的附件數量,如果我們查詢其他型別或者其他圖斑面積的圖斑附件數量就不能使用該檢視。所以我們可以優化上面的檢視,我們修改建立檢視的查詢語句,讓其查詢出SURVEY_RECORD表中所有圖斑對應的附件數量、圖斑面積、圖斑型別、圖斑編號

優化後的查詢SQL:

select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH 
group by SR.TBBH

我們查詢出SURVEY_RECORD表中所有圖斑對應的附件數量、圖斑面積、圖斑型別、圖斑編號,一共167條。 查詢結果

建立檢視的SQL:

create view FJ_AMOUNTByTBBH As
select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH 
group by SR.TBBH

執行結果

檢視建立成功

利用新檢視進行查詢:

1、我們利用新檢視查詢國家內業圖斑中圖斑面積大於10畝的的圖斑分別擁有的附件數量,SQL

select TBBH,FJ_AMOUNT
from FJ_AMOUNTByTBBH
where TBMJ > 10 and TBLX = 'GJNYTB'

查詢結果

2、我們還可以利用新檢視查詢初次舉證圖斑中圖斑面積大於5的圖斑分別擁有的附件數量,SQL

select TBBH,FJ_AMOUNT
from FJ_AMOUNTByTBBH
where TBMJ > 5 and TBLX = 'CCJZ'

查詢結果

利用檢視過濾異常資料

例如,我們上面優化之後的查詢語句,會查出SURVEY_RECORD表中所有圖斑對應的附件數量、圖斑面積、圖斑型別、圖斑編號,一共167行,但是我們可以看到其中有很多行TBMJ都為NULL,像這樣的異常資料我們可以在建立檢視的時候將其過濾掉

  • 我們使用檢視FJ_AMOUNTByTBBH進行查詢初次舉證型別圖斑的附件數量、圖斑面積、圖斑編號
select TBBH,TBMJ,FJ_AMOUNT
from FJ_AMOUNTByTBBH
where TBLX = 'CCJZ'

查詢結果

  • 在查詢語句中過濾TBMJ為NULL的資料
select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH and SR.TBMJ notnull
group by SR.TBBH
  • 建立新的檢視FJ_AMOUNTByTBBH_New
create view FJ_AMOUNTByTBBH_New As
select SR.TBBH, SR.TBMJ,SR.TBLX,count(W.F_ID) As FJ_AMOUNT
from WYHCFJ W left join SURVEY_RECORD SR 
on SR.TBLX = W.TCBM 
where W.TBBH = SR.TBBH and SR.TBMJ notnull
group by SR.TBBH
  • 利用新的檢視進行相關查詢
select TBBH,TBMJ,FJ_AMOUNT
from FJ_AMOUNTByTBBH_New
where TBLX = 'CCJZ'

過濾掉了TBMJ為NULL的情況 查詢結果

刪除檢視 DROP VIEW

drop view FJ_AMOUNTByTBBH

執行結果

更新檢視

更新檢視 需要先刪除檢視再建立