我对 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查询一般是如何执行的。
查询文本的评估有一个逻辑顺序,但数据库引擎可以根据最佳顺序选择执行查询组件的顺序。下面列出了逻辑文本解析顺序。例如,这就是为什么您不能在
SELECT
子句中使用 WHERE
子句的别名。就查询解析过程而言,别名还不存在。
来自
开
外部
哪里
分组依据
立方体 | ROLLUP(这些在 MySQL 中不存在,但在其他一些 SQL 方言中存在)
拥有
OVER(窗口函数)
选择
独特
订购方式
LIMIT(或在 MSSQL 中为 TOP)
有关详细信息,请参阅 Microsoft 文档(请参阅“SELECT 语句的逻辑处理顺序”)。
在像您这样的 SQL 查询中,处理事物的顺序并不完全是它们的编写方式。尽管 SELECT * FROM 部分在语法中排在第一位,但 SQL 并不是从表中获取所有数据开始的。相反,它首先查看 FROM 子句来识别所涉及的表(此处为“客户”和“订单”)并弄清楚它们是如何连接的。
然后,它使用 WHERE 子句过滤掉行。因此,在您的查询中,SQL 引擎将首先弄清楚“客户”和“订单”应如何连接在一起,但它还不会提取所有数据。然后,它立即应用 WHERE 子句中的条件(即,wherecustomers.id =orders.customer_id)来过滤行,仅找到满足此条件的行。
只有经过这个过滤之后,SELECT * FROM 部分才会发挥作用。在这里,它选择要在最终结果中显示的列,但仅从已过滤的行集中选择。
这个过程更加高效,因为 SQL 不会浪费资源从表中获取所有数据。它首先根据条件缩小行范围,然后从这些行中选择列。
请记住,这是理解和处理查询的逻辑流程。 SQL 引擎的实际执行可能会进一步优化其性能。
以下是 SQL 查询的典型逻辑处理顺序: