JOIN SQL 中的两个关系而不使用 JOIN 子句

JOIN two relations in SQL without using JOIN clause

我有一个userstable和一个bookstable。两个 table 具有非常标准的一对多关系。它们的数据和结构如下:

users table:

books table:

要获取每个用户拥有哪些书籍的信息,我通常会执行标准 JOIN 查询:

SELECT * FROM users JOIN books ON users.id = books.user_id

同时,我遇到了另一个查询,它似乎做同样的工作,写为:

SELECT * FROM users, books WHERE users.id = books.id

这两个查询似乎给出了完全相同的结果如下

没有 JOIN 子句的第二个查询我在 Standford 的在线课程之一中看到它似乎工作正常。然而,我被教导使用,并看到其他开发人员使用 JOIN 作为这种关系的方法。我的问题是:

  1. 这两个查询在查询结果方面是否等价?
  2. 为什么我们应该使用一个而不是另一个?
  3. SQL 引擎在执行这两个时是否表现不同?

我想说这两个查询除了可读性之外没有区别。由于您要在此处连接两个表,因此使用连接而不是 where 子句更有意义。

1.结果:

这两个查询肯定会给您相同的结果

2。哪个更好

推荐使用第一种。因为它在很多方面都更安全。例如,如果我们必须执行 INNER JOIN,使用第二种语法:

SELECT * 
FROM users, books 
WHERE users.id = books.id

如果忘记WHERE users.id = books.id,查询won't fail。但是它会 return 一个 cross join 而我们可能不会注意到这个错误。

但是,使用第一种语法:

SELECT * 
FROM users 
JOIN books ON users.id = books.user_id

如果我们忘记了ON条件,我们会得到一个syntax error。此外,做一个 CROSS JOIN 将在第一个语法中非常全面:

SELECT *
FROM users CROSS JOIN books 

比第二种语法。

参考这个Blog

3。性能:

据我所知,这两个查询之间没有性能差异

附加信息:

两个查询的区别在于JOIN语法:

  • 第一个使用 ANSI-92 JOIN 语法。
  • 第二个使用旧的 ANSI-89 JOIN 语法。