Разница между оператором AND во внутреннем соединении или в предложении WHERE - PullRequest
3 голосов
/ 04 марта 2012

Здравствуйте, ребята. У меня есть конкретный вопрос о предложении AND в SQL.

Два следующих оператора SQL обеспечивают одинаковый вывод:

SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id AND t2.id = 0


SELECT * FROM Table1 t1 INNER JOIN Table2 t2 ON t1.id = t2.id WHERE t2.id = 0

Обратите внимание на разницу в концезапрос.В первом случае я использую предложение AND (без использования предложения WHERE ранее).Во втором я использую WHERE для указания своего идентификатора.

Верен ли первый синтаксис?Если да, то первое лучше с точки зрения производительности (без использования предложения WHERE для фильтрации после).Стоит ли ожидать разных результатов при разных запросах?

Спасибо за вашу помощь.

1 Ответ

11 голосов
/ 04 марта 2012

Да, нет и нет.

Чтобы быть конкретным:

  1. Да, синтаксис правильный. Концептуально первый запрос создает внутреннее объединение между t1 и t2 с условием объединения t1.id = t2.id AND t2.id = 0, в то время как второй создает внутреннее объединение на t1.id = t2.id, а затем фильтрует результат с использованием условия t2.id = 0.

    Однако ни один механизм SQL, о котором я знаю, на самом деле не выполнил бы ни один такой запрос. Скорее, в обоих случаях движок оптимизирует их обоих до чего-то вроде t1.id = 0 AND t2.id = 0, а затем выполняет два поиска в одной строке.

  2. Нет, практически любой разумный движок SQL должен рассматривать эти два запроса как эффективно идентичные.

  3. Нет, см. Выше.

Кстати, следующие способы написания того же запроса также допустимы:

SELECT * FROM Table1 t1 INNER JOIN Table2 t2 WHERE t1.id = t2.id AND t2.id = 0

SELECT * FROM Table1 t1, Table2 t2 WHERE t1.id = t2.id AND t2.id = 0
...