1. Передумови появи оператора 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.

2. Знайомство з оператором 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