Первые два запроса эквивалентны;в мире MySql ключевое слово using (ну, почти - см. документацию , но использование является частью спецификации Sql2003 и есть некоторые различия в значениях NULL) так же, как и высказывание field1.id = field2.id
Вы можете легко написать их как:
SELECT field1, field2
FROM table1
INNER JOIN table2 ON (table1.id = table2.id)
Третий запрос - это ЛЕВОЕ СОЕДИНЕНИЕ.Это выберет все совпадающие строки в обеих таблицах, а также вернет все строки в table1, у которых нет совпадений в table2.Для этих строк столбцы в table2 будут представлены значениями NULL.
Мне нравится визуальное объяснение Джеффа Этвуда из этих
Теперь о том, что лучше или хуже,Ответ: зависит .Они для разных вещей.Если в table1 больше строк, чем table2, то левое соединение вернет больше строк, чем внутреннее соединение.Но производительность запросов будет зависеть от многих факторов, таких как размер таблицы, типы столбцов, то, что база данных делает в то же время.
В первую очередь вам нужно использовать запрос, который вам нуженчтобы получить данные.Вы можете честно узнать, какие строки в таблице1 не имеют совпадений в таблице2;в этом случае вы бы использовали левое соединение.Или вам могут потребоваться только строки, которые совпадают - ВНУТРЕННЕЕ СОЕДИНЕНИЕ.
Как указывает Кристер, вы можете использовать ключевое слово EXPLAIN , чтобы сообщить вам, как база данных будет выполнять каждый вид запроса.Это очень полезно, когда вы пытаетесь выяснить, почему запрос выполняется медленно, поскольку вы можете видеть, где база данных тратит все свое время.