SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.11.2016 18:40:50

oleg.borisov
Участник
Зарегистрирован: 03.11.2016
Сообщений: 2

Множественные разнотиповые JOIN-ы и порядок отбора записей

Приветствую, не удается разобраться как работают множественные JOIN-ы (левое, правое и т.д.), точнее, в каком порядке пересекаются (по условиям ON) их таблицы, и как затем объединяются для конечного результата. собственно, более подробнее:

Данный запрос в формате последней спецификации SQL задает критерии выборки из нескольки таблиц при помощи предикатов, указанных в выражении типа объединения (left join table2 t2 on t2.id = t1.id), т.е. только те записи из таблиц t1 & t2, у которых id одинаковые.

select t1.*
from table1 t1
left join table2 t2 on t2.id = t1.id
left join table3 t3 on t3.id = t2.id
left join table4 t4 on t4.id = t3.id
left join table5 t5 on t5.id = t4.id
 


1. Если добавить новые join-ы, как в примере выше, к чему тогда будут применяться их предикаты:
    1.1. к оригинальным данным в указанных таблицах
    т.е. выражение left join table3 t3 on t3.id = t2.id
просто объединит полностью все записи из table2 и table3 по условию on t2.id = t1.id совершенно не обращая внимания на то, что было объединено в выражении left join table2 t2 on t2.id = t1.id

    если да, то:
        1.1.1. каким образом формируется конечный результат для select - неявно формируется некая промежуточная таблица и т.д.,
        1.1.2. как объединяются результаты из каждых таблиц после каждого left join on с результатами предыдущих выборок


    1.2 либо же, каждое новое left join on осуществляется с результатом предыдущего, например:
        после left join table2 t2 on t2.id = t1.id формируется неявная таблица, в которой только записи удовлетворяющие on t2.id = t1.id и затем следующее объединение left join table3 t3 on t3.id = t2.id джоинит именно эту неявную таблицу (сформированную после on t2.id = t1.id) с table3 и так далее

        если да, то то же самое, как и для 1.1:
            1.2.1. каким образом формируется конечный результат для selectт.д.,
            1.2.2. как объединяются результаты из каждых таблиц после каждого left join on с результатами предыдущих выборок


2. к какому результату будет применяться where: к неявно созданным промежуточным таблицам, уже включающим удовлетворяющие предикатам записи из таблиц, учавствующих в выражении where или к чему-то другому ?
например:
...
left join table4 t4 on t4.id = t3.id
left join table5 t5 on t5.id = t4.id
where t2.meta_id = t4.meta_id
    and (t1.meta_id = t5.meta_id and t1.id = t2.id)

3. То же самое, но для GROUP BY и HAVING

4. так же просьба подсказать "правильную" книгу именно по самой теории реляционной алгебры применяемой в данной СУБД, без четкого понимания мат. модели стоящей за SQL, крайне сложно понимать все эти ньюансы.

с уважением.

Отредактированно oleg.borisov (03.11.2016 18:45:42)

Неактивен

 

#2 03.11.2016 18:53:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Множественные разнотиповые JOIN-ы и порядок отбора записей

Неактивен

 

#3 03.11.2016 19:04:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Множественные разнотиповые JOIN-ы и порядок отбора записей

oleg.borisov написал:

4. так же просьба подсказать "правильную" книгу именно по самой теории реляционной алгебры применяемой в данной СУБД, без четкого понимания мат. модели стоящей за SQL, крайне сложно понимать все эти ньюансы.

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

Неактивен

 

#4 03.11.2016 22:09:20

oleg.borisov
Участник
Зарегистрирован: 03.11.2016
Сообщений: 2

Re: Множественные разнотиповые JOIN-ы и порядок отбора записей

спасибо, многое прояснилось, в целом, вся ветка http://dev.mysql.com/doc/refman/5.7/en/ … ation.html в тему

буду уточнять некоторые детали в этом топике, по мере необходимости.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson