JOIN 和简单查询有什么区别

Ift*_*din 0 mysql performance join query-performance

我在数据库中有两张表,一张是Orders,另一张是customers

订单表包含:订单 ID、客户 ID 和订单日期

客户表包含:CustomerID、CustomerName、ContactName 和 country

实际上,“Orders”表中的“CustomerID”列指的是“Customers”表中的“CustomerID”。上面两个表之间的关系是“CustomerID”列。

加入查询

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
    FROM Orders
    INNER JOIN Customers
    ON Orders.CustomerID=Customers.CustomerID;
Run Code Online (Sandbox Code Playgroud)

简单查询

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate
FROM Orders,Customers
WHERE Orders.CustomerID=Customers.CustomerID;
Run Code Online (Sandbox Code Playgroud)

两个查询的结果是: OrderID 、 CustomerName 和 OrderDate

在上面的两个查询中,我得到了相同的结果。我想知道这些查询之间的区别,如果我们可以通过 SIMPLE 查询来实现,为什么要使用 JOIN?

Dav*_*ett 5

没有区别:您的两个示例完全等效,但使用了不同版本的 SQL 语法。数据库引擎将以完全相同的方式处理它们。

您的第一个示例是使用显式连接,并且是当今的首选语法。它是在 SQL-92 标准中引入的,几乎所有 SQL 样式的查询引擎都支持它。

您的第二个示例通常称为隐式连接。它是一种较旧的语法,但仍受大多数基于 SQL 的查询引擎的支持,并且仍在标准中(因此即使较新的语法是首选,也被认为是正确的)。随着显式连接的引入和广泛支持,它很快就失宠了,因为它们通常更清晰、更易于阅读和维护(尽管可以说旧语法具有更简洁的优点)。

请参阅https://en.wikipedia.org/wiki/Join_(SQL)以获取有关此连接类型和其他连接类型的更多示例,包括一些特定于引擎的变体。

  • *“许多基于 SQL 的查询引擎仍然支持”* 应该是 *“全部”* 或 *“几乎所有”*。它仍然在 SQL 标准中,我不明白为什么添加了`JOIN` 支持的 DBMS 会删除对隐式连接语法的支持。 (4认同)