LEFT JOIN в SQL
Оператор 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
.
Примечание. Если строка есть в левой таблице, но для нее нет совпадения по столбцу emp_id в правой таблице, то связанная строка результата содержит значения NULL для всех столбцов, поступающих из правой таблицы.