вопрос положения о присоединении к SQL - PullRequest
1 голос
/ 02 августа 2011

В чем разница между следующими двумя SQL:

select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id and t2.col2='xxx'
where t1.col2='xxx'

select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id
where t1.col2='xxx' and t2.col2='xxx'

Я обнаружил, что когда одно и то же предложение помещается в разные позиции, результат иногда может отличаться, даже больше производительности SQLможет сильно отличаться.В чем основные отличия, если я добавлю дополнительное предложение сразу после левого соединения или добавлю после «где»?

Может кто-нибудь предложить объяснение?Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 02 августа 2011

Давайте перепишем SQL:

select t1.id, t2.col1
from table1 t1
left join table2 t2 on t2.col1=t1.id and t2.col2='xxx'
where t1.col2='xxx'

select t1.id, t2.col1
from table1 t1
left join table2 t2 on t2.col1=t1.id
where t1.col2='xxx' and t2.col2='xxx'

Заполните таблицу данными
t1 (id, col2):
1 xxx
2 xxx
3 jjj

t2 (col1, col2):
1 uuu
2 xxx
3 xxx

Результат первого запроса:
1 NULL
2 2
Результат второго запроса:
2 2

Таким образом, если вы поставите какие-либо условия в 'join', строка присоединения может не объединиться, и результат объединения будетnull.

См. эту ссылку для понимания

0 голосов
/ 02 августа 2011

Вы можете увидеть разницу между следующими SQL-запросами, просто добавив "EXPLAIN" перед обоими запросами.т.е.

EXPLAIN select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id and t2.col2='xxx'
where t1.col2='xxx'

И

EXPLAIN select ...
from table1 t1
left join table2 t2 on t2.col1=t1.id
where t1.col2='xxx' and t2.col2='xxx'
0 голосов
/ 02 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...