Пример 2. Соединение трех таблиц
Найдите фамилии работников, отделы в которых они работают и названия их должностей.
В результирующую таблицу необходимо поместить столбцы last_name, department, job_title из трех исходных таблиц: employee, department, job, поэтому в запросе следует выполнить соединение трех таблиц. Таблицы department и employee могут быть соединены так же, как и в примере 1. Таблицы employee и job могут быть соединены с помощью более сложного условия:
employee.job_code = job.job_code AND employee.job_grade = job.job_grade AND employee.job_country = job.job_country
так как они соединены с помощью сложного внешнего ключа. В результате каждый работник будет связан с названием своей должности. Окончательно запрос будет выглядеть так:
SELECT last_name, department, job_title FROM employee, e department d, job j WHERE e.dept_no = d.dept_no AND e.job_code = j.job_code AND e.job_grade = j.job_grade AND e.job_country = j.job_country
LAST_NAME DEPARTMENT JOB_TITLE ============ ========================= ======================== Nelson Engineering Vice President Young Software Development Engineer Lambert Field Office: East Coast Engineer Johnson Marketing Marketing Analyst Forest Quality Assurance Manager Weston Field Office: East Coast Sales Representative Lee Corporate Headquarters Administrative Assistant Hall Finance Financial Analyst Young Customer Support Manager Papadopoulos Research and Development Manager ....
Стандарт SQL позволяет использовать вариант формулировки запроса c помощью предложений FROM table1 JOIN table2 ON col1=col2 как в примере 1:
SELECT last_name, department, job_title FROM (employee e JOIN department d ON d.dept_no= e.dept_no) JOIN job j ON e.job_code = j.job_code AND e.job_grade = j.job_grade AND e.job_country = j.job_country
или
SELECT last_name, department, job_title FROM (employee e JOIN job j ON e.job_code = j.job_code AND e.job_grade = j.job_grade AND e.job_country = j.job_country) JOIN department d ON d.dept_no= e.dept_no
Таким же образом можно соединить и большее количество таблиц.
Внешние соединения
При выполнении операции соединения, данные из двух таблиц комбинируются с образованием пар связанных строк, в которых значения сопоставляемых столбцов являются одинаковыми. Если одно из значений в сопоставляемом столбце одной таблицы не совпадает ни с одним из значений в сопоставляемом столбце другой таблицы, то соответствующая строка удаляется из результирующей таблицы. Именно это правило применялось во всех рассмотренных выше примерах соединения таблиц. Предусмотрен и другой набор инструкций соединений, называемых внешними соединениями. Во внешнем соединении в результирующую таблицу помещаются также строки, не удовлетворяющие условию соединения.
Найдите номера руководителей отделов, названия отделов и их фамилии.
Применим внутреннее соединение:
SELECT mngr_no, department, last_name FROM employee e JOIN department d ON d.mngr_no= e.dept_no
MNGR_NO DEPARTMENT LAST_NAME
======= =================== ============
121 Field Office: Italy Osborne
В результате мы нашли единственную строку, для которой выполняется равенство в сопоставляемых столбцах. Далее рассмотрим варианты этого запроса.
Существуют три типа внешних соединений: левое, правое и полное. Рассмотрим особенности каждого из них на приведенных ниже примерах.
