Руководство по SQL. FULL JOIN.

Элемент FULL JOIN комбинирует результаты элементов LEFT JOIN и RIGHT JOIN. Результатом такого запроса станет таблица, которые содержит все записи левой и правой таблицы, а колонки записей без совпадений будут иметь значение NULL.

Запрос с использованием FULL JOIN имеет следующий вид:


SELECT таблица1.колонка1, таблица2.колонка2...
FROM таблица1
FULL JOIN таблицы2
ON таблицы1.общее_поле = таблица2.общее_поле;

Пример:

Предположим, что у нас есть две таблицы:
developers:


+----+-------------------+------------+------------+--------+
| ID | NAME              | SPECIALTY  | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
|  1 | Eugene Suleimanov | Java       |          2 |   2500 |
|  2 | Peter Romanenko   | Java       |          3 |   3500 |
|  3 | Andrei Komarov    | JavaScript |          3 |   2500 |
|  4 | Konstantin Geiko  | C#         |          2 |   2000 |
|  5 | Asya Suleimanova  | UI/UX      |          2 |   1800 |
|  6 | Kolya Nikolaev    | Javascript |          5 |   3400 |
|  7 | Ivan Ivanov       | C#         |          1 |    900 |
|  8 | Ludmila Geiko     | UI/UX      |          2 |   1800 |
+----+-------------------+------------+------------+--------+

tasks:


+---------+-------------+------------------+------------+--------------+
| TASK_ID | TASK_NAME   | DESCRIPTION      | DEADLINE   | DEVELOPER_ID |
+---------+-------------+------------------+------------+--------------+
|       1 | Bug#123     | Fix company list | 2016-06-03 |            1 |
|       2 | Bug#321     | Fix registration | 2016-06-06 |            2 |
|       3 | Feature#777 | Latest actions   | 2016-06-25 |            3 |
+---------+-------------+------------------+------------+--------------+

Стоит отметить, что MySQL не поддерживает FULL JOIN, поэтому запрос для получения аналогичного результата для этой RDBMS будет иметь следующий вид:


mysql> SELECT ID, NAME, TASK_NAME, DEADLINE 
FROM developers 
LEFT JOIN tasks 
ON developers.ID = tasks.DEVELOPER_ID 
UNION ALL 
SELECT ID, NAME, TASK_NAME, DEADLINE 
FROM developers 
RIGHT JOIN tasks 
ON developers.ID = tasks.DEVELOPER_ID ;

В результате мы получим следующую таблицу:


+------+-------------------+-------------+------------+
| ID   | NAME              | TASK_NAME   | DEADLINE   |
+------+-------------------+-------------+------------+
|    1 | Eugene Suleimanov | Bug#123     | 2016-06-03 |
|    2 | Peter Romanenko   | Bug#321     | 2016-06-06 |
|    3 | Andrei Komarov    | Feature#777 | 2016-06-25 |
|    4 | Konstantin Geiko  | NULL        | NULL       |
|    5 | Asya Suleimanova  | NULL        | NULL       |
|    6 | Kolya Nikolaev    | NULL        | NULL       |
|    7 | Ivan Ivanov       | NULL        | NULL       |
|    8 | Ludmila Geiko     | NULL        | NULL       |
|    1 | Eugene Suleimanov | Bug#123     | 2016-06-03 |
|    2 | Peter Romanenko   | Bug#321     | 2016-06-06 |
|    3 | Andrei Komarov    | Feature#777 | 2016-06-25 |
| NULL | NULL              | Feature#3   | 2016-06-15 |
+------+-------------------+-------------+------------+

Как видите, мы получили все записи из обеих таблиц, соответствующие колонки записей, без совпадений имеют значение NULL.

На этом мы заканчиваем изучение FULL JOIN.