SQL多表格查詢合并至單一聲明的常用方式_Mssql數(shù)據(jù)庫教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:教你一招:MSSQL數(shù)據(jù)庫索引的應(yīng)用
      一、索引的概念 索引就是加快檢索表中數(shù)據(jù)的方法。數(shù)據(jù)庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數(shù)據(jù)庫中,索引也允許數(shù)據(jù)庫程序迅

      在對跨多個表格的數(shù)據(jù)進(jìn)行組合時,有時很難搞清楚要使用哪一個SQL句法。我將在這里對將多個表格中的查詢合并至單一聲明中的常用方式進(jìn)行闡述。

      在這篇文章中的樣本查詢符合SQL92 ISO標(biāo)準(zhǔn)。不是所有的數(shù)據(jù)庫生產(chǎn)商都遵循這項(xiàng)標(biāo)準(zhǔn),而且很多廠商采取的提升措施會帶來一些意料不到的后果。如果你不確定你的數(shù)據(jù)庫是不是支持這些標(biāo)準(zhǔn),你可以參看生產(chǎn)廠商的有關(guān)資料。

      SELECT

      一個簡單的SELECT聲明就是查詢多個表格的最基本的方式。你可以在FROM子句中調(diào)用多個表格來組合來自多個表格的結(jié)果。這里是一個它如何工作的實(shí)例:

      SELECT table1.column1, table2.column2 FROM table1,

      table2 WHERE table1.column1 = table2.column1;

      這個實(shí)例中,我使用點(diǎn)號(table1.column1)來指定專欄來自哪一個表格。如果所涉及的專欄只在一個參考的表格中出現(xiàn),你就不需要加入完整的名稱,但是加入完整名稱會對可讀性起到幫助。

      在FROM子句中表格之間由逗號來分隔,你可以加入所需的任意多的表格,盡管一些數(shù)據(jù)庫有一個在引入正式的JOIN聲明之前他們可以有效地處理的內(nèi)容這方面的限制,這個將在下面談到。

      這個句法是一個簡單的INNER JOIN。一些數(shù)據(jù)庫將它看成與一個外部的JOIN是等同的。WHERE子句告知數(shù)據(jù)庫哪一個區(qū)域要做關(guān)聯(lián),而且它返回結(jié)果時,就像列出的表格在給定的條件下組合成一個單獨(dú)的表格一樣。值得注意的是,你的比較條件并不需要與你作為結(jié)果組返回的專欄相同。在上面的例子中,table1.column1和table2.column1用來組合表格,但是返回的卻是table2.column2。

      你可以在WHERE子句中使用AND關(guān)鍵字來將這個功能擴(kuò)展至多于兩個的表格。你還可以使用這樣的表格組合來限制你的結(jié)果而不用實(shí)際地從每個表格返回專欄。在下面的例子中,table3與table1匹配,但是我沒有從table3返回任何東西來顯示。我只是確保來自table1的有關(guān)專欄存在于table3之中。注意此例中table3需要在FROM子句中被引用。

      SELECT table1.column1, table2.column2 FROM table1,

      table2, table3 WHERE table1.column1 =

      table2.column1 AND table1.column1 = table3.column1;

      然而,要注意的是,這個查詢多個表格的方式是一個暗指的JOIN。你的數(shù)據(jù)庫可能對事物進(jìn)行不同的處理,這取決于它所使用的優(yōu)化引擎。而且,忽略對與WHERE子句的相關(guān)特性的定義將會給你帶來不愿看到的結(jié)果,例如從余下的查詢中返回與每一個可能的結(jié)果相關(guān)的專欄的rogue域,就像在CROSS JOIN之中一樣。

      如果你習(xí)慣于你的數(shù)據(jù)庫處理這種類型的聲明的方式,且你只對兩個或是少數(shù)幾個表格進(jìn)行組合,一個簡單的SELECT聲明就可以達(dá)到目的。

      JOIN

      JOIN的工作方式與SELECT聲明是相同的,它從不同的表格中返回一個帶有專欄的結(jié)果組。在暗含的JOIN之上使用外部JOIN的優(yōu)勢是對你的結(jié)果組的更好的控制,而且還可能在涉及很多個表格的情況下提升性能表現(xiàn)。

      JOIN的類型有幾種:LEFT,RIGHT,F(xiàn)ULL OUTER,INNER和CROSS。你所使用的類型是由你想要看到的結(jié)果所決定的。例如,使用LEFT OUTER JOIN將會從列出的第一個表格中返回所有有關(guān)的行,而同時如果沒有信息與第一個表格相關(guān)的話將潛在地從所列出的第二個表格中加入行。

      在這里INNER JOIN和暗含的JOIN是不同的,INNER JOIN將只返回那些在兩個表格中都有數(shù)據(jù)的行。

      對第一個SELECT查詢使用如下JOIN聲明:

      SELECT table1.column1, table2.column2 FROM table1 INNER JOIN table2

      ON table1.column1 = table2.column1;

      子查詢

      子查詢,或叫子選擇聲明,是在一個查詢中將結(jié)果組作為資源使用的一個途徑。他經(jīng)常被用來對結(jié)果進(jìn)行限制或定義,而不是運(yùn)行多個查詢或操縱應(yīng)用軟件之中的數(shù)據(jù)。有了子查詢,你可以參考表格來決定數(shù)據(jù)的內(nèi)含,或是在一些情況下,返回一個專欄,而這個專欄是一個子選擇的結(jié)果。

      下面的例子中使用了兩個表格。一個表格中包含了我想要返回的數(shù)據(jù),而另一個表格則給出一個比較點(diǎn)來確定什么數(shù)據(jù)是我確實(shí)感興趣的。

      以下為引用的內(nèi)容:
        SELECT column1 FROM table1 WHERE EXISTS
        ( SELECT column1 FROM table2
        WHERE table1.column1 = table2.column1 );

      子查詢很重要的一個方面就是性能表現(xiàn)。便利性是有代價的,它取決于你所使用的表格和聲明的大小,數(shù)量和復(fù)雜性,還有你可能會允許你的應(yīng)用軟件做處理工作。每一個查詢在被主查詢作為資源使用之前,都將被完整地單獨(dú)處理。如果可能的話,創(chuàng)造性地使用JOIN聲明可以以較少的滯后時間提供出相同的信息。

      分享:恢復(fù)系統(tǒng)數(shù)據(jù)庫
        msdb-包含了有關(guān)作業(yè)、報警及操作員等信息如果包含系統(tǒng)數(shù)據(jù)庫的介質(zhì)變了,那么必須重建系統(tǒng)數(shù)據(jù)庫,如果你仍然可以啟動SQL Server服務(wù),則可以通過RESTORE語句從系統(tǒng)數(shù)據(jù)庫的備份中恢復(fù)數(shù)據(jù)

      來源:模板無憂//所屬分類:Mssql數(shù)據(jù)庫教程/更新時間:2008-08-22
      相關(guān)Mssql數(shù)據(jù)庫教程