文章出處

      關于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 是對分組之后進行過濾

 


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()