代码之家  ›  专栏  ›  技术社区  ›  user9059272

MySQL中是否可以避免使用内部连接?

  •  0
  • user9059272  · 技术社区  · 8 年前

    读过题目后,你可能会觉得很傻,但我怀着好奇认真地问这个问题。

    我正在使用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;
    

    在这两种情况下,我得到了完全相同的正确结果。我的问题是,为什么需要一个额外的、令人困惑的概念 内部联接 在MySQL中,即使不使用 内部联接 ?

    内部联接在任何方面都更有效吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   Joel Coehoorn    8 年前

    您看到的是ANSI-89语法( A,B WHERE )vs ANSI-92语法( A JOIN B ON ).

    对于 非常简单的查询 ,没有区别。然而,在ANSI-92中有许多事情是您无法完成的,或者在ANSI-89中很难实现和维护。涉及两个以上的表,同一联接中的多个条件,或将左联接条件与所有条件分离 在旧语法中更难阅读和使用。

    老年人 A、 B其中 语法通常被认为已经过时并被避免,即使对于仍然有效的简单查询也是如此。

        2
  •  0
  •   softdevlife    8 年前

    对于能够维护查询的用户来说,硬件优化的权衡是首屈一指的。

    使用显式干净代码比使用深奥的隐式代码要好。在实际的生产关系数据库中,大多数耗时过长的查询来自表位于串联列表中的查询。这些查询显示:

    1. 用户没有努力表达这些表的联接顺序。
    2. 所有关系联接都杂乱无章地放在一个地方,而不是为每个联接组织在自己的空间中。
    3. 如果所述用户的所有查询都采用这种格式,则用户不接受 的优点 Outer Joins . 在许多情况下,表之间的关系可以是: (1) TO (0-many) (many) TO (many) 而不是 (1) TO (1-many) .

    与大多数用例一样,当连接数增加时,这些查询开始成为一个问题。初学者选择通过将表放在以逗号分隔的列表中来查询表,因为这样键入的时间更短。起初,这似乎不是问题,因为它们是针对两到三个表进行连接的。这反过来又成为初学者的习惯。当他们开始通过增加连接的数量来编写更复杂的查询时,这些类型的查询很难维护,正如上面的要点所述。

    结论:随着查询中连接数的增加,不正确的缩进和分类会使查询更难维护。

    您应该使用 内部联接 并将您的查询标识如下,以便其他人阅读:

    SELECT 
          Orders.OrderID, 
          Orders.OrderDate, 
          Customers.CustomerName 
    
       FROM Orders
    
       INNER JOIN Customers 
       ON Customers.CustomerID = Orders.CustomerID;
    
    推荐文章