.net函数查询_SQL查询语句总是先执行SELECT?你们都错了!

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

好像这个问题应该很好回答,毕竟自己已经写了上万个 SQL 查询了,有一些还很复杂。但事实是,我仍然很难确切地说出它的顺序是怎样的。

SQL 查询的执行顺序

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

v2-0ccea5f337ea2f582fe07c643bc12ae1_b.jpg

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

这张图与 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#和 http://VB.NET 中的查询语法)是按照 FROM…WHERE…SELECT 的顺序来的。这里有一个 LINQ 查询例子:

var teenAgerStudent = from s in studentListwhere s.Age > 12 && s.Age < 20select 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 queries don’t start with SELECThttps://jvns.ca/blog/2019/10/03/sql-queries-don-t-start-with-select/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据世界要熟悉的5门语言

大数据世界要熟悉的5门语言课程 Python OpenStack Java Hadoop Scala Spark Shell Linux SQL DB JS 华丽分割线 转载于:https://www.cnblogs.com/TendToBigData/p/10501438.html

知识图谱嵌入(KGE):方法和应用的综述

来源&#xff1a;专知导读本文主要是参考《Knowledge Graph Embedding: A Survey of Approaches and Applications》和刘知远的《知识表示学习的研究与进展》做的总结&#xff0c;主要介绍了最近关于知识图谱嵌入所涉及到的研究方法&#xff0c;主要从融合事实信息、融合附加信…

支持向量机matlab代码程序_支持向量机(SVM)小结

什么是SVM&#xff1f;SVM(全称&#xff1a;Support Vector Machine)支持向量机&#xff0c;这只是它的名称&#xff0c;向量就是和我们以前学过的向量一样(下文有介绍)&#xff0c;它可以有效解决分类问题(我们只讨论分类问题)&#xff0c;何为分类呢&#xff1f;顾名思义&…

俄罗斯拟明年在36万台华为平板安装“极光”操作系统

来源&#xff1a;环球时报据路透社报道&#xff0c;有消息人士表示&#xff0c;俄罗斯政府已经开始与华为公司就36万台平板电脑安装俄罗斯自己研发的操作系统&#xff08;OS&#xff09;"极光"(Aurora&#xff0c;也称奥罗拉)的一项计划展开谈判。路透社表示&#xf…

mysql 命令 kill_MySQL之死锁检测

最近&#xff0c;笔者在查看线上服务日志时&#xff0c;发现spring大量异常&#xff0c;异常中都显示了同样的报错信息&#xff0c;信息如下。Deadlock found when trying to get lock; try restarting transaction调研之后发现是mysql发生了死锁&#xff0c;这也是笔者第一次遇…

干货丨清华大学天机芯团队赵明国:《基于自然动力学的机器人控制——无人驾驶自行车及被动行走》...

来源&#xff1a; 机器人大讲堂8月1日&#xff0c;清华大学依托精密仪器系的类脑计算研究中心施路平教授团队在《自然》&#xff08;Nature&#xff09;杂志上发表了一篇封面文章&#xff0c;发布了一项最新研究成果——类脑计算芯片“天机芯”。同时&#xff0c;搭载天机芯&am…

判断随机抽取代码_问卷调查:定量研究中的抽样问题(2)- 非随机抽样介绍

所谓抽样&#xff0c;就是从我们需要研究的所有目标群体中&#xff0c;按照某种原则&#xff0c;挑选出一定量的样本&#xff0c;用他们的研究结果&#xff0c;代表目标群体整体结果。既然&#xff0c;抽样的目的是通过对一部分被选择的样本来推断总体&#xff0c;就要求我们抽…

欧洲估值最高的5家人工智能创业公司

来源&#xff1a;资本实验室今年初&#xff0c;据伦敦风险投资公司MMC的调查&#xff0c;四成自称为人工智能公司的欧洲创业公司实际上并未在核心业务中涉及到人工智能&#xff0c;人工智能仅为吸引投资的漂亮外衣。这一数据发布后&#xff0c;激起了轩然大波&#xff0c;不仅引…

keras安装_代码详解:构建一个简单的Keras+深度学习REST API

在本教程中&#xff0c;我们将介绍一个简单的方法来获取Keras模型并将其部署为REST API。本文所介绍的示例将作为你构建自己的深度学习API的模板/起点——你可以扩展代码&#xff0c;根据API端点的可伸缩性和稳定性对其进行定制。具体而言&#xff0c;我们将了解&#xff1a; 如…

马云对话马斯克(全文):要警惕AI?该移民火星?如何更长寿?马化腾反对产业割裂和技术脱钩...

来源&#xff1a;未来论坛今天&#xff08;8月29日&#xff09;&#xff0c;2019年世界人工智能大会在上海召开&#xff0c;500余位国内外顶尖高校、行业领军企业、国际组织的重要嘉宾&#xff0c;全球AI知名企业领袖齐聚于此。本次大会以“智联世界&#xff0c;无限可能”为主…

给plt.axvline设置图例(label)

plt.axvline的其中一个参数是label&#xff0c;用于给这条垂直线设置标签。但加上后就是不显示这个这个图例&#xff0c;代码如下&#xff1a; sns.kdeplot(data) plt.axvline(-2, colorr, linestyle--, label0.9) plt.show() 原因会因为没有加这一句&#xff1a; plt.legend…

python excel 转json_Python办公自动化| word 表格转excel

之前写过一篇 Python办公自动化 | 批量word报告生成工具 &#xff0c;有小伙伴提出了逆向需求&#xff0c;即&#xff1a;从批量word中获取内容并写入excel&#xff0c;需求背景是汇总一些材料&#xff0c;举例&#xff1a;实习鉴定表、个人简历、档案等。实际需求是这样的&…

python在图中画一条垂直线(matplotlib)

matplotlib.pyplot.axvline https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axvline.html?highlightaxvline#matplotlib.pyplot.axvline 用法&#xff1a; plt.axvline(x, colorr, linestyle--, labelxxx) plt.legend()

坦途与波折:我们需要什么样的人工智能?

来源&#xff1a;资本实验室历史车轮滚滚向前&#xff0c;如今我们正在进入人工智能时代。其中的坦途足以让我们乐观和振奋&#xff0c;其中的波折也可能会让我们不安或担忧。面对未来&#xff0c;我们需要坚持三个基本要点&#xff1a;效率、环保与福祉。1.人工智能与传统产业…

python画一条水平直线(matplotlib)

matplotlib.pyplot.axhline https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axhline.html 用法&#xff1a; plt.axhline(0.06, colorr, linestyle--, labelxxx) plt.legend(locupper left)

sql数字转换为字符_Python|图片转换为字符画^_^

我们很清楚什么是图片&#xff0c;无外乎png、jpg等格式的文件&#xff0c;例如这个?但什么是字符画呢&#xff1f;先看一下官方介绍&#xff1a;字符画&#xff0c;一种由字母、标点、汉字或其他字符组成的图画。简单的字符画是利用字符的形状代替图画的线条来构成简单的人物…

全球机器人产业趋势及特征

来源&#xff1a;创新研究当前&#xff0c;全球机器人市场规模持续扩大&#xff0c;工业机器人市场增速回落&#xff0c;服务、特种机器人增速稳定。技术创新围绕仿生结构、人工智能和人机协作不断深入&#xff0c;产品在教育陪护、医疗康复、危险环境等领域的应用持续拓展&…

python支持向量机_支持向量机(SVM)Python实现

什么是支持向量机? “支持向量机”(SVM)是一种监督机器学习算法&#xff0c;可用于分类或回归挑战。然而&#xff0c;它主要用于分类问题。在这个算法中&#xff0c;我们将每一个数据项作为一个点在n维空间中(其中n是你拥有的特征数)作为一个点&#xff0c;每一个特征值都是一…

AR智能提升工业效率的4大场景与应用实践!

来源&#xff1a;北京物联网智能技术应用协会导 读 ( 文/ e-works整理 )德国学者提出“工业4.0”的概念&#xff0c;即以智能制造为主导的第四次工业革命&#xff0c;或革命性的生产方法。主要围绕两大主题&#xff0c;一是“智能工厂”&#xff0c;二是“智能生产”&#xff0…

手机进销存系统/供应链管理系统

花了将近两个月的时间学习了一个企业级进销存项目&#xff0c;已经结束了两周多&#xff0c;现在终于有时间来对这个项目的学习做个总结了&#xff01; 一、首先介绍下这个项目 (注&#xff1a;本人目前大三&#xff0c;专业为信息管理&#xff0c;与编程沾边不多。而我对编程很…