В предыдущих примерах естественного соединения результирующий набор данных включал только строки одной таблицы, которые имели соответствующие строки из другой таблицы. Иногда бывает необходимым получать в дополнение к строкам, имеющим такое соответствие, строки, не имеющие никакого соответствия, из одной или обеих таблиц. Подобная операция называется внешним соединением.
В примерах 6.58 и 6.59 показаны различия между естественным соединением и соответствующим ему внешним соединением. (Все примеры этого раздела используют таблицу employee_enh.)
В примере 6.58 используется естественное соединение для получения результирующего набора строк. Если вы хотите узнать все другие места проживания служащих, вам нужно использовать (левое) внешнее соединение. Оно называется левым внешним соединением, потому что возвращаются все строки таблицы с левой стороны оператора, независимо от того, есть ли соответствующая строка в таблице справа. Другими словами, если нет соответствующих строк в таблице с правой стороны, внешнее соединение все равно вернет строку из таблицы с левой стороны со значениями null для каждого столбца второй таблицы (см. пример 6.59). Database Engine использует оператор left outer join для задания левого внешнего соединения.
Правое внешнее соединение похоже на левое, только оно возвращает все строки таблицы в правой части выражения. Database Engine использует оператор right outer join для задания правого внешнего соединения.
Как вы можете видеть, когда не существует соответствующих строк в таблице с правой стороны (в данном случае department), левое внешнее соединение все равно возвращает строки из таблицы с левой стороны (employeeenh), а столбцы второй таблицы заполняются значениями null. В примере 6.60 показано использование операции правого внешнего соединения.
В дополнение к левому и правому внешнему соединению существует также и полное внешнее соединение, которое определяется как объединение левого и правого внешнего соединения. Другими словами, все строки из обеих таблиц представлены в результирующем наборе данных. Если нет соответствующей строки для одной из таблиц, ее столбцы будут возвращены с пустыми значениями null. Эта операция задается при помощи оператора full outer join.
Database Engine поддерживает внутренний синтаксис для левого и правого внешних соединений, *= и -'* только с целью обратной совместимости. Для использования этого нестандартного синтаксиса вам нужно изменить режим совместимости базы данных для SQL Server 2008, который равен 80.
Каждый оператор внешнего соединения может быть смоделирован при использовании оператора using плюс функция not exists. Пример 6.61 эквивалентен примеру с левым внешним соединением (см. пример 6.59).
Первый оператор select в объединении задает естественное соединение таблиц employee_enh и department со столбцами соединения domicile и location.
Этот оператор select отыскивает все города, которые в одно и то же время являются и местом проживания, и местом работы каждого служащего. Второй оператор select в объединении дополнительно отыскивает все строки из таблицы empioyeeenh, которые не соответствуют условию естественного соединения.