让我们检查您的第二个查询:
例如,我们使用下表:
-- t1
id name
1 Tim
2 Marta
-- t2
id name
1 Tim
3 Katarina
重要提示:并非表 t1 的所有主键都存在于表 t2 中,反之亦然!
CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `t2` (
`id` int(11) NOT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `t1` VALUES (1,'Tim'),(2,'Marta');
INSERT INTO `t2` VALUES (1,'Tim'),(3,'Katarina');
现在我们运行您的查询:
SELECT *
FROM t1
JOIN t2
ON t1.id <> t2.id
结果集是:
id name id name
===========================
2 Marta 1 Tim
1 Tim 3 Katarina
2 Marta 3 Katarina
发生了什么?您选择了所有不匹配的组合!
让我们看一下 FULL OUTER JOIN 的定义:
FULL OUTER JOIN结合了左外连接和右外连接的结果,并从表两侧的表中返回所有(匹配或不匹配的)行。
好的,我们还需要左右外连接的定义:
LEFT OUTER JOIN返回左表中的所有记录,而不考虑与右表的匹配。
RIGHT OUTER JOIN返回右表中的所有记录,而不考虑与左表的匹配。
让我们手动执行此操作:
LEFT OUTER JOIN 从左表返回 Tim 和 Marta,其中 Tim 作为唯一匹配项:
id name id name
===========================
1 Tim 1 Tim
2 Marta NULL NULL
RIGHT OUTER JOIN 从右表返回 tim 和 katarina,其中 Tim 作为唯一匹配项:
id name id name
===========================
1 Tim 1 Tim
NULL NULL 3 Katarina
如果我们将这两者结合到一个 FULL OUTER JOIN 我们得到:
id name id name
===========================
1 Tim 1 Tim
2 Marta NULL NULL
NULL NULL 3 Katarina
这是正确的结果集。在 MySQL 中,这可以通过左右外连接的 UNION 来完成:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`
UNION
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;