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;
它们实际上是一样的吗?
答案 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个案例 - 但并非总是如此。
另见: