воскресенье, 16 августа 2015 г.

Виды join'ов

К своему стыду, я до сих пор не знаю ответа на данный вопрос. Ну что же, попробуем разобраться.
Начнем с того, что такое  join? Join - это операция объединяющая таблицы по какому то столбцу.
Основные join'ы - это   left inner, right inner, left outer, right outer, более экзотических пока касаться не будем.
Основное различие между ними в состоит в том, какие записи попадают в результирующую выборку.
Далее буду показывать на примерах. Для этого мне потребуются две таблицы, первая таблица будет workers, а вторая phones.
Для лучшего понимая, выполним каждый из join'ов.
Результатом будет список работников, у которых есть номер телефона Это можно представить в виде диаграммы Венна
inner join



Результатом этого запроса, как видите, список всех работников, независимо от того, есть ли у них номер телефона или нет.
left outer join


С right join'ом будет аналогично, с той только разницей, что в выборку будут попадать, строки из второй таблицы.


right outer join


Результат выполнения right inner join и left inner join одинаковый.



Помимо основных, есть еще несколько других.


В результирующую выборку попадут строки, попавшие при выполнении левого и правого outer join'а по отдельности, т.е.

full join


Наложив некоторое ограничение, можно получить строки, не имеющие совпадений по столбцам.

full outer join with where


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

И напоследок, приведу несколько запросов с использованием join'ов.
Получение списка работников не имеющих номеров телефонов:
left outer join with where


Получение списка людей, которые не работают, но у которых есть номер телефона:
right outer join with where


Продолжение:
Визуализация join запросов