在一個項目的實際開發過程中牽涉到複雜業務的時候,我們不可避免的需要使用中間表來進行資料連接配接,有的同學就說了,我可以采用Hibernate進行主外鍵進行關聯啊?多對多,多對一,一對一,等,采用主外鍵關聯在資料的操作過程中具有很強的耦合性,尤其對于需要經常删改資料表而言,我們是不建議采用主外鍵關聯這種模式,那麼,如果我們采用中間表的話,當資料過大在性能上又面臨嚴峻考驗,sql視圖的出現,在解決中間表的業務邏輯上是不錯的選擇。ok,首先我們了解什麼是視圖?
1、視圖是表?沒錯,但是是一張虛拟表,視圖的字段是由我們自定義的,視圖隻供查詢,資料不可更改,查詢資料來源于我們建立的實體表。
2、使用視圖的優勢?視圖可以将多個複雜關聯表,提取出我們需要的資訊,優化查詢速度。
如何建立視圖?
我們先建立三張表;如下:
這個是典型的一對多和一對一的關系,那麼,假如每張表的資料都在一萬條資料以上,現在查詢在潢高上學的學生姓名?
首先,我們分析一下,在潢高上學?首先是一個高中,那麼我們會有一條Sql where school='潢高',
查詢出一個List,得到gradeids,然後再到grade中根據gradeids查詢這麼多grades對應的studentids,在使用這些studentsid查詢出students循環最後得到name?
是不是很累贅?查詢是不是很影響性能?
觀察得知,這三張表每兩張表之間都是通過id進行關聯的,如果我們通過id将三張表組成一張表,是不是很友善?
我們來關聯學校表和年級表:這個年級ID我們不要,ok?
1
<code>select</code> <code>s.id </code><code>as</code> <code>schoolId,s.school </code><code>as</code> <code>schoolName,s.gradeid </code><code>as</code> <code>gradeid,g.grade </code><code>as</code> <code>gradeName,g.studentid </code><code>as</code> <code>studentid </code><code>from</code> <code>school s,grade g </code><code>where</code> <code>s.gradeid=g.id;</code>
<a href="http://s3.51cto.com/wyfs02/M02/45/FF/wKioL1PtkubC7NSTAAB2kqmCXfY098.jpg" target="_blank"></a>
那麼我們再關聯上學生表,學生表的id等于年級表的studentid ok?
2
<code>SELECT</code> <code>s.id </code><code>as</code> <code>schoolId,s.school </code><code>as</code> <code>schoolName,s.gradeid </code><code>as</code> <code>gradeid,g.grade </code><code>as</code> <code>gradeName,g.studentid </code><code>as</code> <code>studentid ,t.`</code><code>name</code><code>` </code><code>as</code> <code>studentName,t.age </code><code>as</code> <code>studentAge</code>
<code>from</code> <code>school s,grade g,student t </code><code>where</code> <code>s.gradeid=g.id </code><code>and</code> <code>g.studentid=t.id;</code>
ok,到了這裡?我們再看運作結果?
<a href="http://s3.51cto.com/wyfs02/M01/46/00/wKioL1Ptk-SAsUfIAAC4KIhRufE356.jpg" target="_blank"></a>
那麼我們想查詢在潢高上學的學生姓名,where schoolName='潢高',擷取的list循環得到Object,通過Object.getStudentName,就可以了?
是以需要将查詢到的結果,建立為一張虛拟表,這樣才能操作,通過這個create view 視圖名 as 指令建立:
意思就是将查詢結果建立為名稱為table_sgt的一張虛拟表:
<code>create</code> <code>view</code> <code>table_sgt </code><code>as</code><code>(</code><code>select</code> <code>s.id </code><code>as</code> <code>schoolId,s.school </code><code>as</code> <code>schoolName,s.gradeid </code><code>as</code> <code>gradeid,g.grade </code><code>as</code> <code>gradeName,g.studentid </code><code>as</code> <code>studentid ,t.`</code><code>name</code><code>` </code><code>as</code> <code>studentName,t.age </code><code>as</code> <code>studentAge </code><code>from</code> <code>school s,grade g,student t </code><code>where</code> <code>s.gradeid=g.id </code><code>and</code> <code>g.studentid=t.id);</code>
<a href="http://s3.51cto.com/wyfs02/M00/46/00/wKioL1PtlZuQiR_8AABou7EhE2g895.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M02/45/FF/wKiom1PtlKyj-cb_AAEt4kosx98924.jpg" target="_blank"></a>
我們在使用視圖的時候,需要把它看做為一張表,建立一張實體表需要做的步驟,視圖也都需要(例如,執行個體化,配置映射檔案,對象的屬性get,set方法)
注意視圖所查詢出來的資料隻能進行檢視,不能增删改!
例子資料庫為Mysql5.5,工具Navicat for MySQL
ok,有問題請舉手?
本文轉自 小夜的傳說 51CTO部落格,原文連結:http://blog.51cto.com/1936625305/1540417,如需轉載請自行聯系原作者