Оператор JOIN

Модуль 4. Работа с БД
3 уровень , 2 лекция
Открыта

Предпосылки появления оператора JOIN

С ростом количества данных в таблицах в них часто возникают дубликаты значений. Например, в таблице product есть имена брендов. Которые иногда повторяются. Было бы полезно завести для них отдельную таблицу brand, в которой были бы, например такие данные:

  • id – id-бренда;
  • name – название бренда;
  • company_owner – имя компании владельца бренда;
  • company_contacts – контакты компании владельца бренда.

Затем мы бы захотели создать таблицу адресов, в которую можно было бы вынести все адреса:

  • id – id-адреса;
  • country;
  • region;
  • city;
  • street;
  • house;
  • zip.

Более того, в этой таблице можно было бы хранить адреса не только компаний-владельцев-брендов, но и адреса клиентов и адреса сотрудников. И такой подход – это просто следствие роста количества данных (количества строк в таблицах). Так легче оперировать данными в таблицах и поддерживать их целостность.

Когда у тебя 5 сотрудников, ты можешь просто указать их профессию в колонке occupation. Если у тебя в компании 5 тысяч сотрудников, то нужна таблица со списком х профессий, их обязанностями.

В языке Java, кстати, есть что-то похожее. Если у тебя в методе много кода, то возникает желание разбить его на несколько методов. Если в классе много методов, то хочется разбить его на несколько классов.

Именно поэтому в больших базах данных количество таблиц исчисляется тысячами. И практически все запросы выполняются сразу по нескольким таблицам. И декартово произведение строк трех таблиц в каждой из которых тысяча записей – это уже миллиард строк.

А ведь только фильтрация миллиарда строк с помощью WHERE может занять часы. Поэтому создатели языка SQL предложили свое решение – оператор JOIN.

Знакомство с оператором JOIN

Оператор JOIN используется для того, чтобы явно сказать SQL-серверу, что нам нужно не декартово произведение всех строк таблиц на всех, а умное склеивание строк разных таблиц, которые ссылаются друг на друга с помощью ID (или другим способом). Сервер имеет отдельный алгоритм обработки объединения таблиц с помощью оператора JOIN, что позволяет выполнять такие операции значительно быстрее. Общий вид оператора JOIN такой:


таблица1 JOIN таблица2 ON условие 

Тут написано, что нужно объединить в одну таблицу таблицы таблица1 и таблица2, а в качестве критерия объединения использовать условие.

Давай возьмем наш старый пример:


SELECT * FROM employee, task WHERE emploee.id = task.emploee_id 

И перепишем его с применением оператора JOIN:


SELECT * FROM employee JOIN task ON emploee.id = task.emploee_id 

Оба запроса дадут один и тот же результат в нашем случае, но это только потому, что запросы очень простые. В дальнейшем WHERE позволяет наращивать именно фильтр строк, а указанное после ON – писать сложные сценарии связывания таблиц. Вы так же можете использовать алиасы (псевдонимы таблиц) при использовании оператора JOIN. Пример:


SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0317
В этой задаче тебе потребуется: 1. Выбрать все колонки из таблиц top_retailers и suppliers, объединив их при этом оператором JOIN. 2. Добавить условие, что ret_location таблицы top_retailers равно sup_country таблицы suppliers. Используй операторы JOIN и ON.
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0318
В этой задаче тебе потребуется: 1. Выбрать колонки ret_name и ret_revenue из таблицы top_retailers, и колонки sup_name и sup_revenue из таблицы suppliers. 2. Объединить таблицы оператором JOIN. 3. Добавить условие, что ret_revenue таблицы top_retailers равно sup_revenue таблицы suppliers. Используй
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0319
В этой задаче тебе потребуется: 1. Выбрать колонки ret_name и ret_location из таблицы top_retailers, и колонки sup_name и sup_country из таблицы suppliers. 2. Объединить таблицы оператором JOIN, придав им при этом временные названия r и s (для top_retailers и suppliers, соответственно). 3. Добавить
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0320
В этой задаче тебе потребуется: 1. Выбрать колонки ret_name и ret_revenue из таблицы top_retailers, и колонки sup_name и sup_revenue из таблицы suppliers. 2. Объединить таблицы оператором JOIN, придав им при этом временные названия retailer и supplier (для top_retailers и suppliers, соответственно).
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0321
В этой задаче тебе потребуется: 1. Выбрать все колонки из таблиц customers и orders. Таблицу customers нужно соединить с таблицей orders используя оператор JOIN. 2. Добавить условие, что колонка customer_id таблицы customers равнa колонке customer_id таблицы orders. 3. ...
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0322
В этой задаче тебе потребуется: 1. Выбрать колонки customer_id и email из таблицы customers и колонки order_id и order_status из таблицы orders. 2. Объединить таблицы customers и orders оператором JOIN, но при этом через оператор AS временно заменить название таблицы customers на c, а таблицы orders
Комментарии (15)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Инна Уровень 105
11 октября 2024
Пожалуйста, перепроверяйте статью на наличие ошибок: последний пример в рамочке: SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id нужно SELECT * FROM employee AS e JOIN task AS t ON e.id = t.emploee_id
Андрей Уровень 109
19 ноября 2024
Ошибки нет) Видать за ранее учат, что AS можно опустить, но в задачах требуют использовать оператор AS.
Aliransa Уровень 109
26 января 2025
отсутствие AS не является ошибкой. можно как указывать, так и не указывать
Ivan Уровень 59
15 июня 2025
>в задачах требуют использовать оператор AS Спасибо. Долго не мог понять, почему у меня правильную задачу не засчитывает. Ещё и система не объясняет ничего. Просто неправильно и всё.
Олег Уровень 106 Expert
19 сентября 2024
Есть опечатка. Если "должно содержать", то нужно LIKE. А у меня с LIKE не засчитало.
Aliransa Уровень 109
26 января 2025
тоже фраза "должно содержать" смутила. но посмотрела что там указано в базе, там это как самостоятельные слова, следовательно like просто бессмысленно. наверняка и дольше выполняется, чем равенство
Серафим Уровень 109
1 февраля 2024
Большое пожелание составителям, чтобы были наглядные примеры работы sql-запросов в задачах. Не во всех задачах в таблицах существуют значения, согласно условию. Кроме того, в файлах, где создаются таблицы, нередко встречаются ошибки.
Дмитрий Уровень 117 Expert
5 декабря 2023
хорошо бы было, если бы вывод запросов в задачах был бы более упорядочен. Неаккуратные столбцы таблиц совершенно не дают оценить результат и получить обратную связь
Станислав Future Уровень 39
20 апреля 2023

А ведь только фильтрация миллиарда строк с помощью WHERE может занять часы.
слабоватенькое у вас железо
Misha Saharin Уровень 111 Expert
13 апреля 2023
да, последней задаче нет опячатГи)
Павел К Уровень 34
5 апреля 2023
таблица со списком х профессий
Ivan Уровень 59
15 июня 2025
Вот такие х профессии
Александр Уровень 111 Expert
24 ноября 2022
Последняя задача, думал в условии опечатка и нужно сравнить с o.order_id, а не o.customer_id. Оказалось опечатки нет, нужно делать четко по условию.
Владимир (koloncovvova@mail.ru) Уровень 108 Expert
19 октября 2022
вот опять же, к вопросу об одной из задач..) в теории дан вот такой пример: "SELECT * FROM employee e JOIN task t ON e.id = t.emploee_id" но если в задаче начинаешь также писать, без использования  AS, то валидатор не пропускает решение (видимо потому что из условия это требуется), хотя по факту и по смыслу получается одно и тоже.
Aliransa Уровень 109
26 января 2025
валидатор всегда ругается, если у тебя в условии что-то указано, но не использовано