2 番目のクエリを調べてみましょう。
例として、次のテーブルを使用しています。
-- 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は、左右両方の外部結合の結果を結合し、テーブルの両側のテーブルからすべての (一致または不一致の) 行を返します。
OK、左右の外部結合の定義も必要です。
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
これら 2 つを 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`;