Каковы различия между этими типами запросов JOIN и существуют ли какие-либо оговорки?

У меня есть несколько запросов (из другого раздела моего сайта), я выполняю

Некоторые из них выглядят следующим образом:

SELECT field, field1 
FROM table1, table2 
WHERE table1.id = table2.id 
AND ....

а некоторые такие:

SELECT field, field1 
FROM table1 
JOIN table2 
USING (id)  
WHERE ...
AND ....

а некоторые такие:

SELECT field, field1 
FROM table1 
LEFT JOIN table2 
 ON (table1.id = table2.id)
WHERE ...
AND ....

Какой из этих запросов лучше, или медленнее/быстрее или более стандартно?

Ответ 1

Первые два запроса эквивалентны; в мире MySql используется ключевое слово using (ну, почти - см. документация, но использование является частью спецификации Sql2003 и есть некоторые отличия в NULL значения) так же, как и выражение field1.id = field2.id

Вы можете легко написать их как:

SELECT field1, field2
FROM table1
INNER JOIN table2 ON (table1.id = table2.id)

Третий запрос - LEFT JOIN. Это выберет все соответствующие строки в обеих таблицах, а также вернет все строки в таблице1, которые не имеют совпадений в таблице2. Для этих строк столбцы в таблице 2 будут представлены значениями NULL.

Мне нравится Jeff Atwood визуальное объяснение этих

Теперь, к тому, что лучше или хуже. Ответ: зависит. Они для разных вещей. Если в таблице 1 больше строк, чем в таблице2, то левое соединение возвращает больше строк, чем внутреннее соединение. Но производительность запросов будет производиться многими факторами, такими как размер таблицы, типы столбца, что делает база данных одновременно.

Ваша первая проблема заключается в том, чтобы использовать запрос, необходимый для получения данных. Вы могли бы честно узнать, какие строки в таблице1 не соответствуют таблице2; в этом случае вы использовали бы ЛЕВЫЙ ПРИСОЕДИНЕНИЕ. Или вам могут потребоваться только строки, которые соответствуют - INNER JOIN.

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

Ответ 2

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

просто мои $.02.

Ответ 3

Третий пример, используя ON (field1=field2), является более распространенным и, кажется, более общепринятым стандартом.

Я не знаю о разнице в производительности, вам придется запускать несколько запросов EXPLAIN, чтобы увидеть, что на самом деле MySQL действительно делает с ними все.

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