SQL联接查询
1、内联接(inner join)。
内联接,显示连接表都有的记录,并按最多记录子表显示最终结果。
1 select * from table1 a 2 inner join table2 b on a.Id = b.Id 3 where a.field...
2、外联接(outer join)。
外联接,又分为左联接(left join)和右联接(right join),显示主表所有记录,而子没有相关记录部分返回‘NULL’。outer join默认为左联接。
1 select * from table1 a 2 left join table2 b on a.Id = b.Id --显示table1的所有记录,table2不存在记录部分返回NULL 3 4 select * from table1 a 5 right join table2 b on a.Id = b.Id --显示table2的所有记录,table1不存在记录部分返回NULL
如果我们把两表的所有记录都显示出来,以查看哪些表不存在记录,可以使用完整外部联接(full outer join)。
1 select * from table1 a 2 full outer join table2 b on a.Id = b.Id --返回两表的所有记录,两表互不存在的记录部分返回Null
联接类型 |
保留数据行 |
A left outer join B |
all A rows |
A right outer join B |
all B rows |
A full outer join B |
all A and B rows |
3、交叉联接(Cross join)。
返回两个表的笛卡尔积(M * N 行记录)。效率低下,使用范围小。
1 select * from table1 2 cross join table2
4、表值内联(Cross apply)。
其实跟inner join差不多,只不过联接部分是function返回值的集合。
1 CREATE FUNCTION dbo.fn_Apply(@sID int) 2 RETURNS @Apply TABLE (cName nvarchar(50), major nvarchar(50)) 3 AS 4 BEGIN 5 INSERT @Apply SELECT cName, major FROM Apply where [sID] = @sID 6 RETURN 7 END 8 9 ---- Student cross apply function fn_Apply. 10 SELECT Student.sName, Student.GPA, Student.sizeHS, 11 cName, major 12 FROM Student CROSS APPLY dbo.fn_Apply([sID])
5、表值外联(Outer apply)。
跟outer join差不多,跟cross apply差不多。
1 SELECT Student.sName, Student.GPA, Student.sizeHS, 2 cName, major 3 FROM Student OUTER APPLY dbo.fn_Apply([sID])