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
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ