Перейти до основного вмісту
Модуль 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". Результатом є нова віртуальна таблиця зі стовпцями обох.

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 називається умовою приєднання: це те, що повідомляє двигун "ці два рядки приблизно одне й те саме, вирівняйте їх". в у переважній більшості випадків це рівність між первинним ключем і зовнішнім ключ (тут departments.id та employees.department_id).

INNER JOIN, детально

Повне ключове слово – 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Завантаження…

Для кожного співробітника відділу Ingegneria вкажіть ім’я (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 спроб