LEFT JOIN в SQL

Оператор LEFT JOIN возвращает все строки из левой таблицы вместе со строками из правой таблицы, для которых выполняется условие объединения. Вот, как это выглядит на диаграмме Венна.

LEFT JOIN — вся левая таблица и совпадения

LEFT JOIN — это тип внешнего объединения, поэтому его также называют LEFT OUTER JOIN. Другие разновидности внешнего объединения — RIGHT JOIN и FULL JOIN.

Примечание. При внешнем объединении в результате в любом случае будут какие-то строки, даже если между строками в двух объединяемых таблицах нет соответствия.

Давайте рассмотрим, как работает LEFT JOIN на примере. У нас есть две таблицы сотрудников employees и отделов departments

Таблица employees Таблица departments
+--------+--------------+------------+---------+
| emp_id | emp_name     | hire_date  | dept_id |
+--------+--------------+------------+---------+
|      1 | Ethan Hunt   | 2001-05-01 |       4 |
|      2 | Tony Montana | 2002-07-15 |       1 |
|      3 | Sarah Connor | 2005-10-18 |       5 |
|      4 | Rick Deckard | 2007-01-03 |       3 |
|      5 | Martin Blank | 2008-06-24 |    NULL |
+--------+--------------+------------+---------+
+---------+------------------+
| dept_id | dept_name        |
+---------+------------------+
|       1 | Administration   |
|       2 | Customer Service |
|       3 | Finance          |
|       4 | Human Resources  |
|       5 | Sales            |
+---------+------------------+

Допустим, нам нужно получить ID (emp_id), имя (emp_name) и дату приема на работу (hire_date) всех сотрудников вместе с названием их отдела (dept_name), независимо от того, приписаны они к какому-либо отделу или нет.

Получить нужный нам набор результатов поможет LEFT JOIN.

Следующий запрос вернёт ID сотрудника, его имя, дату приема на работу и название его отдела, соединяя таблицы сотрудников и отделов вместе с помощью общего поля dept_id. В результате также будут сотрудники, которые не приписаны ни к одному из отделов.

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 ORDER BY emp_id;

Примечание. Левой считается та таблица, которая в запросе стоит слева от оператора JOIN.

После выполнения вышеуказанной команды вы получите такой результат:

+--------+--------------+------------+-----------------+
| emp_id | emp_name     | hire_date  | dept_name       |
+--------+--------------+------------+-----------------+
|      1 | Ethan Hunt   | 2001-05-01 | Human Resources |
|      2 | Tony Montana | 2002-07-15 | Administration  |
|      3 | Sarah Connor | 2005-10-18 | Sales           |
|      4 | Rick Deckard | 2007-01-03 | Finance         |
|      5 | Martin Blank | 2008-06-24 | NULL            |
+--------+--------------+------------+-----------------+

Как вы можете видеть, LEFT JOIN включает все строки из таблицы employees в набор результатов, независимо от того, есть ли совпадение по столбцу dept_id в таблице departments.

Примечание. Если строка есть в левой таблице, но для нее нет совпадения по столбцу dept_id в правой таблице, то связанная строка результата содержит значения NULL для всех столбцов, поступающих из правой таблицы.

Проверьте себя
1. Чем LEFT JOIN отличается от INNER JOIN?
ALEFT JOIN возвращает только строки из правой таблицы
BLEFT JOIN возвращает только строки, у которых нет совпадения
CLEFT JOIN возвращает все строки из левой таблицы; для строк без совпадения в правой таблице ставится NULL
DLEFT JOIN и INNER JOIN возвращают одинаковый результат
2. Martin Blank (emp_id = 5) имеет dept_id = NULL. Что окажется в столбце dept_name в результате LEFT JOIN employees с departments?
AСтрока Martin Blank не включается в результат
Bdept_name = 'Unknown'
Cdept_name = NULL
Ddept_name = 0
3. Каковы синонимы LEFT JOIN в SQL?
ALEFT JOIN и OUTER JOIN — взаимозаменяемы
BLEFT JOIN и LEFT OUTER JOIN — это одно и то же
CLEFT JOIN и FULL JOIN — взаимозаменяемы
DLEFT JOIN не имеет синонимов
4. Какую таблицу называют «левой» в запросе FROM t1 LEFT JOIN t2?
At2 — таблица справа от ключевого слова LEFT
Bt1 — таблица стоит левее оператора JOIN
CОбе таблицы считаются левыми
DТа, у которой больше строк