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