• SQL执行顺序


    SQL 是一种为数不多的声明性语言,我们告诉系统我们需要什么。


    SQL语句的语法顺序:

    ```
    SELECT [DISTINCT]
    FROM
    JOIN
    ON
    WHERE
    GROUP BY
    HAVING
    ORDER BY
    LIMIT
    ```

    对于MySQL,除了第一行,其他部分都是可选的,有的DBMS要求FROM从句也是必须的。


    执行顺序:

    ```
    (1) FROM <left_table>
    (2) ON <join_condition>
    (3) <join_type> JOIN <right_table>
    (4) WHERE <where_condition>
    (5) GROUP BY <group_by_list>
    (6) HAVING <having_condition>
    (7) SELECT
    (8) DISTINCT <select_list>
    (9) ORDER BY <order_by_condition>
    (10) LIMIT <limit_number>
    ```


    SQL语句的执行过程中,每一步都会产生一个虚拟表用来保存SQL语句的执行结果 为下一步提供数据。


    > from

    sql首先执行from将数据从硬盘加载到数据缓冲区中,以便对这些数据进行操作。如果有多个表则求所有表的笛卡尔积。
    (table1的记录条数 * table2的记录条数 * tableN的记录条数)这时第一个虚拟表产生VT1


    > on

    其次执行on,从VT1中取出匹配on条件的行, 产生VT2。


    > join

    left join,right join 外部连接就是在这个时候执行的,在VT2的基础上添加符合条件的外部的行,产生VT3。


    > where

    执行where过滤,产生VT4
    *由于这个时候select没有执行,所以select中的别名不可以用于where
    SELECT T1.c1 + T1.c2 AS v FROM T1 WHERE v = 1
    -- v 在此处不可用,因为先执行where语句
    SELECT T1.c1 + T1.c2 AS v FROM T1 WHERE (T1.c1 + T1.c2 ) = 1


    > group by

    在VT4的基础上执行group by 分组数据,产生VT5。


    > having

    在VT5的基础上执行having过滤,产生VT6。


    > select

    查出我们要的字段,产生VT7。


    > order by

    排序 产生VT8


    > limit

    限制返回行数


    SQL 语言的核心是对表的引用(table references)

  • 相关阅读:
    Android Jetpack之WorkManager: 观察结果
    解决'androidx.arch.core:core-runtime' has different version for the compile (2.0.0) and runtime (2.0.1)
    我要研究一下minio,管理大量的照片
    分发消息的写法
    百度地图坐标转换
    HighChart 实现从后台取数据来实时更新柱状和折线组图
    导出Excel
    Java 8新特性之集合
    java中的Switch case语句
    提问:"~"运算符
  • 原文地址:https://www.cnblogs.com/anyeshe/p/5750504.html
Copyright © 2020-2023  润新知