1. 程式人生 > >SQL 中的連線查詢

SQL 中的連線查詢

      關於SQL的應用,肯定離不開查詢,而相對複雜的查詢,總是離不開對錶的連線,單個表操作的並不罕見,但是在應用環境大多數的查詢都是針對2、3個表甚至更多的表7,至於連線,有內連線、外連結、交叉連線之分,每種連線方式都有各自的查詢關鍵字去執行。此時猶記學時對這些概念含糊不分,不知所謂,總是認為課本的知識玄幻深奧,概念晦澀難懂,當然我也時常歸咎於是本校師生隨手“影印”的教材。

  一、 內連線(通過關聯資訊匹配資料)

     1.等值連線(=,有重複)  2.不等值連線(不等式、大小於)   3.自然連線(=,無重複,通過過濾條件)

SELECT * FROM a,b  WHERE a.id =
b.id --(ANSI連線語法,SQL92標準以前的寫法) SELECT * FROM a INNER JOIN b ON a.id = b.id --( SQL92標準寫法)

  二、 外連線

      1. 左連線(Left Join) 不管能否匹配到on的條件,左表資料均會完整顯示

      2. 右連線(Right Join) 不管能否匹配到on的條件,右表資料均會完整顯示

      3. 全連線(Full Join)  一定條件下(列名、列數一致),可用Union all 代替

 當出現多個外連結(三路外連線)時,比如,需要連線兩個Left Join

 則,A表由5條資料,第一次Left 結束結果是5條,第二次 Left 結束之後結果仍然還是為5條

三、交叉連線(笛卡爾積)

    實際應用中很少接觸,查詢結果初看亂七八糟,互相匹配,造成的重複值較多

SELECT * FROM a CROSS JOIN b 

以上只是些許概念,課本上網上都能查到,實際上在做這些查詢的時候,往往伴隨著條件的過濾,想要寫好SQL,第一步是要明白這些條件的執行順序

SQl順序 from -> Join on -> where -> group by -> having -> select -> distinct -> order by -> top

至於比較混淆的幾點:

① Where 和 On 的區別 (Inner中無差別) 

  由於Left、right (資料完整)的特殊性,使Where 和 on 對查詢過濾產生了不同結果,因為On的查詢優先於Where,如在 left 查詢中,where 是對 查詢後左表資料進行過濾,可使左表最後資料不完整,而使用on ,對最終 左表資料的完整性無影響

②  Where  和 Having 的區別

  這一點其實是很好區分的,Having的使用 一定伴隨著 聚合函式 Group by 的出現,Where 是對分組之前進行過濾,having 是對分組之後進行過濾