SQL查询有没有特定的执行顺序?

问题描述 投票:0回答:2

我对 SQL 查询的执行顺序感到困惑。

例如,(下面代码中

Inner join
中的
MySQL
),在
WHERE
子句和
SELECT * FROM
子句之间,哪一个首先被解释和执行?

也就是说,下面的查询是不是先带上

*
tables data
(全部),然后再查找符合
WHERE
条件的case?或者他们是否只是找到与
data
条件匹配的
WHERE
列表,然后从
SELECT * FROM
结果中找到
WHERE

SELECT * FROM customers, orders
WHERE customers.id = orders.customer_id;

如上面的情况,我想知道SQL查询一般是如何执行的。

mysql sql inner-join
2个回答
8
投票

查询文本的评估有一个逻辑顺序,但数据库引擎可以根据最佳顺序选择执行查询组件的顺序。下面列出了逻辑文本解析顺序。例如,这就是为什么您不能在

SELECT
子句中使用
WHERE
子句的别名。就查询解析过程而言,别名还不存在。

  1. 来自

  2. 外部

  3. 哪里

  4. 分组依据

  5. 立方体 | ROLLUP(这些在 MySQL 中不存在,但在其他一些 SQL 方言中存在)

  6. 拥有

  7. OVER(窗口函数)

  8. 选择

  9. 独特

  10. 订购方式

  11. LIMIT(或在 MSSQL 中为 TOP)

有关详细信息,请参阅 Microsoft 文档(请参阅“SELECT 语句的逻辑处理顺序”)


0
投票

在像您这样的 SQL 查询中,处理事物的顺序并不完全是它们的编写方式。尽管 SELECT * FROM 部分在语法中排在第一位,但 SQL 并不是从表中获取所有数据开始的。相反,它首先查看 FROM 子句来识别所涉及的表(此处为“客户”和“订单”)并弄清楚它们是如何连接的。

然后,它使用 WHERE 子句过滤掉行。因此,在您的查询中,SQL 引擎将首先弄清楚“客户”和“订单”应如何连接在一起,但它还不会提取所有数据。然后,它立即应用 WHERE 子句中的条件(即,wherecustomers.id =orders.customer_id)来过滤行,仅找到满足此条件的行。

只有经过这个过滤之后,SELECT * FROM 部分才会发挥作用。在这里,它选择要在最终结果中显示的列,但仅从已过滤的行集中选择。

这个过程更加高效,因为 SQL 不会浪费资源从表中获取所有数据。它首先根据条件缩小行范围,然后从这些行中选择列。

请记住,这是理解和处理查询的逻辑流程。 SQL 引擎的实际执行可能会进一步优化其性能。

以下是 SQL 查询的典型逻辑处理顺序:

  • 来自,加入
  • 哪里
  • 分组依据
  • 拥有
  • 选择
  • 独特
  • 订购方式
  • 限制/偏移
© www.soinside.com 2019 - 2024. All rights reserved.