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