作者:Julia Evans    译者:无明   

链接:infoq.cn/article/Oke8hgilga3PTZ3gWvbg

很多 SQL 查询都是以 SELECT 开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口函数必须在 WHERE 和 GROUP BY 之后,所以不能”。

于是我又想到了另一个问题: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 tableGROUP BY full_name

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

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

这样 GROUP BY 仍然先执行。

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

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

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

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

SELECT * FROMowners LEFT JOIN cats ON owners.id = cats.ownerWHERE 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)      # JOINdf = df[df.created_at > 1000] # WHEREdf = df.groupby('something', num_yes = ('yes', 'sum')) # GROUP BYdf = df[df.num_yes > 2]       # HAVING, 对 GROUP BY 结果进行过滤df = df[['num_yes', 'something1', 'something']] # SELECT, 选择要显示的列df.sort_values('sometthing', ascending=True)[:30] # ORDER BY 和 LIMITdf[:30]

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

end

最新整理的 2TB 干货资源,包括但不限于:架构师、大数据、Docker、运维、数据库、redis、MongoDB、电子书、Java基础、Java实战项目、ELK Stack、机器学习、BAT面试精讲视频等。只需在公众号对话框回复关键字:1024 即可免费获取全部资料。 

推荐阅读  点击标题可跳转

1、华为正式登顶全球第一!

2、100个网络基础知识普及,看完成半个网络高手!

3、超实用 Nginx 极简教程,覆盖了常用场景

4、超强干货!通过filebeat、logstash、rsyslog 几种方式采集 nginx 日志

5、一个Tomcat 如何部署多个项目?附多种解决方案及详细步骤!

6、1000+页学习资料免费分享给大家,提供下载!

看完本文有收获,请分享给更多人

关注「民工哥技术之路」加星标,提升IT技能

好文章,朕在看」❤️↓↓↓

sqlserver 查询某个时间段执行sql语句_为什么 SQL 查询不是先执行SELECT语句?相关推荐

  1. java查看sql视图_数据库的查询与视图

    第4章 数据库的查询和视图 4.1.1 选择列 通过SELECT语句的项组成结果表的列. ::= SELECT [ ALL |DISTINCT ] [ TOP n [ PERCENT ] [ WITH ...

  2. mybatisplus执行sql语句_[MySQL]sql语句的执行流程

    此篇极客时间专栏<MySQL实战45讲>笔记,文中部分图文来自该专栏. MySQL的执行流程示意图: 大体来说,MySQL可以分为Server层和存储引擎层两部分. Server层包括连接 ...

  3. 预编译sql查询语句_频繁的查询重新编译– SQL查询性能的杀手–简介

    预编译sql查询语句 In this article, we will explain what compilations and recompilations are, and give recom ...

  4. java分页sql语句_「sql分页」sql语句 实现分页 - seo实验室

    sql分页 sql语句 实现分页 /* 分页思想:比如你要每页获取10条记录,当你显示第5页的记录时, 也就是选取第40条至50条的记录.首先应该从所有的记录集中选取 50条记录,同时进行倒序,再从中 ...

  5. sql 预先_预先联合查询

    sql 预先 介绍 (Introduction) According to The Presto Foundation, Presto (aka PrestoDB), not to be confus ...

  6. mysql高效sql语句_高效SQL优化 非常好用的SQL语句优化34条

    高效SQL优化 非常好用的SQL语句优化34条 相关软件相关文章发表评论 来源:2011/2/13 9:38:43字体大小: 作者:佚名点击:576次评论:0次标签: 类型:电子教程大小:8.5M语言 ...

  7. excel生成mysql语句_通过SQL语句直接实现Excel与数据库的导入导出

    1.在SQL数据库中直接从Excel里面查询数据: select \* from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DA ...

  8. 人大金仓数据库sql语句_数据库SQL语句大全——最常用的SQL语句

    检索数据: 检索单个列: SELECT pname FROM product检索多个列: SELECT pname,market_price,is_hot FROM product检索所有列: SEL ...

  9. 存储过程中定义sql语句_学习SQL:用户定义的存储过程

    存储过程中定义sql语句 Stored procedures (SPs) are one more powerful database object we have at our disposal. ...

最新文章

  1. Samtools(CentOS Linux)安装及常用命令详解
  2. Django Logging
  3. 深入浅出gRPC——极客时间李林锋
  4. 【牛客NOIP模拟】路径难题【建图】【最短路证明】
  5. 黄聪:Android酷炫实用的开源框架(UI框架)(转)
  6. Mac下IDEA使用优化
  7. c语言规范标准c99中文版下载,c99标准找到了,中文HTML页面
  8. 信息安全技术网络安全等级保护基本要求
  9. 谷歌octotree插件的使用
  10. excel如何把顺序倒过来_在excel中怎么使文字颠倒顺序反过来显示呢?
  11. 程序员该如何避免掉头发?
  12. 路由器 android 打印机,用路由器将普通打印机变成网络打印机
  13. lucas定理 与 扩展lucas定理(HDU 3037 以及 2015 ICL, Finals, Div. 1 J.Ceizenpok’s formula)
  14. Apple Pay编程指南(6) -沙盒测试
  15. turtle库使用教程 及 绘制 浪漫樱花 五角星 彩虹玫瑰 谢尔宾斯基三角形 实例
  16. Unable to load script code in VisualGuidance.The script will not be used until the error 的错误的解决方法
  17. 基于 MATLAB fitcsvm 的 OVR SVM 多分类器实现
  18. Camtasia2023简体中文标准版免费更新下载
  19. 黄金思维圈,养成透过现象看本质的能力
  20. 部分MacBook Pro突然无法充电,电量为什么显示为1%

热门文章

  1. Android 在已有工程中实现微信图片压缩
  2. LOCAL_SHARED_LIBRARIES 与 LOCAL_LDLIBS,LOCAL_LDFLAGS的区别
  3. bootstrap 仿实例
  4. 2016网易研发题目
  5. Linux服务器的常用备份方法
  6. 我在售的12部图书简介及网上链接
  7. Windows下用vs2017编译和配置libcurl库(手把手教,适合新人)
  8. k1658停运到什么时候_2021年春运就要开始啦!快来看看各大快递的停运时间吧
  9. 单片机并口应用实验c语言,用51单片机编写一个并行口实验
  10. python 组合优化 回撤最小_【策略回测】多因子搭配组合优化(内附bonus)