Ответ, который Пабло Санта-Крус дал, является правильным; однако, в случае, если кто-то наткнулся на эту страницу и хочет получить больше разъяснений, вот подробное описание.
Примеры таблиц
Предположим, у нас есть следующие таблицы:
-- t1
id name
1 Tim
2 Marta
-- t2
id name
1 Tim
3 Katarina
Внутренние соединения
Внутреннее соединение, вот так:
SELECT *
FROM `t1`
INNER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
Получит нам только записи, которые появляются в обеих таблицах, например:
1 Tim 1 Tim
Внутренние объединения не имеют направления (например, влево или вправо), поскольку они явно двунаправлены - нам требуется совпадение с обеих сторон.
Внешние соединения
Внешние объединения, с другой стороны, предназначены для поиска записей, которые могут не совпадать в другой таблице. Таким образом, вы должны указать , какой стороне объединения разрешено иметь отсутствующую запись.
LEFT JOIN
и RIGHT JOIN
являются сокращениями для LEFT OUTER JOIN
и RIGHT OUTER JOIN
; Я буду использовать их полные имена ниже, чтобы усилить концепцию внешних объединений против внутренних объединений.
левое внешнее соединение
Левое внешнее соединение, вот так:
SELECT *
FROM `t1`
LEFT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
... получит все записи из левой таблицы независимо от того, совпадают ли они в правой таблице, например:
1 Tim 1 Tim
2 Marta NULL NULL
правое внешнее соединение
Правое внешнее соединение, например:
SELECT *
FROM `t1`
RIGHT OUTER JOIN `t2` ON `t1`.`id` = `t2`.`id`;
... получит все записи из правой таблицы независимо от того, совпадают ли они в левой таблице, например:
1 Tim 1 Tim
NULL NULL 3 Katarina
полное внешнее соединение
Полное внешнее объединение даст нам все записи из обеих таблиц, независимо от того, имеют ли они совпадение в другой таблице, с NULL с обеих сторон, где нет совпадения. Результат будет выглядеть так:
1 Tim 1 Tim
2 Marta NULL NULL
NULL NULL 3 Katarina
Однако, как отметил Пабло Санта Круз, MySQL не поддерживает это. Мы можем эмулировать его, выполнив СОЮЗ левого соединения и правого соединения, например:
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`;
Вы можете думать о UNION
как о значении «выполнить оба этих запроса, а затем поместить результаты друг на друга»; некоторые строки будут получены из первого запроса, а некоторые из второго.
Следует отметить, что UNION
в MySQL устранит точные дубликаты: Тим появится здесь в обоих запросах, но результат UNION
перечислит его только один раз. Мой коллега по базе данных гуру считает, что на такое поведение нельзя полагаться. Чтобы быть более точным, мы могли бы добавить предложение WHERE
ко второму запросу:
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`
WHERE `t1`.`id` IS NULL;
С другой стороны, если вы хотели бы по какой-либо причине видеть дубликаты, вы можете использовать UNION ALL
.