Уроки модуля (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". Результатом является новый виртуальный
table со столбцами обоих.
-- 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):
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 работает так же.
Попробуйте это
Для каждого сотрудника отдела Ингегнерия укажите имя (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 попыток