English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Оператор SQL FULL JOIN

В этом руководстве вы узнаете, как использовать SQL Full Join для извлечения данных из двух таблиц.

Использование полного 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, чтобы указать, что данные отсутствуют.