.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;主要从融合事实信息、融合附加信…

C++ 函数返回char*

在函数内建立的局部变量在函数结束后会被销毁&#xff0c;所以如何从函数返回函数内新建的char*是一个问题 看一个例子&#xff1a; char* get_char_1(){string s "abc";return (char*)s.c_str(); }int main(){char* temp get_char_1();cout << temp;retur…

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

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

C++ 获取char*的长度

strlen函数&#xff0c;包含在#include <cstring> 看个例子&#xff1a; void get_len(char* temp){int l strlen(temp);cout << l;char* anew char[l]; }

实习的具体内容

实习具体内容 项目组背景&#xff1a;Synopsys的Solution Group下面的ARC硬件部门&#xff0c;主要研发ARC处理器IP&#xff0c;它是基于ARC指令集&#xff0c;主要产品有EM系列和HS系列以及多核系统&#xff0c;涉及领域有物联网、汽车电子、高速存储、DSP和图像视频处理。 实…

俄罗斯拟明年在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;这也是笔者第一次遇…

C++ char数组和char*的输入

int main(){char* s1 "abc";cin >> s1; // errorcout << s1;char s2[10]; // okcin >> s2;cout << s2;int n 10;char* s3 new char[n]; //okcin >> s3;cout << s3;return 0; }

【HTML5】Server-Sent服务器发送事件

Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新。 以前也可能做到这一点&#xff0c;前提是网页不得不询问是否有可用的更新。通过服务器发送事件&#xff0c;更新能够自动到达。 <!DOCTYPE html> <html> <body> <…

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

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

C++中的深拷贝

memcmp (const void*, const void*, size_t) 第一个参数&#xff1a;目的地址 第二个参数&#xff1a;源地址 第三个参数&#xff1a;所需要复制的字节数

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

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

解决保存快照失败后redis无法写入的问题( Redis is configured to save RDB snapshots)

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.解决方案&#xff1a;Just too brief about answer. open t…

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

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

seaborn画图设置横纵坐标标签

用seaborn库来画图&#xff0c;也同样可以通过matplotlib.pyplot.xlabel设置x轴标签&#xff0c;而matplotlib.pyplot.ylabel设置当前轴的y轴标签 举个例子&#xff1a; import seaborn as sns import matplotlib.pyplot as pltsns.kdeplot(data) plt.xlabel("xxxxxx&qu…

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

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

移植memtester到android平台

硬件搭建起来能进入系统&#xff0c;首要就是测试内存的稳定性&#xff0c;需要一款内存测试工具。 一般都是选择memtester这款linux软件&#xff0c;下载地址如下&#xff1a;http://pyropus.ca/software/memtester/ 把memtester解压到android/external/下&#xff08;此文默认…

马云对话马斯克(全文):要警惕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…