C ++ делает это так, потому что C сделал это так, поэтому реальный вопрос - почему C сделал это так? Википедия немного говорит об этом.
Новые скомпилированные языки (такие как Java, C #) не используют форвардные объявления; идентификаторы автоматически распознаются из исходных файлов и считываются непосредственно из динамических символов библиотеки. Это означает, что файлы заголовков не нужны.
Реляционная алгебра допускает взаимозаменяемость предикатов в предложении WHERE
и INNER JOIN
, поэтому даже запросы INNER JOIN
с В предложениях WHERE
предикаты могут быть переупорядочены оптимизатором, так что они могут быть исключены во время процесса JOIN
.
Я рекомендую вам писать запросы в наиболее читаемом
Иногда это включает в себя включение INNER JOIN
относительно «неполного» и включение некоторых критериев в WHERE
просто для составления списков
Например, вместо:
SELECT * FROM Customers c INNER JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID И c.State = 'NY' INNER JOIN Учетные записи a ON ca.AccountID = a.AccountID AND a.Status = 1
Запись:
SELECT * FROM Customers c INNER JOIN CustomerAccounts ca ON ca.CustomerID = c.CustomerID INNER JOIN Счета a ON ca.Acc ountID = a.AccountID WHERE c.State = 'NY' AND a.Status = 1
Но это зависит, конечно.
Большинство продуктов RDBMS будут оптимизировать оба запроса одинаково. В «настройке производительности SQL» Питера Гулуцана и Труди Пельцер они протестировали несколько брендов РСУБД и не обнаружили разницы в производительности.
Я предпочитаю сохранять условия соединения отдельно от условий ограничения запроса.
Если вы используете OUTER JOIN
, иногда необходимо добавить условия в предложение join.
Объединяется быстрее, на мой взгляд, когда у вас большой стол. Это действительно не такая уж большая разница, особенно если вы имеете дело с довольно маленькой таблицей. Когда я впервые узнал о объединениях, мне сказали, что условия в соединениях аналогичны условиям условий предложения и что я могу использовать их взаимозаменяемо, если предложение where было специфическим для какой таблицы выполнить условие.
Полагая условие в соединении кажется мне «семантически неправильным», поскольку это не то, что JOINs «для». Но это очень качественно.
Дополнительная проблема: если вы решили переключиться с внутреннего соединения на, скажем, правое соединение, имея условие внутри JOIN, это может привести к неожиданным результатам.
Лучше добавить условие в Join. Производительность важнее, чем читаемость. Для больших наборов данных это важно.
Я предпочитаю, чтобы JOIN присоединился к полным таблицам / представлениям, а затем использовал WHERE Чтобы ввести предикат результирующего набора.
Он чувствует себя синтаксически чистым.
Обычно я вижу увеличение производительности при фильтрации по соединению. Особенно, если вы можете присоединиться к индексированным столбцам для обеих таблиц. Вы должны иметь возможность сокращать логические чтения с помощью большинства запросов, которые тоже делают это в среде с большими объемами, что намного лучше, чем время выполнения.
Я всегда слегка удивляюсь, когда кто-то показывает их бенчмаркинг SQL, и они выполнили обе версии sproc 50 000 раз в полночь на сервере dev и сравнили среднее время.
Для внутренних объединений я действительно не заметил разницы (но, как и при любой настройке производительности, вам нужно проверить свою базу данных в ваших условиях).
Однако, когда вы ставите условие, это имеет огромное значение если вы используете левое или правое соединение. Например, рассмотрите эти два запроса:
SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD.CustomerID WHERE ORD.OrderDate & gt; '20090515' SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD.CustomerID AND ORD.OrderDate & gt; '20090515'
Первый даст вам только те записи которые имеют приказ от 15 мая 2009 года, таким образом преобразовывая левое соединение во внутреннее соединение. Второй даст эти записи плюс любые клиенты без заказов. Набор результатов очень отличается в зависимости от того, где вы положили условие. (Выберите *, если, например, только для целей, вы не должны использовать, конечно, производственный код.) Исключением является то, что вы хотите видеть только записи в одной таблице, а не другую. Затем вы используете предложение where для условия, а не соединения.
SELECT * FROM dbo.Customers AS CUS LEFT JOIN dbo.Orders AS ORD ON CUS.CustomerID = ORD.CustomerID ГДЕ ORD.OrderID - null
WHERE будет фильтроваться после того, как произошел JOIN.
Фильтр в JOIN, чтобы предотвратить добавление строк во время процесса JOIN.