天天看點

sql之淺談視圖的作用

    在一個項目的實際開發過程中牽涉到複雜業務的時候,我們不可避免的需要使用中間表來進行資料連接配接,有的同學就說了,我可以采用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,如需轉載請自行聯系原作者