SQL-СОЕДИНЕНИЕ:ВКЛ против равных
Вопрос
Есть ли существенная разница между следующим?
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
Хотя вы можете выполнять большинство задач, используя оба варианта, и в вашем случае нет никакой разницы, я всегда буду использовать второй.
- Это текущий поддерживаемый стандарт.
- Он сохраняет соединения в предложении FROM и фильтрует в предложении WHERE.
- Это значительно упрощает более сложные соединения LEFT, RIGHT, FULL OUTER.
- Справка MSSQL полностью основана на этом синтаксисе, поэтому получить помощь по проблемным запросам гораздо проще.
Хотя технически разницы нет, вам нужно быть особенно осторожным при выполнении соединений с использованием первого метода.Если вы случайно ошибетесь, вы можете в конечном итоге выполнить декартово соединение между вашими таблицами a и b (очень длинный запрос с интенсивным использованием памяти и процессора - он будет сопоставлять каждую отдельную строку в a со всеми строками в b.Плохо, если a и b — большие таблицы).Использование явного INNER JOIN безопаснее и проще для чтения.
Нет разницы.Я считаю первый формат более читабельным и использую второй формат только при выполнении других типов соединений (ВНЕШНЕЕ, ВНУТРЕННЕЕ СЛЕВА и т. д.).
Вторая форма — это синтаксис, совместимый с SQL92.Это должно означать, что он поддерживается всеми нынешними и будущими поставщиками баз данных.Однако правда в том, что первая форма настолько распространена, что гарантированно будет существовать дольше, чем нам нужно.
В остальном они одинаковы во всех отношениях в том, как базы данных обрабатывают их.