【SQL问题】三张表连接查询的两种方式对比


  • cid:81:privileges:read

    当用三张表做链接查询时,有如下两种方式:

    SELECT …
    FROM table1, table2, table3
    WHERE table1.c1=table2.c2 and table2.c3=table3.c3

    SELECT …
    FROM table1 join table2 on table1.c1=table2.c2
          join table3 on table2.c3=table3.c3

    请问这两种方式各自有什么优缺点呢?


  • cid:81:privileges:read

    下面是我自己的一点理解,有不对的地方欢迎同学和老师指正~

    从逻辑上讲,一条query的执行顺序大致是这样的:

    1. FROM
    2. ON
    3. JOIN
    4. WHERE
    5. GROUP BY
    6. WITH CUBE or WITH ROLLUP
    7. HAVING
    8. SELECT
    9. DISTINCT
    10. ORDER BY
    11. TOP

    (在实际中还要考虑到索引,数据分布等,以及不同数据库最终优化器如何处理。)

    我们知道连接表的时候是要每两张表做笛卡尔积。用Join…on时是显性连接,用where连接表时是隐性连接。而where是比join…on后执行的。

    所以再看上面的两个例子,在第一个query中,table1, table2, table3先计算笛卡尔积,也就是说生成一张有mnl条记录的虚拟表,然后在在其中找到满足where条件的记录。

    在第二个例子中,table1和table2先做笛卡尔积,选出满足table1.c1=table2.c2的记录(这时记录数少于m*n条)。再将这个临时表与table3做笛卡尔积(*l),选出满足table2.c3=table3.c3的记录。

    虽然两条query的结果都一样,但在第二种方式中做笛卡尔积的数量少于第一种,所以第二种效率更高。

    关于join…on和where的对比可参见这里



  • 另外补充一下jingxuan的回答:

    • optimizer很可能会改变你的query, 使得它更有效.
    • 想要知道database如何处理一条query, 大家可以搜索下如何看execution plan.
    • 想要知道哪一条更有效率, 除了看execution plan和做计算外, 还有一个方法就是都试试, 然后比较下时间. :)

 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待