Плюсы / минусы MySql JOINS

Когда я выбирал данные из нескольких таблиц, я часто использовал 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.

Но есть ли плюсы и минусы в отношении двух методов?

11
задан Brian Tompsett - 汤莱恩 10 June 2017 в 12:16
поделиться

5 ответов

Второй метод — это сокращение для 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». Информация о решении этой проблемы приведена далее в этом разделе.

В целом там упоминается довольно много вещей, которые должны заставить вас задуматься о том, чтобы не использовать запятые.

10
ответ дан 3 December 2019 в 08:02
поделиться

Я согласен с тем, что Мхл и Томас написали в своих ответах. Я бы особенно подчеркнул, что вам следует избегать второго примера (где вы указываете соединение с помощью предложения WHERE) и использовать более явную форму JOIN ... ON.

Я настаиваю на этом, потому что явная версия (LEFT JOIN ... ON ... = ... ) имеет еще одно важное преимущество: спецификация соединения четко отделена (в JOIN ... ON) из фактических условий фильтрации (в предложении WHERE), что делает код SQL более понятным и понятным.

0
ответ дан 27 October 2019 в 20:19
поделиться

Первый метод — это версия соединения ANSI/ISO. Второй метод — это более старый формат (до 89) для создания эквивалента внутреннего соединения. Он делает это путем перекрестного соединения всех перечисленных вами таблиц, а затем сужает декартово произведение в предложении Where, чтобы получить эквивалент внутреннего соединения.

Я бы настоятельно не рекомендовал использовать второй метод.

  1. Другим разработчикам труднее читать
  2. Это нарушает правило наименьшего удивления для других разработчиков, которые будут задаваться вопросом, не знали ли вы что-то лучше или была какая-то конкретная причина, по которой вы не использовали формат ANSI/ISO. .
  3. Вы огорчитесь, когда попытаетесь использовать этот формат с чем-то другим, кроме внутренних соединений.
  4. Это затрудняет понимание ваших намерений, особенно в большом запросе со множеством таблиц. Все ли эти таблицы должны быть внутренними соединениями? Вы что-то пропустили в предложении Where и создали перекрестное соединение? Вы намеревались сделать перекрестное соединение? И т. д.

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

3
ответ дан 3 December 2019 в 08:02
поделиться

Синтаксис ANSI

Оба запроса являются 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

Apples to Oranges

Еще одно отличие состоит в том, что два запроса не идентичны - 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 заключается в том, что он более явный, более удобочитаемый, а также отделяет то, что используется для объединения таблиц, и фактическую фильтрацию.

2
ответ дан 3 December 2019 в 08:02
поделиться

Я лично считаю, что явный синтаксис соединения (A JOIN B, A LEFT JOIN B) предпочтительнее. И потому, что это более явно описывает то, что вы делаете, и потому, что если вы используете неявный синтаксис соединения для внутренних соединений, вам все равно придется использовать явный синтаксис для внешних соединений, и, таким образом, ваше форматирование SQL будет несогласованным.

0
ответ дан 3 December 2019 в 08:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: