【问题标题】:SQL "Order of execution" vs "Order of writing"SQL“执行顺序”与“写作顺序”
【发布时间】:2021-09-01 20:16:02
【问题描述】:

我是 SQL 语言的新学习者,为我的职业生涯增加知识,我开始了解到在编写查询时,有“写作顺序”与“执行顺序”,但我似乎无法查找列出层次结构的可用 SQL 函数的完整列表

据我所知,我得到了这张表,有更好的知识的人可以帮助确认我下面的表是否正确?也许添加我可能错过的任何其他功能,我不是确定我应该将JOIN 放在下表中的哪个位置

另外,如果我使用不同的 Sql 平台,是否有区别(顺序或函数名称)? 例如,MySql 与 BigQuery。

非常感谢您的帮助,非常感谢初学者阅读这篇文章

Order of writing Order of execution
Select From
Top Where
Distinct Group by
From Having
Where Select
Group by Window
Having QUALIFY
Order by Distinct
Second Order by
QUALIFY Top
Limit Limit

【问题讨论】:

    标签: sql hierarchy


    【解决方案1】:

    SQL 的全部意义在于它是一种“完整的”语言,其中大部分没有特定的设置顺序。今天的 DBMS 将每个 Select 查询作为一个整体进行评估,以确定组装数据集结果的最佳、最有效的方式,这与 Google 地图可能会根据您所在的位置和环境交通确定回家的最佳路径非常相似.

    数据库将在其解释计划命令下提供它们将用于处理您的查询的确切顺序。这称为执行计划。这些步骤中的每一个都在整个表集上执行,并在可能的情况下在并行进程下执行。每个计划中的步骤都没有上面列出的任何名称,而是一个步骤可能会说“对表 A 执行索引扫描”,或“对先前的部分结果集和表 B 执行嵌套循环连接”。例如,在某些情况下,他们会在加入之前过滤记录,而在其他情况下则不会。

    在这些参数中,有些任务总是先于其他任务。例如,所有 Where 子句过滤都发生在聚合和摘要过滤(Having 子句)之前。但是这里几乎没有绝对的规则。

    【讨论】:

    • 这是否意味着查询是根据数据库设计和初始化执行的?如何检索“解释计划命令”以了解我正在使用的数据库的顺序?我可以用 Sql 查询代码得到它吗?非常感谢您的解释
    • 不同的 DBMS 以不同的方式生成它们的计划。您没有指定特定的 DBMS,所以很难说。使用您正在使用的特定 DBMS 在 Google 中查找执行计划,它应该会告诉您。有一种方法可以将您的查询提供给分析器,然后再显示它。
    【解决方案2】:

    写SQL的时候发现select语句的执行顺序和写的顺序不一样

    SQL查询语句的编写顺序是

    选择

    来自

    在哪里

    分组方式

    拥有

    联合

    订购方式

    但实际上SQL语句的执行顺序是

    来自

    在哪里

    分组方式

    拥有

    选择

    联合

    订购方式

    1. SQL会先选择我的表在哪里选择,包括表的限制,(比如连接方式JOIN和限制ON)

    2. SQL会选择我的判断条件是什么,也就是WHERE的问题

    3. 然后它会按分组进行分组并执行HAVING语句。

    4. SELECT语句是在大部分语句执行完之后才执行的,所以一定要明白前面执行的语句会影响它,注意实际工作。这一点尤为重要。

    5. 通过语句的执行顺序,我们可以找到最后一次执行的顺序,这样我们就可以对select中命名的新字段进行排序。

    【讨论】:

      【解决方案3】:

      SQL 是一种声明性语言,而不是过程性语言。这意味着 SQL 编译器和优化器确定实际运行的操作。这些操作通常采用操作的有向无环图 (DAG) 的形式。

      运算符与原始查询没有明显的关系——除了它生成的结果保证是相同的。就执行而言,没有子句,只有“hash join”、“filter”和“sort”之类的东西——或者数据库为 DAG 实现的任何东西。

      您将 执行编译 混淆了,可能您只关心范围规则。

      因此,从 SQL 开始,有一组子句,它们的顺序非常明确。您的问题包含此顺序 - 至少对于支持这些子句的数据库而言。

      第二部分是识别标识符的顺序。基本上,这归结为:

      • 表别名在FROM 子句中定义。因此,出于范围界定的目的,这可以被视为“第一”。
      • 列别名在SELECT 子句中定义。根据 SQL 标准,列别名可以在 ORDER BY 中使用。许多数据库将此扩展到QUALIFY(如果支持)、HAVINGGROUP BY 子句。一般来说,数据库在WHERE 子句中不支持它们。
      • 如果FROM 中的两个表具有相同的列名,那么列必须是限定的 来标识表。一个例外是当列是JOIN 中的键并且使用USING 子句时。那么不合格的列名就可以了。
      • 如果SELECT 中定义的列别名与支持列别名的子句中的表别名冲突,则由数据库选择。

      【讨论】:

        猜你喜欢
        • 2020-12-25
        • 2014-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多