- 对于内连接的两个表,驱动表中的记录在被驱动表中找不到匹配的记录,该记录不会加入到最后的结果集。
- 对于外连接的两个表,驱动表中的记录即使在被驱动表中没有匹配的记录, 也仍然需要加入到结果集。
在 MySQL 中,根据选取驱动表的不同,外连接仍然可以细分为 2 种:
- 左外连接,选取左侧的表为驱动表。
- 右外连接,选取右侧的表为驱动表。
外连接
即使对于外连接来说,有时候我们也并不想把驱动表的全部记录都加入到最后的结果集。怎么办?把过滤条件分为两种就可以就解决这个问题了,所以放在不同地方的过滤条件是有不同语义的:WHERE 子句中的过滤条件
不论是内连接还是外连接,凡是不符合 WHERE 子句中的过滤条件的记录都不会被加入最后的结果集。ON 子句中的过滤条件
对于**外连接的驱动表的记录来说,如果无法在被驱动表中找到匹配 ON 子句中的过滤条件的记录,那么该记录仍然会被加入到结果集中,对应的被驱动表记录的各个字段使用 NULL 值填充。
需要注意的是,这个 ON 子句是专门为外连接驱动表中的记录在被驱动表找不到匹配记录时应不应该把该记录加入结果集这个场景下提出的,所以如果把 ON 子句放到内连接中,MySQL 会把它和 WHERE 子句一样对待,也就是说:内连接**中的 WHERE 子句和 ON 子句是等价的。
一般情况下,我们都把只涉及单表的过滤条件放到 WHERE 子句中,把涉及两表的过滤条件都放到 ON 子句中,我们也一般把放到 ON 子句中的过滤条件也称之为连接条件。
内连接
连接的本质就是把各个连接表中的记录都取出来依次匹配的 组合加入结果集并返回给用户。不论哪个表作为驱动表,两表连接产生的笛卡尔 积肯定是一样的。而对于内连接来说,由于凡是不符合 ON 子句或 WHERE 子句 中的条件的记录都会被过滤掉,其实也就相当于从两表连接的笛卡尔积中把不符 合过滤条件的记录给踢出去,所以对于内连接来说,驱动表和被驱动表是可以互 换的,并不会影响最后的查询结果。
但是对于外连接来说,由于驱动表中的记录即使在被驱动表中找不到符合 ON 子句条件的记录时也要将其加入到结果集,所以此时驱动表和被驱动表的关系就很重要了,也就是说左外连接和右外连接的驱动表和被驱动表不能轻易互换。