Вопрос

Есть ли существенная разница между следующим?

SELECT a.name, b.name FROM a, b WHERE a.id = b.id AND a.id = 1

И

SELECT a.name, b.name FROM a INNER JOIN b ON a.id = b.id WHERE a.id = 1

Есть ли у пользователей SO предпочтение одного перед другим?

Это было полезно?

Решение

Разницы нет, но читаемость второго варианта намного лучше, если у вас есть большой запрос с несколькими соединениями и дополнительными предложениямиwhere для фильтрации.
Разделение предложений соединения и предложений фильтра — хорошая вещь :)

Другие советы

Первый соответствует синтаксису ANSI 89, второй — ANSI 92.

Для этот конкретный запрос нет никакой разницы.Однако в первом случае вы теряете возможность отделять фильтр от условия соединения в сложных запросах, а синтаксис для указания LEFT, RIGHT и INNER часто сбивает с толку, особенно если вам приходится переключаться между разными поставщиками баз данных.Мне вообще не нравится старый синтаксис.

Нет никакой разницы с механизмом запросов sql.

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

Для INNER JOIN не имеет значения, помещаете ли вы «фильтры» и «объединения» в предложение ON или WHERE, оптимизатор запросов в любом случае должен решить, что делать первым (он может сначала выполнить фильтр, позднее выполнить соединение или наоборот). наоборот

Однако для OUTER JOIN есть разница: иногда вам нужно поместить условие в предложение ON, иногда в предложение WHERE.Помещение условия в предложение WHERE для ВНЕШНЕГО СОЕДИНЕНИЯ может превратить его во ВНУТРЕННЕЕ СОЕДИНЕНИЕ (из-за того, как работают NULL)

Например, проверьте читаемость двух следующих образцов:

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c, order o, orderrow r, article a
WHERE o.customer_id = c.customer_id
AND r.order_id = o.order_id
AND a.article_id = r.article_id
AND o.orderdate >= '2003-01-01'
AND o.orderdate < '2004-01-01'
AND c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

против

SELECT c.customer_no, o.order_no, a.article_no, r.price
FROM customer c 
INNER JOIN order o
   ON  o.customer_id = c.customer_id
   AND o.orderdate >= '2003-01-01'
   AND o.orderdate < '2004-01-01'
INNER JOIN orderrow r
   ON  r.order_id = o.order_id
INNER JOIN article a 
   ON  a.article_id = r.article_id
WHERE  c.customer_name LIKE 'A%'
ORDER BY r.price DESC 

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

  1. Это текущий поддерживаемый стандарт.
  2. Он сохраняет соединения в предложении FROM и фильтрует в предложении WHERE.
  3. Это значительно упрощает более сложные соединения LEFT, RIGHT, FULL OUTER.
  4. Справка MSSQL полностью основана на этом синтаксисе, поэтому получить помощь по проблемным запросам гораздо проще.

Хотя технически разницы нет, вам нужно быть особенно осторожным при выполнении соединений с использованием первого метода.Если вы случайно ошибетесь, вы можете в конечном итоге выполнить декартово соединение между вашими таблицами a и b (очень длинный запрос с интенсивным использованием памяти и процессора - он будет сопоставлять каждую отдельную строку в a со всеми строками в b.Плохо, если a и b — большие таблицы).Использование явного INNER JOIN безопаснее и проще для чтения.

Нет разницы.Я считаю первый формат более читабельным и использую второй формат только при выполнении других типов соединений (ВНЕШНЕЕ, ВНУТРЕННЕЕ СЛЕВА и т. д.).

Вторая форма — это синтаксис, совместимый с SQL92.Это должно означать, что он поддерживается всеми нынешними и будущими поставщиками баз данных.Однако правда в том, что первая форма настолько распространена, что гарантированно будет существовать дольше, чем нам нужно.

В остальном они одинаковы во всех отношениях в том, как базы данных обрабатывают их.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top