千家信息网

SQL查询语句的执行顺序是怎样的

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"SQL查询语句的执行顺序是怎样的",在日常操作中,相信很多人在SQL查询语句的执行顺序是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"SQL查询
千家信息网最后更新 2026年10月31日SQL查询语句的执行顺序是怎样的

这篇文章主要介绍"SQL查询语句的执行顺序是怎样的",在日常操作中,相信很多人在SQL查询语句的执行顺序是怎样的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"SQL查询语句的执行顺序是怎样的"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

SQL 查询的执行顺序

于是我研究了一下,发现顺序大概是这样的。SELECT 并不是最先执行的,而是在第五个。

这张图回答了以下这些问题

这张图与 SQL 查询的语义有关,让你知道一个查询会返回什么,并回答了以下这些问题:

  • 可以在 GRROUP BY 之后使用 WHERE 吗?(不行,WHERE 是在 GROUP BY 之后!)

  • 可以对窗口函数返回的结果进行过滤吗?(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后)

  • 可以基于 GROUP BY 里的东西进行 ORDER BY 吗?(可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY)

  • LIMIT 是在什么时候执行?(在最后!)

但数据库引擎并不一定严格按照这个顺序执行 SQL 查询,因为为了更快地执行查询,它们会做出一些优化,这些问题会在以后的文章中解释。

所以:

  • 如果你想要知道一个查询语句是否合法,或者想要知道一个查询语句会返回什么,可以参考这张图;

  • 在涉及查询性能或者与索引有关的东西时,这张图就不适用了。

混合因素:列别名

有很多 SQL 实现允许你使用这样的语法:

SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) FROM table GROUP BY full_name

从这个语句来看,好像 GROUP BY 是在 SELECT 之后执行的,因为它引用了 SELECT 中的一个别名。但实际上不一定要这样,数据库引擎可以把查询重写成这样:

SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*) FROM table GROUP BY CONCAT(first_name, ' ', last_name)

这样 GROUP BY 仍然先执行。

数据库引擎还会做一系列检查,确保 SELECT 和 GROUP BY 中的东西是有效的,所以会在生成执行计划之前对查询做一次整体检查。

数据库可能不按此顺序执行查询(优化)

在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。

这个查询说明了为什么需要以不同的顺序执行查询:

SELECT * FROM owners LEFT JOIN cats ON owners.id = cats.owner WHERE cats.name = 'mr darcy'

如果只需要找出名字叫"mr darcy"的猫,那就没必要对两张表的所有数据执行左连接,在连接之前先进行过滤,这样查询会快得多,而且对于这个查询来说,先执行过滤并不会改变查询结果。

数据库引擎还会做出其他很多优化,按照不同的顺序执行查询,不过我并不是这方面的专家,所以这里就不多说了。

LINQ 的查询以 FROM 开头

LINQ(C# 和 VB.NET 中的查询语法)是按照 FROM...WHERE...SELECT 的顺序来的。这里有一个 LINQ 查询例子:

var teenAgerStudent = from s in studentList                       where s.Age > 12 && s.Age < 20                       select s;

pandas 中的查询也基本上是这样的,不过你不一定要按照这个顺序。我通常会像下面这样写 pandas 代码:

df = thing1.join(thing2) # JOIN df = df[df.created_at > 1000] # WHERE df = df.groupby('something', num_yes = ('yes', 'sum')) # GROUP BY df = df[df.num_yes > 2] # HAVING, 对 GROUP BY 结果进行过滤 df = df[['num_yes', 'something1', 'something']] # SELECT, 选择要显示的列 df.sort_values('sometthing', ascending=True)[:30] # ORDER BY 和 LIMIT df[:30]

这样写并不是因为 pandas 规定了这些规则,而是按照 JOIN/WHERE/GROUP BY/HAVING 这样的顺序来写代码会更有意义些。不过我经常会先写 WHERE 来改进性能,而且我想大多数数据库引擎也会这么做。

R 语言里的 dplyr 也允许开发人员使用不同的语法编写 SQL 查询语句,用来查询 Postgre、MySQL 和 SQLite。

到此,关于"SQL查询语句的执行顺序是怎样的"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

查询 顺序 语句 数据 数据库 是在 引擎 东西 结果 问题 学习 不同 语法 不行 代码 函数 别名 实际 常会 性能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 北京路客互联网科技有限公司 互联网科技工作委员会副主任毛军 有马互联网科技 互联网科技公司官网 齐家互联网科技有限公司 居家互联网科技有限公司 美国互联网前沿科技 新华互联网科技校企合作 哈尔滨新华互联网科技学院 须眉科技是互联网公司吗 重庆威客帮互联网科技 佳云科技和互联网广告 互联网数据科技专业 南博望互联网科技有限公司 互联网时代的科技公司 广州千川互联网科技有限公司 2021世界互联网领先科技成果发布 西安有哪些互联网高科技企业 湖北辰鑫科技互联网 保山互联网科技靠谱吗 南京欣网互联网络科技 博彦科技互联网金融 美国互联网保险保险科技 互联网科技公司发展 四个字互联网科技公司取名 上海电发互联网科技有限公司 互联网科技热点资讯 阿里互联网科技公司 彤创互联网科技有限公司 四川互联网展示科技馆设计
0