Когда я выбирал данные из нескольких таблиц, я часто использовал JOINS, и недавно я начал использовать другой способ, но я ' Я не уверен в последствиях в долгосрочной перспективе.
Примеры:
SELECT * FROM table_1 LEFT JOIN table_2 ON (table_1.column = table_2.column)
Итак, это ваше основное ЛЕВОЕ СОЕДИНЕНИЕ по таблицам, но взгляните на запрос ниже.
SELECT * FROM table_1,table_2 WHERE table_1.column = table_2.column
Лично, если бы я присоединился, скажем, 7 таблиц Данные, которые я бы предпочел сделать по сравнению с JOINS.
Но есть ли плюсы и минусы в отношении двух методов?
Второй метод — это сокращение для INNER JOIN.
SELECT * FROM table_1 INNER JOIN table_2 ON table_1.column = table_2.column
Будут выбраны только записи, соответствующие условию в обеих таблицах (LEFT JOIN выберет все записи из таблицы слева и соответствующие записи из таблицы справа)
Цитата из http://dev. mysql.com/doc/refman/5.0/en/join.html
[...] мы рассматриваем каждую запятую в списке элементов table_reference как эквивалентную внутреннему соединению
И
INNER JOIN и , (запятая) семантически эквивалентны при отсутствии условия соединения: оба произвести декартово произведение между указанными таблицами (то есть каждая строка в первой таблице соединяется с каждой строкой во второй таблице).
Однако приоритет оператора запятой меньше, чем приоритет INNER JOIN, CROSS JOIN, LEFT JOIN и т. д. Если вы смешиваете соединения через запятую с другими типами соединений, когда есть условие соединения, может возникнуть ошибка формы Неизвестный столбец «имя_столбца» в «предложении on». Информация о решении этой проблемы приведена далее в этом разделе.
В целом там упоминается довольно много вещей, которые должны заставить вас задуматься о том, чтобы не использовать запятые.
Я согласен с тем, что Мхл и Томас написали в своих ответах. Я бы особенно подчеркнул, что вам следует избегать второго примера (где вы указываете соединение с помощью предложения WHERE
) и использовать более явную форму JOIN ... ON
.
Я настаиваю на этом, потому что явная версия (LEFT JOIN ... ON ... = ...
) имеет еще одно важное преимущество: спецификация соединения четко отделена (в JOIN ... ON
) из фактических условий фильтрации (в предложении WHERE
), что делает код SQL более понятным и понятным.
Первый метод — это версия соединения ANSI/ISO. Второй метод — это более старый формат (до 89) для создания эквивалента внутреннего соединения. Он делает это путем перекрестного соединения всех перечисленных вами таблиц, а затем сужает декартово произведение в предложении Where, чтобы получить эквивалент внутреннего соединения.
Я бы настоятельно не рекомендовал использовать второй метод.
Просто нет причин использовать второй формат, и фактически многие системы баз данных прекращают поддержку этого формата.
Оба запроса являются JOIN, и оба используют синтаксис ANSI, но один старше другого.
Соединение с помощью ключевого слова JOIN
означает, что используется синтаксис ANSI-92. Синтаксис ANSI-89 — это когда таблицы разделены запятыми в предложении FROM
, а объединяющий их критерий находится в предложении WHERE
. При сравнении ВНУТРЕННИХ СОЕДИНЕНИЙ нет никакой разницы в производительности - это:
SELECT *
FROM table_1 t1, table_2 t2
WHERE t1.column = t2.column
... создаст тот же план запроса, что и:
SELECT *
FROM TABLE_1 t1
JOIN TABLE_2 t2 ON t2.column = t1.column
Еще одно отличие состоит в том, что два запроса не идентичны - LEFT [ OUTER] JOIN создаст все строки из TABLE_1
, а ссылки на TABLE_2
в выводе будут NULL, если нет совпадений на основе критериев JOIN (указанных в ON
пункт). Второй пример — ВНУТРЕННЕЕ СОЕДИНЕНИЕ, которое будет только генерировать строки, имеющие совпадающие записи в TABLE_2
. Вот ссылка на визуальное представление JOIN, чтобы подчеркнуть разницу...
Основная причина использования синтаксиса ANSI-92 заключается в том, что ANSI-89 не поддерживает ВНЕШНЕЕ СОЕДИНЕНИЕ (LEFT, RIGHT, FULL). Синтаксис ANSI-92 был специально введен для устранения этого недостатка, поскольку поставщики реализовывали свой собственный пользовательский синтаксис. Oracle использовал (+)
; SQL Server использовал звездочку рядом с равенством в критериях соединения (IE: t1.column =* t2.column
).
Следующая причина использования синтаксиса ANSI-92 заключается в том, что он более явный, более удобочитаемый, а также отделяет то, что используется для объединения таблиц, и фактическую фильтрацию.
Я лично считаю, что явный синтаксис соединения (A JOIN B
, A LEFT JOIN B
) предпочтительнее. И потому, что это более явно описывает то, что вы делаете, и потому, что если вы используете неявный синтаксис соединения для внутренних соединений, вам все равно придется использовать явный синтаксис для внешних соединений, и, таким образом, ваше форматирование SQL будет несогласованным.