Mysql запрос. В чем разница между Join и SubQuery? - PullRequest
2 голосов
/ 30 октября 2009

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

SELECT * FROM tbl AS t1
JOIN tbl2 AS t2 ON t1.id = t2.foreignId 
JOIN tbl3 AS t3 ON t2.id = t3.foreignId
WHERE t1.date > SOMEDATE

Насколько я понимаю, он запустит оператор where и получит только результаты, попадающие в диапазон дат. Затем он пройдет через все t2 и попытается сопоставить только идентификаторы, которые подключаются к t1 (что может уменьшить результаты). Затем с этими меньшими потенциальными результатами он сделает то же самое для T3 и выдаст окончательные результаты.

Но, похоже, это НЕ так, как это работает? И таблицы умножаются, а не становятся меньше. И, видимо, то, что я описываю выше, больше похоже на подзапросы? (Обратите внимание, что я сказал, как. Я не знаю, как работают подзапросы)

Как работает JOIN и в чем разница между JOIN и подзапросом?

Я использую и MySql, и SQLite. Я не знаю, если это актуально.

Ответы [ 2 ]

1 голос
/ 01 ноября 2009

Если таблица, используемая в подзапросе, возвращает значение дважды, JOIN также возвращает совпадающие строки дважды, в то время как условие IN или EXISTS возвращает их только один раз.

СОЕДИНЕНИЯ, как правило, имеют лучшую производительность, но в некоторых ситуациях это может быть не так, в частности для каждой базы данных (включая версию).

Справка:

0 голосов
/ 30 октября 2009

пример подзапроса

SELECT * 
FROM (
    SELECT * FROM tbl1 WHERE date > SOMEDATE
)
AS t1
JOIN tbl2 AS t2 ON t1.id = t2.foreignId 
JOIN tbl3 AS t3 ON t2.id = t3.foreignId

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

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