Можно ли избежать использования внутреннего соединения в MySQL?

0

После прочтения названия вопроса вы можете найти это глупо, но я серьезно задаю этот вопрос с любопытством в своем уме.

Я использую систему баз данных 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 более эффективным?

Теги:
join
inner-join

2 ответа

0
Лучший ответ

То, что вы смотрите, это синтаксис ANSI-89 (A,B WHERE) и синтаксис ANSI-92 (A JOIN B ON).

Для очень простых запросов нет никакой разницы. Однако с ANSI-92 вы можете сделать несколько вещей, которые вы не можете сделать или которые очень сложно реализовать и поддерживать в ANSI-89. Все, что связано с более чем двумя таблицами, более одного условия в одном соединении или разделение условий LEFT JOIN из условий WHERE, гораздо сложнее читать и работать с более старым синтаксисом.

Синтаксис старого A,B WHERE обычно считается устаревшим и избегается даже для простых запросов, где он все еще работает.

0

Компромиссы оптимизации аппаратного обеспечения не имеют себе равных, и пользователи могут поддерживать свои запросы.

Наличие явного чистого кода лучше, чем эзотерический неявный код. В реальных реляционных базах данных большинство запросов, которые заходят слишком долго, происходят из тех, где таблицы находятся в объединенном списке. Эти запросы показывают, что:

  1. Пользователь не приложил усилий для выражения заказа, к которому эти таблицы объединены.
  2. Все отношения объединяются в одном месте, а не организованы на своем собственном пространстве для каждого объединения.
  3. Если все запросы в таком формате для указанного пользователя, пользователь не использует преимущества внешних соединений. Существует много случаев, когда соотношение между таблицами может быть: (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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню