在阅读问题标题之后,你可能会发现它很愚蠢,但我真的很怀疑地问这个问题。
我正在使用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中有一个必要的额外和令人困惑的内部联接概念,因为即使不使用内部联接我们也可以获得相同的结果?
内部加入在任何方面都更有效吗?
答案 0 :(得分:0)
您所看到的是ANSI-89语法(InsertedObjectsKey
)与ANSI-92语法(A,B WHERE
)。
对于非常简单的查询,没有区别。但是,使用ANSI-92可以做很多事情,你无法做到或者很难在ANSI-89中实现和维护。涉及两个以上的表,同一个连接中的多个条件,或者从WHERE条件中分离LEFT JOIN条件都是很多更难阅读并使用旧语法。
旧的A JOIN B ON
语法通常被认为是过时的并且可以避免,即使对于仍然有效的简单查询也是如此。
答案 1 :(得分:0)
硬件优化的权衡是用户能够维持查询的首选。
拥有明确的干净代码比拥有深奥的隐式代码更好。在实际的生产关系数据库中,大多数花费太长时间的查询来自表格在连接列表中的查询。这些查询显示:
(1) TO (0-many)
或 (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;