SQL语句 - SELECT的执行顺序

完成SELECT查询

1
2
3
4
5
6
7
8
9
SELECT DISTINCT column, AGG_FUNC(column_or_expression), …
FROM mytable
JOIN another_table
ON mytable.column = another_table.column
WHERE constraint_expression
GROUP BY column
HAVING constraint_expression
ORDER BY column ASC/DESC
LIMIT count OFFSET COUNT;

每个查询都从在数据库中找到我们所需的数据开始,然后将这些数据过滤成可以尽快处理和理解的内容。由于查询的每个部分都是按顺序执行的,因此了解执行顺序很重要,这样您才能知道在何处可以访问哪些结果.

查询执行顺序

  1. FROMJOINs
    首先执行该FROM子句和随后JOIN的,以确定要查询的数据的总工作集。这包括此子句中的子查询,并且可能导致在包含要连接的表的所有列和行的后台创建临时表。

  2. WHERE
    一旦有了全部工作数据集,首先通过WHERE约束应用于各个行,而不满足约束的行将被丢弃。每个约束只能直接从FROM子句中请求的表中访问列。
    SELECT查询部分中的别名在 大多数数据库中不可访问,因为它们可能包含依赖于尚未执行的查询部分的表达式。

  3. GROUP BY
    WHERE后,根据GROUP BY子句中指定列中的公共值,将应用约束后的其余行分组。分组的结果是,该列中的行数与唯一值的数目一样多。隐式地,这意味着仅在查询中具有聚合函数时才需要使用此函数。

  4. HAVING
    如果查询中有一个GROUP BY子句,则该HAVING子句中的约束将应用于已分组的行,丢弃不满足约束的已分组的行。像该WHERE子句一样,大多数数据库中的此步骤也无法访问别名。

  5. SELECT
    SELECT最后,查询部分中的所有表达式都会被计算。

  6. DISTINCT
    在其余的行中,将删除列中标记为的重复值的行DISTINCT。

  7. ORDER BY
    如果ORDER BY子句指定了顺序,则将按指定的数据以升序或降序对行进行排序。由于SELECT查询部分中的所有表达式均已计算,因此您可以在此子句中引用别名。

  8. LIMIT/OFFSET
    最后,落入由所指定的范围之外的行LIMIT和OFFSET从查询返回的被丢弃,在离开最后行的集合。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :