代码之家  ›  专栏  ›  技术社区  ›  Ben

所有这些SQL连接在逻辑上是等价的吗?

  •  5
  • Ben  · 技术社区  · 17 年前

    我只是想知道下面的连接是否在逻辑上是等价的,如果不是,为什么不是?

    SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;
    
    SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a where t1.b=t2.b and t1.c = t2.c;
    
    SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b where t1.c = t2.c;
    
    SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;
    

    我使用MySQL,以防这会有所不同。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Tony Andrews    17 年前

    它们在逻辑上是等价的,应该产生相同的结果。然而,最后一个是首选的,因为它更正确地说明了查询的语义,即“连接表t1和t2”。

    WHERE子句应用于联接的“筛选”结果-例如。

    ... WHERE t2.some_col > 10
    

        2
  •  2
  •   Bill Karwin    17 年前

    是的,正如其他人所说,所有这些查询的结果都是相同的。

    FWIW,在对两个表中相同的列名进行相等联接时,也可以使用此速记语法:

    SELECT t1.x, t2.y from t1 join t2 using (a, b, c);
    

    就优化而言,它是 应该 同样要优化。也就是说,RDBMS应该足够智能,能够分析 WHERE 语法相同,并执行联接,而不是生成中间巨大的交叉联接结果并对其应用过滤条件。这是一种常见的查询类型,对于给定的RDBMS实现来说,识别和优化它也是很常见的。

    对于MySQL,join和where(某种程度上)一起计算。试用 EXPLAIN 来分析您的查询。如果“ type eq_ref “这意味着它正在使用索引联接。这是优化方面最好的联接类型。如果” 类型 “是” ref

    JOIN...ON 子句或 哪里

        3
  •  2
  •   Constantin    17 年前

    对于内部联接,它在逻辑上没有区别,优化器应该生成相同的计划。但对于外部联接,是否将条件置于WHERE或FROM中变得很重要。。。JOIN子句。这是因为FROM和ON子句在WHERE子句之前处理: ANSI SQL logical query processing http://www.sqlmag.com/Files/09/94378/Figure_01.jpg

        4
  •  1
  •   achinda99    17 年前

    它们在逻辑上是等价的。但是,定义联接条件的位置会对应用where子句的临时表中使用的记录数量产生影响。就是,

    如果表t1、t2和t3各有10条记录,

    SELECT t1.x, t2.y from t1, t2 where t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;
    

    结果是三个表记录排列的1000条记录,然后应用where子句。

    对于

    SELECT t1.x, t2.y from t1 join t2 on t1.a=t2.a and t1.b=t2.b and t1.c = t2.c;