sql之淺談視圖的作用

sql之淺談視圖的作用
在一個項目的實際開發(fā)過程中牽涉到復(fù)雜業(yè)務(wù)的時候,我們不可避免的需要使用中間表來進行數(shù)據(jù)連接,有的同學就說了,我可以采用Hibernate進行主外鍵進行關(guān)聯(lián)啊?多對多,多對一,一對一,等,采用主外鍵關(guān)聯(lián)在數(shù)據(jù)的操作過程中具有很強的耦合性,尤其對于需要經(jīng)常刪改數(shù)據(jù)表而言,我們是不建議采用主外鍵關(guān)聯(lián)這種模式,那么,如果我們采用中間表的話,當數(shù)據(jù)過大在性能上又面臨嚴峻考驗,sql視圖的出現(xiàn),在解決中間表的業(yè)務(wù)邏輯上是不錯的選擇。ok,首先我們了解什么是視圖?
1、視圖是表?沒錯,但是是一張?zhí)摂M表,視圖的字段是由我們自定義的,視圖只供查詢,數(shù)據(jù)不可更改,查詢數(shù)據(jù)來源于我們建立的實體表。
2、使用視圖的優(yōu)勢?視圖可以將多個復(fù)雜關(guān)聯(lián)表,提取出我們需要的信息,優(yōu)化查詢速度。
如何創(chuàng)建視圖?
我們先建立三張表;如下:


school.png
grade.png
student.png

這個是典型的一對多和一對一的關(guān)系,那么,假如每張表的數(shù)據(jù)都在一萬條數(shù)據(jù)以上,現(xiàn)在查詢在潢高上學的學生姓名?
首先,我們分析一下,在潢高上學?首先是一個高中,那么我們會有一條Sql where school='潢高',
查詢出一個List,得到gradeids,然后再到grade中根據(jù)gradeids查詢這么多grades對應(yīng)的studentids,在使用這些studentsid查詢出students循環(huán)最后得到name?
是不是很累贅?查詢是不是很影響性能?
觀察得知,這三張表每兩張表之間都是通過id進行關(guān)聯(lián)的,如果我們通過id將三張表組成一張表,是不是很方便?
我們來關(guān)聯(lián)學校表和年級表:這個年級ID我們不要,ok?
1

select
s.id
as schoolId,
s.school
as schoolName,
s.gradeid
as gradeid,
g.grade
as gradeName,
g.studentid
as studentid
from
school s,grade g 
where
s.gradeid=g.id; 
jieguo.png

那么我們再關(guān)聯(lián)上學生表,學生表的id等于年級表的studentid ok?
1

SELECT
s.id
as schoolId,
s.school
as schoolName,
s.gradeid
as gradeid,
g.grade
as gradeName,
g.studentid
as studentid ,
t.'name'
as studentName,
t.age
as studentAge

from
school s,grade g,student t
where
s.gradeid=g.id
and
 g.studentid=t.id;

ok,到了這里?我們再看運行結(jié)果?


5.png

那么我們想查詢在潢高上學的學生姓名,where schoolName='潢高',獲取的list循環(huán)得到Object,通過Object.getStudentName,就可以了?
所以需要將查詢到的結(jié)果,建立為一張?zhí)摂M表,這樣才能操作,通過這個create view 視圖名 as 命令建立:
意思就是將查詢結(jié)果創(chuàng)建為名稱為table_sgt的一張?zhí)摂M表:
1

create
view
table_sgt
as
(
select
s.id
as schoolId,
s.school
as schoolName,
s.gradeid
as gradeid,
g.grade
as gradeName,
g.studentid
as studentid ,
t.'name'
as
studentName,
t.age
as
studentAge
from
school s,grade g,student t
where
s.gradeid=g.id
and
 g.studentid=t.id);
6.png
7.png

我們在使用視圖的時候,需要把它看做為一張表,建立一張實體表需要做的步驟,視圖也都需要(例如,實例化,配置映射文件,對象的屬性get,set方法)
注意視圖所查詢出來的數(shù)據(jù)只能進行查看,不能增刪改!
例子數(shù)據(jù)庫為Mysql5.5,工具Navicat for MySQL
ok,有問題請舉手?

視圖的好處,可以主要分為四點:

我簡單的說一下,希望你能明白。

第一點:
使用視圖,可以定制用戶數(shù)據(jù),聚焦特定的數(shù)據(jù)。

解釋:
在實際過程中,公司有不同角色的工作人員,我們以銷售公司為例的話,
采購人員,可以需要一些與其有關(guān)的數(shù)據(jù),而與他無關(guān)的數(shù)據(jù),對他沒
有任何意義,我們可以根據(jù)這一實際情況,專門為采購人員創(chuàng)建一個視
圖,以后他在查詢數(shù)據(jù)時,只需select * from view_caigou 就可以啦。

第二點:使用視圖,可以簡化數(shù)據(jù)操作。

解釋:我們在使用查詢時,在很多時候我們要使用聚合函數(shù),同時還要
顯示其它字段的信息,可能還會需要關(guān)聯(lián)到其它表,這時寫的語句可能
會很長,如果這個動作頻繁發(fā)生的話,我們可以創(chuàng)建視圖,這以后,我
們只需要select * from view1就可以啦~,是不是很方便呀~

第三點:使用視圖,基表中的數(shù)據(jù)就有了一定的安全性

因為視圖是虛擬的,物理上是不存在的,只是存儲了數(shù)據(jù)的集合,我們可以
將基表中重要的字段信息,可以不通過視圖給用戶,視圖是動態(tài)的數(shù)據(jù)的集
合,數(shù)據(jù)是隨著基表的更新而更新。同時,用戶對視圖,不可以隨意的更改
和刪除,可以保證數(shù)據(jù)的安全性。

第四點:可以合并分離的數(shù)據(jù),創(chuàng)建分區(qū)視圖

隨著社會的發(fā)展,公司的業(yè)務(wù)量的不斷的擴大,一個大公司,下屬都設(shè)有很
多的分公司,為了管理方便,我們需要統(tǒng)一表的結(jié)構(gòu),定期查看各公司業(yè)務(wù)
情況,而分別看各個公司的數(shù)據(jù)很不方便,沒有很好的可比性,如果將這些
數(shù)據(jù)合并為一個表格里,就方便多啦,這時我們就可以使用union關(guān)鍵字,
將各分公司的數(shù)據(jù)合并為一個視圖。

以上,就是我認為視圖的作用,實際上很多公司都使用視圖來查詢數(shù)據(jù)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容