Подтвердить что ты не робот

Синтаксис SQL Inner Join

два бита SQL ниже получают одинаковый результат

SELECT c.name, o.product  
FROM customer c, order o  
WHERE c.id = o.cust_id  
AND o.value = 150  

SELECT c.name, o.product  
FROM customer c  
INNER JOIN order o on c.id = o.cust_id  
WHERE o.value = 150

Я видел оба стиля, используемые в качестве стандарта в разных компаниях. Из того, что я видел, второй - это то, что большинство людей рекомендует в Интернете. Есть ли настоящая причина для этого, кроме стиля? Часто ли использование Inner Join имеет лучшую производительность?

Я заметил, что разработчики Ingres и Oracle, как правило, используют первый стиль, тогда как пользователи Microsoft SQL Server имеют тенденцию использовать второй, но это может быть просто совпадением.

Спасибо за любую проницательность, я задавался вопросом об этом некоторое время.

Изменить: я изменил название из "SQL Inner Join to Cartesian Product", поскольку использовал неправильную терминологию. Спасибо за все ответы.

4b9b3361

Ответ 1

Оба запроса являются внутренними объединениями и эквивалентными. Первый - это более старый метод выполнения вещей, тогда как использование синтаксиса JOIN стало распространенным только после введения стандарта SQL-92 (я считаю, что это в старых определениях, до этого не было особенно широко распространено до этого).

Использование синтаксиса JOIN является очень предпочтительным, поскольку он отделяет логику объединения от логики фильтрации в предложении WHERE. Хотя синтаксис JOIN действительно синтаксический сахар для внутренних объединений, его сила заключается в внешних соединениях, где старый синтаксис может создавать ситуации, когда невозможно однозначно описать объединение, и интерпретация зависит от реализации. [ВЛЕВО | RIGHT] JOIN избегает этих ловушек, и, следовательно, для согласованности использование предложения JOIN является предпочтительным при любых обстоятельствах.

Заметим, что ни один из этих двух примеров не является декартовыми произведениями. Для этого вы будете использовать

SELECT c.name, o.product  
FROM customer c, order o  
WHERE o.value = 150  

или

SELECT c.name, o.product  
FROM customer c  CROSS JOIN order o 
WHERE o.value = 150

Ответ 2

Чтобы ответить на часть вашего вопроса, я думаю, что ранние ошибки в синтаксисе JOIN... ON в Oracle обескуражили пользователей Oracle от этого синтаксиса. Я не думаю, что сейчас есть какие-то особые проблемы.

Они эквивалентны и должны быть проанализированы в одно и то же внутреннее представление для оптимизации.

Ответ 3

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

select *
from t1,t2

Об этом хорошо обсуждается на Wikipedia.

Ответ 4

Oracle опоздала на поддержку синтаксиса JOIN... ON (ANSI) (только до Oracle 9), поэтому разработчики Oracle часто не используют его.

Лично я предпочитаю использовать синтаксис ANSI, когда логически ясно, что одна таблица ведет запрос, а остальные - таблицы поиска. Когда таблицы "равны", я склонен использовать декартовой синтаксис.

Производительность не должна различаться.

Ответ 5

Оба запроса выполняют внутреннее соединение, просто различный синтаксис.

Ответ 6

Синтаксис JOIN... ON... - это последнее дополнение к спецификациям ANSI и ISO для SQL. Синтаксис JOIN... ON... обычно предпочтительнее, поскольку он 1) перемещает критерии соединения из предложения WHERE, делая предложение WHERE только для фильтрации, и 2) делает его более очевидным, если вы создаете страшный декартово произведение, поскольку каждый JOIN должен сопровождаться по крайней мере одним предложением ON. Если все критерии соединения являются только ANDed в предложении WHERE, это не так очевидно, когда отсутствует один или несколько.