Объединение таблиц в SQL

В этом уроке вы узнаете, как объединить две таблицы.

Все запросы, которые вы видели до сих пор, были связаны с одной таблицей. В реальной жизни часто нужно запросить две или более таблиц одновременно и получить объединенный набор результатов. Технически это называется объединением (join), поскольку оно подразумевает объединение различных таблиц на основе общего поля между ними (внешнего ключа) для создания новых представлений данных.

Давайте рассмотрим таблицы сотрудников employees и отделов departments. Столбец dept_id таблицы 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            |
+---------+------------------+

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

Виды объединений таблиц

При объединении таблиц в запросе указывается тип объединения, который влияет на строки, которые появятся в результатов. В SQL доступны следующие виды объединений:

Inner Join

Объединение, которое возвращает только те строки, которые имеют совпадения в обеих объединенных таблицах.

Например, вы можете объединить таблицы сотрудников employees и отделов departments, чтобы создать набор результатов, показывающий название отдела для каждого сотрудника. При inner join сотрудники, для которых нет информации об отделе, не включаются в набор результатов, как и отделы, в которых нет сотрудников.

Подробнее об inner join мы поговорим в следующей статье.

Outer Join

Outer join — это расширение inner join. Outer join возвращает строки, даже если они не имеют связанных строк в объединенной таблице. Существует три типа outer join: left outer join, right outer join и full outer join.

Подробнее об этих разновидностях outer join мы поговорим в следующих статьях.

Cross Join

Cross join — это соединения без условия соединения. Каждая строка одной таблицы объединяется с каждой строкой другой таблицы. Такой тип набора результатов называется декартовым или перекрестным произведением.

Например, cross join между таблицами сотрудников employees и отделов departments вернет набор результатов с одной строкой для каждой возможной комбинации «сотрудники/отделы».

Более подробно о cross join мы поговорим в следующих статьях.

 

Проверьте себя
1. Что такое JOIN в SQL?
AОперация объединения результатов двух SELECT-запросов строками друг над другом
BОперация объединения двух или более таблиц на основе общего поля для получения комбинированного набора данных
CКоманда для копирования данных из одной таблицы в другую
DСиноним оператора UNION
2. Для чего используется внешний ключ (foreign key) при объединении таблиц?
AДля шифрования данных в обеих таблицах
BКак мост между двумя таблицами: значения внешнего ключа одной таблицы совпадают с первичным ключом другой
CДля задания порядка сортировки в объединённом результате
DДля ограничения количества возвращаемых строк
3. Сколько строк вернёт INNER JOIN между таблицей employees (5 строк) и departments (5 строк), если только 4 сотрудника имеют совпадающий dept_id?
A10 строк — сумма всех строк
B25 строк — декартово произведение
C5 строк — все строки левой таблицы
D4 строки — только строки с совпадением
4. Какой тип JOIN объединяет каждую строку одной таблицы с каждой строкой другой без условия совпадения?
ACROSS JOIN
BINNER JOIN
CFULL JOIN
DLEFT JOIN