Inner Join vs Where

现在有两种Sql:

  • Inner Join

    1
    2
    3
    select * from Table1 a  
    Inner join Table2 b
    On a.index = b.index
  • Where

    1
    2
    select * from Table1 a,Table2 b
    where a.index = b.index

    这两种SQL有什么区别,除了语法上的区别,结果上看也看不出区别来。其实这两种SQL的作用是一样的。我们先将这两个sql放到MySql上看看结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Explain select * from Table1 a  
    Inner join Table2 b
    On a.index = b.index


    -- 0 select statement
    -- 1 hash join (access("a"."index"="b"."index"))
    -- 2 table access full table1
    -- 3 table access full table2



    Explain select * from Table1 a,Table2 b
    where a.index = b.index


    -- 0 select statement
    -- 1 hash join (access("a"."index"="b"."index"))
    -- 2 table access full table1
    -- 3 table access full table2

由此可见,这两种年语法的sql在MySql里面执行的步骤都是完全一样的。这两种语法的执行区别是由数据库的优化器来决定的,目前MySql 5.0以上对于这两种预发的执行是完全相同的。使用Where语法连接表是老式的语法,两者在表现上没有区别。

但是使用where来连接表是一种很不好的代码风格,当多个表来连接时,难以判断各个表之间的连接关系,微软在其SQL Server 2005之后就已经开始deprecated 这种语法。