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

Запрос LEFT JOIN возвращает все записи из левой таблицы, даже в том случае, если у них нет совпадений в правой. Это означает, что даже если у нас не будет совпадений в левой таблице, мы получим запись в которая будет содержать колонки со значением NULL.

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


SELECT таблица1.колонка1, таблица2.колонка2...
FROM таблица1
LEFT 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> SELECT ID, NAME, TASK_NAME, DEADLINE 
FROM developers 
LEFT 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       |
+----+-------------------+-------------+------------+

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

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