可以在MySQL中避免使用内连接吗?

时间:2017-12-13 04:10:36

标签: mysql sql join inner-join

在阅读问题标题之后,你可能会发现它很愚蠢,但我真的很怀疑地问这个问题。

我正在使用MySQL数据库系统。

在下面的两个表中考虑:

PublicKey

现在我想了解哪个订单由哪个客户下订单的所有订单的详细信息?

所以,我是以两种方式做到的:

第一种方式:

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;

在这两种情况下,我都得到完全相同的正确结果。我的问题是为什么在MySQL中有一个必要的额外和令人困惑的内部联接概念,因为即使不使用内部联接我们也可以获得相同的结果?

内部加入在任何方面都更有效吗?

2 个答案:

答案 0 :(得分:0)

您所看到的是ANSI-89语法(InsertedObjectsKey)与ANSI-92语法(A,B WHERE)。

对于非常简单的查询,没有区别。但是,使用ANSI-92可以做很多事情,你无法做到或者很难在ANSI-89中实现和维护。涉及两个以上的表,同一个连接中的多个条件,或者从WHERE条件中分离LEFT JOIN条件都是很多更难阅读并使用旧语法。

旧的A JOIN B ON语法通常被认为是过时的并且可以避免,即使对于仍然有效的简单查询也是如此。

答案 1 :(得分:0)

硬件优化的权衡是用户能够维持查询的首选。

拥有明确的干净代码比拥有深奥的隐式代码更好。在实际的生产关系数据库中,大多数花费太长时间的查询来自表格在连接列表中的查询。这些查询显示:

  1. 用户没有努力表达这些表加入的顺序。
  2. 所有关系连接都在一个地方混乱,而是在每个连接的自己的空间上组织。
  3. 如果所有查询都是针对所述用户的格式,则用户不接受 Outer Joins的优势。在许多情况下,表格之间的关系可以是:(1) TO (0-many) (many) TO (many) 而不是 (1) TO (1-many)
  4. 与大多数用例一样,当连接数增加时,这些查询开始成为问题。初学者用户选择通过将表格作为用逗号分隔的列表来查询表格,因为它需要较少的键入。起初,它似乎不是一个问题,因为它们连接在两到三个表中。这反过来成为初学者用户的习惯。当他们开始通过增加连接数来编写更复杂的查询时,这些类型的查询难以维护,如上面的要点所述。

    结论:随着查询中联接的数量不断缩小,不正确的缩进和分类会使查询难以维护。

    您应该使用 INNER JOIN 并在下面标识您的查询,以便其他人可以阅读:

    SELECT 
          Orders.OrderID, 
          Orders.OrderDate, 
          Customers.CustomerName 
    
       FROM Orders
    
       INNER JOIN Customers 
       ON Customers.CustomerID = Orders.CustomerID;