zoukankan      html  css  js  c++  java
  • MySQL SELECT 执行的具体步骤

    1:SELECT 执行的顺序

    8SELECT 
    9DISTINCT <select_list>
    1FROM <left_table>
    3JOIN <right_table>
    2ON <join_condition>
    4WHERE <where_condition>
    5GROUP BY <group_by_list>
    6WITH {CUBE|ROLLUP}
    7HAVING <having_condition>
    10ORDER BY <order_by_list>
    11LIMIT <limit_number>
    

    可以看到最先执行的是FROM 最后会执行LIMIT 。每一个步骤都会产生一个虚拟表,该虚拟表对用户是透明的,之后最后异步生成的虚拟表才会返回给用户。

    2:分析详细的执行过程  

    1:FROM :如果是一个表的话就是从该表选取数据,如果是两个表的话,会执行笛卡尔积,产生虚拟表VT1。

    2:ON:对虚拟表VT1 应用ON筛选,符合条件的行插入到虚拟表VT2 中。

    3:JOIN:如果指定了OUTER JOIN (LEFT OUTER JOIN、RIGHT OUTER JOIN)保留表中未匹配的行作为外部行添加到虚拟表VT2中,产生虚拟表VT3。

    4:WHERE :对虚拟表VT3进行条件过滤,符合条件的插入的虚拟表VT4中。

    5:GROUP BY :对虚拟表VT4进行分组操作。产生虚拟表VT5。

    6:CUBE|ROLLUP对虚拟表VT5进行CUBE或者ROLLUP操作,产生虚拟表VT6.

    7:HAVING:对VT6表进行过滤。符合条件的插入VT7中。

    8:SELECT:第二次执行select操作选择指定的列,插入到虚拟表VT8中。

    9:DISTINCT:去重。然后插入虚拟表VT9中。

    10:ORDER BY :排序,产生虚拟表VT10.

    11:LIMIT:取出指定的行。产生虚拟表VT11,并且返回给用户。

     

  • 相关阅读:
    如何用vue实现树形菜单?
    spring+springMVC,声明式事务失效,原因以及解决办法
    java提高同步锁的几点建议
    java自定义before和after
    java线程池
    jdk并发工具包之锁
    ReentrentLock重入锁
    java守护线程
    ReentrantLock
    java多线程基础
  • 原文地址:https://www.cnblogs.com/xiaoit/p/4585867.html
Copyright © 2011-2022 走看看