Модульні уроки (1/4)
Об'єднання двох таблиць: INNER JOIN
Досі ми читали по одній таблиці. Однак у реальному світі дані є
розподілені між кількома пов’язаними таблицями: у нашому наборі даних, наприклад, кожна
працівник має department_id, який вказує на таблицю departments. Щоб побачити
назва відділу (а не лише його id), до якого нам потрібно приєднатися
два столи. Оператор, який це робить, називається JOIN.
Основний синтаксис
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". Результатом є нова віртуальна
таблиця зі стовпцями обох.
-- 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):
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 працює так само.
Спробуйте
Для кожного співробітника відділу Ingegneria вкажіть ім’я (first_name), прізвище (last_name) і місто відділу (departments.city). Три колонки, по одному рядку на працівника.
Показати підказку
Доповніть умову ON рівністю між e.department_id і d.id, а потім виберіть d.city як третій стовпець.
Рішення доступне після 3 спроб
Повторна вправа
Перелічіть імена (first_name) та прізвища (last_name) усіх співробітників, які працюють у відділі в Мілані. Фільтруйте за departments.city, а не за назвою відділу.
Показати підказку
Такий же JOIN, як і в попередній вправі, але фільтр за d.city = 'Milano' замість назви відділу.
Рішення доступне після 3 спроб