-
Notifications
You must be signed in to change notification settings - Fork 22
sql join详解
L edited this page Mar 11, 2020
·
6 revisions
默认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可以为空。
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
join ArticleComment on Article.Id=ArticleComment.ArticleId
结果:
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
left join ArticleComment on Article.Id=ArticleComment.ArticleId
结果:
select Article.Id,Article.Name,ArticleComment.Id as 'ArticleCommentId',ArticleComment.[Content],ArticleComment.ArticleId
from Article
right join ArticleComment on Article.Id=ArticleComment.ArticleId
结果:
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 多表的连接顺序
多表左/右连接,表的连接顺序也可以影响查询速度
左连接时,应该把小表放在前面连接
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
例子:
A、B、C三表左连接
情况1:
A先和B连接,得到100条记录
100条记录再和C左连接
情况2:
A先和C连接,得到50条记录
50条记录再和B左连接
右连接时,把小表放在后面连接
RIGHT JOIN 关键字从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。