English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом курсе вы узнаете, как использовать SQL правое соединение для получения данных из двух таблиц.
RIGHT JOIN являетсяLEFT JOINполностью противоположно. Оно возвращает все строки правой таблицы и строки левой таблицы, которые соответствуют условиям соединения.
правое соединениеодним из видов внешнего соединенияи, следовательно, также называетсяright outer join. Другие вариации внешних соединений включаютлевое соединениеиполное соединение. Визуализация Венина объясняет, как работает правое соединение.
Внимание:Внешний запрос — это запрос, который включает строки в результате, даже если строки, которые нужно соединить, могут не соответствовать друг другу.
Чтобы清楚地 понять это, давайте посмотрим на то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 | +---------+------------------+ | |
Таблица: employees | Таблица: departments |
Теперь, предположим, что вы хотите извлечь имена всех отделов и подробную информацию о сотрудниках, работающих в этих отделах. Но на практике может быть так, что в некоторых отделах в настоящее время нет сотрудников. Давайте найдем ответ.
Следующие предложения объединяют таблицы employee и department с помощью общего поля dept_id, чтобы извлечь все доступные отделы и идентификаторы, имена, даты найма сотрудников в этих отделах.
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 dept_name;
Совет:В запросе с объединением слева таблица出现在 JOIN подзапросе слева, а справа таблица出现在 справа.
После выполнения команды, вы получите следующий результат:
+--------+--------------+------------+------------------+ | emp_id | emp_name | hire_date | dept_name | +--------+--------------+------------+------------------+ | 2 | Tony Montana | 2002-07-15 | Administration | | NULL | NULL | NULL | Customer Service | | 4 | Rick Deckard | 2007-01-03 | Finance | | 1 | Ethan Hunt | 2001-05-01 | Human Resources | | 3 | Sarah Connor | 2005-10-18 | Sales | +--------+--------------+------------+------------------+
Правильное объединение включает все строки из таблицы部门 в результирующем наборе, независимо от того, совпадает ли столбец dept_id в таблице сотрудников, потому что вы можете清楚地 видеть, что даже если в этом отделе нет сотрудников, он также будет включать «Customer Service».
Внимание:Если в правой таблице есть строка, но в левой таблице нет соответствующего элемента, то соответствующие строки будут содержать NULL значения для всех столбцов левой таблицы.