Предпосылки появления оператора 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
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ