После прочтения названия вопроса вы можете найти это глупо, но я серьезно задаю этот вопрос с любопытством в своем уме.
Я использую систему баз данных MySQL.
Рассмотрим ниже две таблицы:
Customers(CustomerID(Primary Key), CustomerName, ContactName, Address, City, PostalCode, Country)
Orders(OrderID(Primary Key), CustomerID(Foreign Key), EmployeeID, OrderDate, ShipperID)
Теперь я хочу получить подробную информацию обо всех заказах, какой заказ сделан кем-либо из клиентов?
Итак, я сделал это двумя способами:
Первый путь:
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Customers AS c, Orders AS o
WHERE c.CustomerID=o.CustomerID;
Второй способ:
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Orders
INNER JOIN Customers ON Orders.CustomerID=Customers.CustomerID;
В обоих случаях я получаю точно такой же правильный результат. Мой вопрос в том, почему существует необходимость в дополнительной и запутанной концепции Inner Join в MySQL, так как мы можем достичь тех же результатов даже без использования Inner Join?
Является ли Inner Join более эффективным?
То, что вы смотрите, это синтаксис ANSI-89 (A,B WHERE
) и синтаксис ANSI-92 (A JOIN B ON
).
Для очень простых запросов нет никакой разницы. Однако с ANSI-92 вы можете сделать несколько вещей, которые вы не можете сделать или которые очень сложно реализовать и поддерживать в ANSI-89. Все, что связано с более чем двумя таблицами, более одного условия в одном соединении или разделение условий LEFT JOIN из условий WHERE, гораздо сложнее читать и работать с более старым синтаксисом.
Синтаксис старого A,B WHERE
обычно считается устаревшим и избегается даже для простых запросов, где он все еще работает.
Компромиссы оптимизации аппаратного обеспечения не имеют себе равных, и пользователи могут поддерживать свои запросы.
Наличие явного чистого кода лучше, чем эзотерический неявный код. В реальных реляционных базах данных большинство запросов, которые заходят слишком долго, происходят из тех, где таблицы находятся в объединенном списке. Эти запросы показывают, что:
(1) TO (0-many)
OR (many) TO (many)
вместо (1) TO (1-many)
.Как и в большинстве случаев использования, эти запросы начинают становиться проблемой, когда число объединений увеличивается. Начинающие пользователи предпочитают запрашивать таблицы, помещая их в список, разделенный запятой, потому что он занимает меньше места. Поначалу это не проблема, потому что они объединены с двумя-тремя таблицами. Это, в свою очередь, становится привычкой для начинающего пользователя. По мере того, как они начинают писать более сложные запросы, увеличивая количество объединений, этот тип запросов сложнее поддерживать, как описано выше.
Заключение: поскольку количество объединений в масштабах запросов, неправильный отступ и категоризация делают запрос сложнее в обслуживании.
Вы должны использовать INNER JOIN и идентифицировать свой запрос, как показано ниже, чтобы другим было легко читать:
SELECT
Orders.OrderID,
Orders.OrderDate,
Customers.CustomerName
FROM Orders
INNER JOIN Customers
ON Customers.CustomerID = Orders.CustomerID;