这两个SQL有什么区别?

时间:2014-05-19 12:49:42

标签: sql join

select a.name from student a, student b
where a.id = b.id and a.id = 1;

VS

select a.name from student a
inner join student b
on a.id = b.id and a.id = 1;

它们实际上是一样的吗?

4 个答案:

答案 0 :(得分:0)

显然它们在语法上是不一样的,但它们在语义上(它们返回相同)。但是,我将第二个写为:

select a.name from student a
inner join student b on a.id = b.id 
where a.id = 1;

答案 1 :(得分:0)

您正在进行的加入是没有意义的,因为您为同一个表提供了不同的别名并加入了相同的字段,即id。

您的选择语句应该如下:

SELECT name FROM stud WHERE id = 1

答案 2 :(得分:0)

后者是按照ansi标准而前者是常规支持的...它们在功能上是等效的...如果你使用后者,你的SQL在各个供应商之间移植的可能性更大

答案 3 :(得分:0)

就查询引擎而言,它们是相同的。

第一种类型,通常称为逗号连接,是大多数(所有?)RDBMS中的隐式内连接。语法来自ANSI SQL 89及更早版本。

第二个连接的语法,称为显式内部连接,在ANSI SQL 92中引入。它被认为是改进的语法,因为即使包含许多表的复杂查询,也很容易看到连接条件和过滤器之间的区别where子句。

ANSI 92语法还允许查询引擎更好地进行优化。如果在连接条件中使用某个东西,则它在连接完成之前(或作为)发生。如果字段被索引,您可以获得一些好处,因为查询引擎将知道不打扰表中的某些行,而如果您将其放在WHERE子句中,则查询引擎将需要加入表完全然后过滤掉结果。 通常 RDBMS会以相同的方式处理它们 - 可能是1000个中的999个案例 - 但并非总是如此。

另见:

Why isn't SQL ANSI-92 standard better adopted over ANSI-89?