SQL "Order of execution" 对比 "Order of writing"
SQL "Order of execution" vs "Order of writing"
我是 SQL 语言的新手,想为我的职业生涯增加知识,我开始了解到在编写查询时,有一个“编写顺序”与“执行顺序”,但是我似乎无法找到列出层次结构
的可用 SQL 函数的完整列表
到目前为止,我得到了这个 table,有更好知识的人可以帮助确认我下面的 table 是否正确吗? 也许添加我可能错过的任何其他功能,我不确定我应该把 JOIN
放在下面 table 的什么地方
此外,如果我使用不同的 Sql 平台,是否存在差异(顺序或功能名称)?
MySql 对比 BigQuery,例如
非常感谢您的帮助,非常感谢初学者阅读这篇文章post
书写顺序
执行顺序
Select
来自
顶部
在哪里
不同
分组依据
来自
有
在哪里
Select
分组依据
Window
有
合格
订购方式
不同
第二
订购方式
合格
顶部
限制
限制
SQL 的全部要点在于它是一种 'whole set' 语言,其中大部分内容都没有特定的固定顺序。今天的 DBMS 将每个 Select 查询作为一个整体进行评估,以确定 assemble 数据集结果的最佳、最有效的方式,这与 Google 地图可能确定最佳路径的方式大致相同根据您所在的位置和周围的路况送您回家。
数据库将根据其解释计划命令提供它们将用于处理您的查询的确切顺序。这称为执行计划。这些步骤中的每一步都在整个 table 集上执行,并尽可能在并行过程中执行。每个计划中的步骤都没有上面列出的任何您的名字,而是一个步骤可能会说“对 table A 执行索引扫描”,或“对先前的部分结果集执行嵌套循环连接并 tableB”。在某些情况下,他们会在加入之前过滤记录,而在其他情况下,他们不会,例如。
在这些参数中,有些任务总是先于其他任务。例如,所有 Where 子句过滤都发生在聚合和汇总过滤(Having 子句)之前。但是这里几乎没有绝对的规则。
写SQL的时候发现select语句的执行顺序和写的顺序不一样
SQL个查询语句的写入顺序是
SELECT
来自
哪里
分组依据
拥有
联盟
订购方式
但实际上SQL语句的执行顺序是
来自
哪里
分组依据
拥有
SELECT
联盟
订购方式
SQL会先选择我的table在哪里被select编辑,包括table的限制,(比如连接方式JOIN和限制)
SQL会选择我的判断条件是什么,也就是WHERE
的问题
然后会逐个分组执行HAVING语句
SELECT语句是在大部分语句执行完之后才执行的,所以一定要明白前面执行的语句会对其产生影响,实际工作中要注意。这一点尤为重要。
根据语句的执行顺序,我们可以找到最后一次执行的顺序,因此我们可以对select中命名的新字段进行排序。
SQL 是声明性语言,不是过程性语言。这意味着 SQL 编译器和优化器确定哪些操作实际上是 运行。这些操作通常采用操作的有向无环图 (DAG) 的形式。
运算符与原始查询没有明显的关系 -- 除了它生成的结果保证是相同的。在 执行 方面,没有子句,只有“散列连接”、“过滤器”和“排序”之类的东西——或者数据库为 DAG 实现的任何东西。
您混淆了执行和编译,您可能只关心作用域规则。
因此,从 SQL 开始有一组子句,这些子句的顺序非常明确。您的问题包含此顺序 - 至少对于支持这些子句的数据库而言。
第二部分是识别标识符的顺序。基本上,这归结为:
- Table 别名在
FROM
子句中定义。因此,出于范围界定的目的,这可以被视为“第一”。
- 列别名在
SELECT
子句中定义。按照 SQL 标准,列别名可以在 ORDER BY
中使用。许多数据库将其扩展到 QUALIFY
(如果支持)、HAVING
和 GROUP BY
子句。一般来说,数据库不支持在 WHERE
子句中。
- 如果
FROM
中的两个 table 具有相同的列名,则 列必须被限定 以识别 table.一个例外是当列是 JOIN
中的键并且使用 USING
子句时。那么非限定的列名就可以了
- 如果
SELECT
中定义的列别名与支持列别名的子句中的 table 别名冲突,则由数据库选择。
我是 SQL 语言的新手,想为我的职业生涯增加知识,我开始了解到在编写查询时,有一个“编写顺序”与“执行顺序”,但是我似乎无法找到列出层次结构
的可用 SQL 函数的完整列表到目前为止,我得到了这个 table,有更好知识的人可以帮助确认我下面的 table 是否正确吗? 也许添加我可能错过的任何其他功能,我不确定我应该把 JOIN
放在下面 table 的什么地方
此外,如果我使用不同的 Sql 平台,是否存在差异(顺序或功能名称)? MySql 对比 BigQuery,例如
非常感谢您的帮助,非常感谢初学者阅读这篇文章post
书写顺序 | 执行顺序 |
---|---|
Select | 来自 |
顶部 | 在哪里 |
不同 | 分组依据 |
来自 | 有 |
在哪里 | Select |
分组依据 | Window |
有 | 合格 |
订购方式 | 不同 |
第二 | 订购方式 |
合格 | 顶部 |
限制 | 限制 |
SQL 的全部要点在于它是一种 'whole set' 语言,其中大部分内容都没有特定的固定顺序。今天的 DBMS 将每个 Select 查询作为一个整体进行评估,以确定 assemble 数据集结果的最佳、最有效的方式,这与 Google 地图可能确定最佳路径的方式大致相同根据您所在的位置和周围的路况送您回家。
数据库将根据其解释计划命令提供它们将用于处理您的查询的确切顺序。这称为执行计划。这些步骤中的每一步都在整个 table 集上执行,并尽可能在并行过程中执行。每个计划中的步骤都没有上面列出的任何您的名字,而是一个步骤可能会说“对 table A 执行索引扫描”,或“对先前的部分结果集执行嵌套循环连接并 tableB”。在某些情况下,他们会在加入之前过滤记录,而在其他情况下,他们不会,例如。
在这些参数中,有些任务总是先于其他任务。例如,所有 Where 子句过滤都发生在聚合和汇总过滤(Having 子句)之前。但是这里几乎没有绝对的规则。
写SQL的时候发现select语句的执行顺序和写的顺序不一样
SQL个查询语句的写入顺序是
SELECT
来自
哪里
分组依据
拥有
联盟
订购方式
但实际上SQL语句的执行顺序是
来自
哪里
分组依据
拥有
SELECT
联盟
订购方式
SQL会先选择我的table在哪里被select编辑,包括table的限制,(比如连接方式JOIN和限制)
SQL会选择我的判断条件是什么,也就是WHERE
的问题然后会逐个分组执行HAVING语句
SELECT语句是在大部分语句执行完之后才执行的,所以一定要明白前面执行的语句会对其产生影响,实际工作中要注意。这一点尤为重要。
根据语句的执行顺序,我们可以找到最后一次执行的顺序,因此我们可以对select中命名的新字段进行排序。
SQL 是声明性语言,不是过程性语言。这意味着 SQL 编译器和优化器确定哪些操作实际上是 运行。这些操作通常采用操作的有向无环图 (DAG) 的形式。
运算符与原始查询没有明显的关系 -- 除了它生成的结果保证是相同的。在 执行 方面,没有子句,只有“散列连接”、“过滤器”和“排序”之类的东西——或者数据库为 DAG 实现的任何东西。
您混淆了执行和编译,您可能只关心作用域规则。
因此,从 SQL 开始有一组子句,这些子句的顺序非常明确。您的问题包含此顺序 - 至少对于支持这些子句的数据库而言。
第二部分是识别标识符的顺序。基本上,这归结为:
- Table 别名在
FROM
子句中定义。因此,出于范围界定的目的,这可以被视为“第一”。 - 列别名在
SELECT
子句中定义。按照 SQL 标准,列别名可以在ORDER BY
中使用。许多数据库将其扩展到QUALIFY
(如果支持)、HAVING
和GROUP BY
子句。一般来说,数据库不支持在WHERE
子句中。 - 如果
FROM
中的两个 table 具有相同的列名,则 列必须被限定 以识别 table.一个例外是当列是JOIN
中的键并且使用USING
子句时。那么非限定的列名就可以了 - 如果
SELECT
中定义的列别名与支持列别名的子句中的 table 别名冲突,则由数据库选择。