Внешние соединения
Напомним, что внутреннее соединение возвращает только те строки, для которых условие соединения принимает значение true. Иногда требуется включить в результирующий набор большее количество строк.
Вспомним, запрос вида
SELECT first_name, last_name, department
FROM employee e, department d
WHERE e.dept_no = d.dept_no
возвращает только те строки, для которых условие соединения (e.dept_no = d.dept_no) принимает значение true.
Внешнее соединение возвращает все строки из одной таблицы и только те строки из другой таблицы, для которых условие соединения принимает значение true. Строки второй таблицы, не удовлетворяющие условию соединения (т.е. имеющие значение false), получают значение null в результирующем наборе.
Существует два вида внешнего соединения: LEFT JOIN и RIGHT JOIN.
В левом соединении (LEFT JOIN) запрос возвращает все строки из левой таблицы (т.е. таблицы, стоящей слева от зарезервированного словосочетания “LEFT JOIN”) и только те из правой таблицы, которые удовлетворяют условию соединения. Если же в правой таблице не найдется строк, удовлетворяющих заданному условию, то в результате они замещаются значениями null.
Для правого соединения - все наоборот.
SELECT first_name, last_name, department
FROM employee e LEFT JOIN department d
ON e.dept_no = d.dept_no
получить список сотрудников
и название их отделов,
включая сотрудников, еще
не назначенных ни в какой отдел
FIRST_NAME LAST_NAME DEPARTMENT
=============== ============== =====================
Robert Nelson Engineering
Bruce Young Software Development
Kim Lambert Field Office: East Coast
Leslie Johnson Marketing
Phil Forest Quality Assurance
...
В данном запросе все сотрудники оказались распределены по отделам, иначе названия отделов заместились бы значением null.
А вот пример правого соединения:
SELECT first_name, last_name, department
FROM employee e RIGHT JOIN department d
ON e.dept_no = d.dept_no
получить список сотрудников
и название их отделов,
включая отделы, в которые еще
не назначены сотрудники
FIRST_NAME LAST_NAME DEPARTMENT
=============== ============= =========================
Terri Lee Corporate Headquarters
Oliver H. Bender Corporate Headquarters
Mary S. MacDonald Sales and Marketing
Michael Yanowski Sales and Marketing
Robert Nelson Engineering
Kelly Brown Engineering
Stewart Hall Finance
Walter Steadman Finance
Leslie Johnson Marketing
Carol Nordstrom Marketing
<null> <null> Software Products Div.
Bruce Young Software Development
...
В результирующий набор входит и отдел “Software Products Div.” (а также отдел “Field Office: Singapore”, не представленный здесь), в котором еще нет ни одного сотрудника.