inner join(等值連接)
默認join方式,如果不加修飾詞
只返回兩個表中聯結字段相等的行
left join(左連接)
返回包括左表中的所有記錄和右表中聯結字段相等
right join(右連接)
與左連接相反
full join(全連接)
返回左表和右表中的所有行。當某行在另一個表中沒有匹配行時,則另一個表的選擇列表列包含空值。
即左連接、右連接結果的合並
非等連接
使用等值以外的條件來匹配左、右兩個表中的行
select A.c1,B.c2 from A join B on A.c3 != B.c3;
舉例說明
表Article和表ArticleComment分別表示“文章”和“文章評論”,ArticleComment有Article外鍵ArticleId。表設計為:
表Article數據如下:
表ArticleComment數據如下:
需要注意的是,嚴格來說,任意的ArticleComment都應該有外鍵ArticleId,這里為了說明join,沒有嚴格要求,ArticleId可以為空。
inner join(等值連接)
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
join ArticleComment on Article.Id=ArticleComment.ArticleId
結果:
left join(左連接)
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
left join ArticleComment on Article.Id=ArticleComment.ArticleId
結果:
right join(右連接)
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
right join ArticleComment on Article.Id=ArticleComment.ArticleId
結果:
full join(全連接)
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
full join ArticleComment on Article.Id=ArticleComment.ArticleId
結果:
非等連接
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
join ArticleComment on Article.Id!=ArticleComment.ArticleId
結果:
技巧
Left right join 多表的連接順序
多表左/右連接,表的連接順序也可以影響查詢速度
左連接時,應該把小表放在前面連接
例子:
A、B、C三表左連接
情況1:
A先和B連接,得到100條記錄
100條記錄再和C左連接
情況2:
A先和C連接,得到50條記錄
50條記錄再和B左連接
右連接時,把小表放在后面連接