Предпосылки появления оператора 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
undefined
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0317
В этой задаче тебе потребуется: 1. Выбрать все колонки из таблиц top_retailers и suppliers, объединив их при этом оператором JOIN. 2. Добавить условие, что ret_location таблицы top_retailers равно sup_country таблицы suppliers. Используй операторы JOIN и ON.
undefined
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. Используй
undefined
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. Добавить
undefined
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0320
В этой задаче тебе потребуется: 1. Выбрать колонки ret_name и ret_revenue из таблицы top_retailers, и колонки sup_name и sup_revenue из таблицы suppliers. 2. Объединить таблицы оператором JOIN, придав им при этом временные названия retailer и supplier (для top_retailers и suppliers, соответственно).
undefined
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0321
В этой задаче тебе потребуется: 1. Выбрать все колонки таблицы customers и соединить её с таблицей orders используя оператор JOIN. 2. Добавить условие, что колонка customer_id таблицы customers равнa колонке customer_id таблицы orders. 3. Добавить условие, что total_cost таблицы orders должно быть б
undefined
1
Задача
Модуль 4. Работа с БД, 3 уровень, 2 лекция
Недоступна
task0322
В этой задаче тебе потребуется: 1. Выбрать колонки customer_id и email из таблицы customers и колонки order_id и order_status из таблицы orders. 2. Объединить таблицы customers и orders оператором JOIN, но при этом через оператор AS временно заменить название таблицы customers на c, а таблицы orders