Как уже было описано выше, операция объединения соединяет данные из двух таблиц, формируя пары связанных строк из этих таблиц. При внутреннем объединении все записи, для которых не находится пары в другой таблице, просто игнорируются. Поэтому если строка одной из таблиц не имеет пары, то такое объединение (внутреннее) может привести к неожиданным результатам.
Рассмотрим следующий пример. Вывести список служащих и городов, где они работают
SELECT FAMILY, NAME, CITY
FROM zakazy.sluzhaschie s, zakazy.offisy o
WHERE o.id_ofc = s.id_ofc
Рис. 4.4 - Результат выполнения запроса внутреннего объединения |
Результат выполнения этого запроса приведен на Рис. 4.4.
Из приведенного результата видно, что в результирующую таблицу не вошли записи из таблицы offisy об офисе, расположенном в г. Омск, для которого еще не набраны служащие, и таблицы sluzhaschie об Уткине Денисе, который еще не получил назначение ни в один офис. Таким образом, если в таблицах объединения содержатся несвязанные (непарные) строки, то стандартный SQL приведет к потере информации.
Если мы хотим вывести сведения обо всех офисах, независимо от того, набраны в него служащие или еще нет, то правильный результат можно получить, выполнив запрос, приведенный ниже:
SELECT *
FROM zakazy.offisy o
LEFT JOIN zakazy.sluzhaschie s on o.id_ofc = s.id_ofc
Результат выполнения запроса показан на Рис. 4.5. Запрос, приведенный в данном примере, называется внешним (в данном случае левым) объединением таблиц.
Рис. 4.5 - Результат выполнения запроса левого внешнего объединения |
Как видно из приведенного примера, внешнее объединение может сохранить записи, для которых не находится соответствия в других наборах. При этом недостающие поля заполняются значениями NULL.