联接表的列中的 null 值(如果有)互相不匹配。如果其中一个联接表的列中出现空值,只能通过外部联接返回这些空值(除非 WHERE 子句不包括空值)。
下面的两个表中,每个表中要参与联接的列中均包含 NULL 值:
将列 a 中的值与列 c 中的值进行比较的联接在包含 NULL 值的列上不会获得匹配项:
SELECT
*
FROM [dbo].[Table_1] AS a
INNER JOIN [dbo].[Table_2] AS b
ON ([a].[a] = [b].[ c ])
*
FROM [dbo].[Table_1] AS a
INNER JOIN [dbo].[Table_2] AS b
ON ([a].[a] = [b].[ c ])
另外,从基表返回的空值与从外部联接返回的空值很难区分开。例如,下面的 SELECT 语句对这两个表执行左向外部联接:
SELECT
*
FROM [dbo].[Table_1] AS a
LEFT JOIN [dbo].[Table_2] AS b
ON ([a].[a] = [b].[ c])
*
FROM [dbo].[Table_1] AS a
LEFT JOIN [dbo].[Table_2] AS b
ON ([a].[a] = [b].[ c])
总结:NULL表示未知,所以在和任何其他值进行匹配时候都是返还的未知,所以在连接查询的时候 ON 条件后返回的是两个表的该记录是否匹配,结果需要true or false,当遇到NULL值,返回的是未知,所以不会返回数据。这是在连接查询时候切记。