如果我有这样的查询:
SELECT A.ID, A.Name, A.Type, B.FirstName, B.LastName, B.DateOfBirth, C.OfficeName FROM A INNER JOIN B ON A.ContactID = B.ID INNER JOIN C ON B.OfficeID = C.ID WHERE A.Type = 1
什么时候应用A.Type = 1过滤器?是在联接之后,还是查询查找“ A”,确定其是否通过过滤器,然后仅联接到B和C(如果通过)?
希望这是有道理的。谢谢。
首先,下面是SQL的操作顺序:
在一个简单的查询中,过滤发生在FROM子句之后( 在此部分找到了联接 )。您上面的要求是,它首先将表与定义其关系的链接列连接在一起。在设置了记录( joins的结果 )之后,该WHERE子句就会发生,以筛选出Type等于1的位置。
FROM
WHERE
Type
这是使用的另一个示例LEFT JOIN,
LEFT JOIN
第一个查询:
SELECT A.ID, A.Name, A.Type, B.FirstName, B.LastName, B.DateOfBirth FROM A LEFT JOIN B ON A.ContactID = B.ID AND B.LastName = 'Michaels'
与第二个查询:
SELECT A.ID, A.Name, A.Type, B.FirstName, B.LastName, B.DateOfBirth FROM A LEFT JOIN B ON A.ContactID = B.ID WHERE B.LastName = 'Michaels'
第一个查询返回table中的所有记录A。是什么B.LastName = 'Michaels'做的是面前的桌子B将与表加入A,它过滤掉所有的记录中,其中LastName等于Michaels。因此,来自Table的记录A与在Table的过滤记录上不匹配的记录在Table的列B上将具有 NULL 值B。
A
B.LastName = 'Michaels'
B
LastName
Michaels
第二个查询将不会产生与第一个查询相同的结果,并且执行的结果也将完全相同,INNER JOIN因为在将记录合并之后,将对结果执行另一个过滤,并且仅接受LastName等于 Michaels的 记录。
INNER JOIN