SQL“执行顺序”与“写入顺序”

时间:2021-06-17 03:05:46

标签: sql hierarchy

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

到目前为止,我得到了这张表,有更好知识的人可以帮助确认我下面的表是否正确吗?也许添加我可能错过的任何其他功能,我不是确定我应该把 JOIN 放在下表的什么位置

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

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

<头>
写作顺序 执行顺序
选择 来自
顶部 哪里
与众不同 分组依据
来自
哪里 选择
分组依据 窗口
合格
下单 与众不同
第二个 下单
合格 顶部
限制 限制

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

您将执行编译混淆了,而且您可能只关心作用域规则。

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

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

  • 表别名在 @objc func doSomething(sender: UIBarButtonItem, forEvent event: UIEvent) { guard let touch = event.allTouches?.first else { return } if touch.tapCount == 1 { // Handle tap } else if touch.tapCount == 0 { // Handle long press } } 子句中定义。因此,出于范围界定的目的,这可以被视为“第一”。
  • 列别名在 FROM 子句中定义。根据 SQL 标准,可以在 SELECT 中使用列别名。许多数据库将此扩展到 ORDER BY(如果支持)、QUALIFYHAVING 子句。通常,数据库在 GROUP BY 子句中不支持它们。
  • 如果 WHERE 中的两个表具有相同的列名,则列必须被限定以标识该表。一个例外是当列是 FROM 中的键并且使用了 JOIN 子句时。那么不合格的列名就可以了。
  • 如果 USING 中定义的列别名与支持列别名的子句中的表别名冲突,则由数据库来选择。
相关问题