English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве вы узнаете, как использовать SQL Full Join для извлечения данных из двух таблиц.
FULL JOIN возвращает все строки из таблиц, которые объединяются, независимо от того, соответствуют они или нет, то есть можно сказать, что полный JOIN сочетает в себе LEFT JOINиRIGHT JOINПолный JOIN — этоодной из функций внешнего JOIN.поэтому также называетсяfull outer join
Ниже приведена диаграмма Вени, которая объясняет, как работает полный JOIN.
Внимание:Внешний JOIN — это JOIN, который включает строки в результирующем наборе, даже если строки, которые нужно объединить, могут не соответствовать.
Чтобы清楚地 понять это, давайте рассмотрим нижеemployeesиdepartmentsТаблица。
+--------+--------------+------------+---------+ | emp_id | emp_name | дата найма | dept_id | +--------+--------------+------------+---------+ | 1 | Этан Хант | 01.05.2001 | 4 | | 2 | Тони Монтана | 15.07.2002 | 1 | | 3 | Сара Коннор | 18.10.2005 | 5 | | 4 | Рик Деккард | 03.01.2007 | 3 | | 5 | Мартин Бланк | 24.06.2008 | NULL | +--------+--------------+------------+---------+ | +---------+------------------+ | dept_id | dept_name | +---------+------------------+ | 1 | Управление | | 2 | Customer Service | | 3 | Finance | | 4 | Human Resources | | 5 | Sales | +---------+------------------+ | |
Таблица: employees | Таблица: departments |
Теперь, предположим, что вы хотите retrieve имена всех сотрудников и названия доступных отделов, независимо от того, есть ли у них соответствующие строки в другой таблице. В этом случае вы можете использовать полное соединение, как показано ниже.
Следующие строки подключают таблицы employee и department с помощью общего поля dept_id, чтобы получить информацию о всех отделах и всех сотрудниках.
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 FULL JOIN departments AS t2 ON t1.dept_id = t2.dept_id ORDER BY emp_name;
Некоторые базы данных (например, Oracle, MySQL) не поддерживают полные соединения. В этом случае вы можете использовать оператор UNION ALL для комбинирования LEFT JOIN и RIGHT JOIN, как показано ниже:
SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 LEFT JOIN departments AS t2 ON t1.dept_id = t2.dept_id UNION ALL SELECT t1.emp_id, t1.emp_name, t1.hire_date, t2.dept_name FROM employees AS t1 RIGHT JOIN departments AS t2 ON t1.dept_id = t2.dept_id ORDER BY emp_name;
После выполнения вышеуказанной команды, вы получите следующий результат:
+--------+--------------+------------+------------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+------------------+ | NULL | NULL | NULL | Customer Service | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 5 | Martin Blank | 2008-06-24 | NULL | | 4 | Rick Deckard | 2007-01-03 | Finance | | 4 | Rick Deckard | 2007-01-03 | Finance | | 3 | Sarah Connor | 2005-10-18 | Sales | | 3 | Sarah Connor | 2005-10-18 | Sales | | 2 | Tony Montana | 2002-07-15 | Administration | | 2 | Tony Montana | 2002-07-15 | Administration | +--------+--------------+------------+------------------+
Как вы видите, результат включаетdepartmentsиemployeesВсе строки в таблице.
Совет:В запросе с объединением, левая таблица - это таблица, которая出现在 слева в предложении JOIN, а правая таблица - это таблица, которая出现在 справа.
Внимание:Когда выполняется внешнее объединение, если DBMS (система управления базами данных) не может найти ни одной строки, то в столбце он ставит NULL, чтобы указать, что данные отсутствуют.