zoukankan      html  css  js  c++  java
  • sql join 与where的区别

    在公司里帮新人检查问题时发现,发现有人写的SQL不习惯用join语句,看着写的挺简单,但是数据量多了执行起来会很慢。

    仔细看,经常会在一个SQL查询中的from中写多个表,例如:select a.a1,a.a2,b.b1,b.b2 from a,b where a.a3=b.b3,其中a,b是表,a1、a2、a3、b1、b2、b3是a表和b表的列。

    看上去怪怪的,但是具体为什么执行效率慢又讲不出个所以然来,下面的内容是转的别人的,学习下理论知识,整理下思路。

    【转】今天在分析一个sql语句的时候 发现 left join 与where a=b(+) 产生的执行计划不一样 而且效率也是不一样的
    到底怎么回事 我在网上找了篇文章分享 
    (1.)select语句的执行顺序

    Processing Order of the SELECT statement
    The following steps show the processing order for a SELECT statement.

    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

    也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据. 

    这些步骤执行时, 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。

    如果没有在查询中指定某一子句,将跳过相应的步骤。
    (2) 那 on 和where 那个更高效呢

    如果是inner join, 放on和放where产生的结果一样, 但没说哪个效率速度更高? 如果有outer join (left or right), 就有区别了, 因为on生效在先, 已经提前过滤了一部分数据, 而where生效在后.

    综合一下, 感觉还是放在on里更有效率, 因为它先于where执行.

     先笛卡尔积, 然后再on过滤, 如果join是inner的, 就继续往下走, 如果join 是left join, 就把on过滤掉的左主表中的数据再添加回来; 然后再执行where里的过滤;

    on中不是最终过滤, 因为后面left join还可能添加回来, 而where才是最终过滤.

    只有当使用外连接(left, right)时, on 和 where 才有这个区别, 如果用inner join, 在哪里制定都一样, 因为on 之后就是where, 中间没有其它步骤.

  • 相关阅读:
    linux基础——文件的压缩解压缩以及vim编辑
    linux基础——关于chmod用户权限和文件的相关操作
    linux基础的基础命令操作
    操作系统和网络基础之网络协议
    计算机基础
    【python小记】访问mysql数据库
    Qt去掉treeview项的焦点虚线
    嵌入式qt显示中文和隐藏鼠标
    【vim小记】自动保存配置
    重回ubutntu12.04小记(装完ubuntu做的几件事)
  • 原文地址:https://www.cnblogs.com/saotao/p/4858769.html
Copyright © 2011-2022 走看看