Перейти к основному содержимому
Модуль 3 · Урок 1 из 49/57 в курсе~12 min
Уроки модуля (1/4)

Соединение двух таблиц: INNER JOIN

До сих пор мы читали по одной таблице за раз. Однако в реальном мире данные распределено по нескольким связанным таблицам: в нашем наборе данных, например, каждая у сотрудника есть department_id, который указывает на таблицу departments. Чтобы увидеть название отдела (а не только его id), нам нужно присоединиться к два стола. Оператор, который это делает, называется JOIN.

Основной синтаксис

SQL
SELECT columns
FROM   table_a
JOIN   table_b ON table_a.x = table_b.y;

Прочтите по-английски: "возьмите table_a, присоедините к нему table_b, соединив каждую строка, где table_a.x равно table_b.y". Результатом является новый виртуальный table со столбцами обоих.

SQL
-- For each employee, also show the name of their department:
SELECT employees.first_name,
       employees.last_name,
       departments.name AS dipartimento
FROM   employees
JOIN   departments ON employees.department_id = departments.id;

Часть после ON называется условием соединения: оно сообщает engine "эти две строки об одном и том же, выровняйте их". В в подавляющем большинстве случаев это равенство между первичным ключом и внешним ключ (здесь departments.id и employees.department_id).

ВНУТРЕННЕЕ СОЕДИНЕНИЕ, подробно

Полное ключевое слово — INNER JOIN, но JOIN само по себе является стандартным. синоним. «Внутренний» означает, что только те строки, которые имеют совпадение в обе возвращаются таблицы:

  • если у сотрудника есть department_id = NULL, они не появятся в списке результат;
  • если в отделе нет сотрудников, он не появится в результате.

Соответствующие имена столбцов

Когда в двух таблицах есть столбцы с одинаковым именем (здесь обе имеют id и у обоих есть name, если вдуматься), вам нужно указать какую таблицу столбец получается путем записи table.column. Чтобы не повторять длинные имена, часто используются псевдонимы (вы видели их в Модуле 2):

SQL
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id;

AS здесь также не является обязательным: FROM employees e работает так же.

Попробуйте это

Упражнение#sql.m3.l1.e1
Попыток: 0Загрузка…

Для каждого сотрудника отдела Ингегнерия укажите имя (first_name), фамилию (last_name) и город отдела (departments.city). Три столбца, по одной строке на каждого сотрудника.

Загрузка редактора…
Показать подсказку

Завершите условие ON, указав равенство между e.department_id и d.id, затем выберите d.city в качестве третьего столбца.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m3.l1.e2
Попыток: 0Загрузка…

Перечислите имена (first_name) и фамилии (last_name) всех сотрудников, которые работают в отделе, расположенном в Милане. Фильтруйте по Departments.city, а не по названию отдела.

Загрузка редактора…
Показать подсказку

То же JOIN, что и в предыдущем упражнении, но фильтрация по d.city = 'Milano' вместо названия отдела.

Решение доступно после 3 попыток