JOIN SQL 中的两个关系而不使用 JOIN 子句
JOIN two relations in SQL without using JOIN clause
我有一个users
table和一个books
table。两个 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
作为这种关系的方法。我的问题是:
- 这两个查询在查询结果方面是否等价?
- 为什么我们应该使用一个而不是另一个?
- 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 语法。
我有一个users
table和一个books
table。两个 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
作为这种关系的方法。我的问题是:
- 这两个查询在查询结果方面是否等价?
- 为什么我们应该使用一个而不是另一个?
- 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 语法。