Ответ 1
Нет никакой разницы, но читаемость второй намного лучше, если у вас есть большой запрос с несколькими соединениями, где дополнительные условия для фильтрации.
Разделение кластеров соединения и предложений фильтра - это хорошая вещь:)
Есть ли существенное различие между следующими?
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 есть предпочтение друг от друга?
Нет никакой разницы, но читаемость второй намного лучше, если у вас есть большой запрос с несколькими соединениями, где дополнительные условия для фильтрации.
Разделение кластеров соединения и предложений фильтра - это хорошая вещь:)
Первый синтаксис ANSI 89, последний - ANSI 92.
Для этого конкретного запроса нет никакой разницы. Однако при первом вы теряете возможность отделить фильтр от условия соединения в сложных запросах, а синтаксис для указания LEFT vs RIGHT vs INNER часто путается, особенно если вам нужно идти туда и обратно между разными поставщиками db. Мне совсем не нравится старый синтаксис.
Нет никакой разницы с движком запросов sql.
Для удобства чтения последнее гораздо легче читать, если вы используете разрывы строк и отступы.
Для INNER JOINs не имеет значения, помещаете ли вы "фильтры" и "присоединяетесь" в предложение ON или WHERE, оптимизатор запросов должен решить, что делать первым в любом случае (он может сначала выбрать фильтр, позже присоединиться, или наоборот
Однако для OUTER JOINs существует разница, и иногда вы хотите включить условие в предложение ON, иногда в WHERE. Включение условия в предложение WHERE для OUTER JOIN может превратить его в INNER JOIN (из-за того, как работают 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
В то время как вы можете выполнять большинство задач, используя как в своем случае, так и в вашем случае нет никакой разницы, я всегда буду использовать вторую в любое время.
В то время как нет никакой разницы технически, вам нужно быть более осторожным в выполнении объединений с использованием первого метода. Если вы ошиблись случайно, вы можете сделать декартовое соединение между вашими таблицами a и b (очень длинный, объемный и интенсивный запрос процессора - он будет соответствовать каждой отдельной строке в со всеми строками в b. Плохо, если и b - большие таблицы для начала). Использование явного INNER JOIN более безопасно и легче читать.
Никакой разницы. Я считаю, что первый формат более читабельный и использует второй формат только при выполнении других типов объединений (OUTER, LEFT INNER и т.д.).
Вторая форма - синтаксис, совместимый с SQL92. Это должно означать, что он поддерживается всеми существующими и будущими поставщиками баз данных. Однако, правда состоит в том, что первая форма настолько распространена, что ее также гарантируют, что она будет работать дольше, чем мы заботимся.
В противном случае они одинаковы во всех отношениях в том, как базы данных обрабатывают два.