加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

你确定 SQL 查询都是以 SELECT 开始的?

发布时间:2019-11-02 14:28:56 所属栏目:建站 来源:佚名
导读:许多 SQL 查询都是以 SELECT 开始的。 不外,最近我跟别人表明什么是窗口函数,我在网上搜刮是否可以对窗口函数返回的功效举办过滤这个题目,得出的结论是窗口函数必需在 WHERE 和 GROUP BY 之后,以是不能。 于是我又想到了另一个题目:SQL 查询的执行顺

许多 SQL 查询都是以 SELECT 开始的。

不外,最近我跟别人表明什么是窗口函数,我在网上搜刮”是否可以对窗口函数返回的功效举办过滤“这个题目,得出的结论是”窗口函数必需在 WHERE 和 GROUP BY 之后,以是不能”。

于是我又想到了另一个题目:SQL 查询的执行次序是奈何的?

仿佛这个题目应该很好答复,事实本身已经写了上万个 SQL 查询了,有一些还很伟大。但究竟是,我如故很难确切地说出它的次序是奈何的。

SQL 查询的执行次序

于是我研究了一下,发明次序或许是这样的。SELECT 并不是先执行的,而是在第五个。

你确定 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 实现应承你行使这样的语法:

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

从这个语句来看,仿佛 GROUP BY 是在 SELECT 之后执行的,由于它引用了 SELECT 中的一个体名。

但现实上不必然要这样,数据库引擎可以把查询重写成这样:

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

这样 GROUP BY 如故先执行。

数据库引擎还会做一系列搜查,确保 SELECT 和 GROUP BY 中的对象是有用的,以是会在天生执行打算之前对查询做一次整体搜查。

数据库也许不凭证这个次序执行查询(优化)

在现实傍边,数据库不必然会凭证 JOIN、WHERE、GROUP BY 的次序来执行查询,由于它们会举办一系列优化,把执行次序打乱,从而让查询执行得更快,只要不改变查询功效。

这个查询声名白为什么必要以差异的次序执行查询:

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

假如只必要找着名字叫“mr darcy”的猫,那就没须要对两张表的全部数据执行左毗连,在毗连之前先举办过滤,这样查询会快得多,并且对付这个查询来说,先执行过滤并不会改变查询功效。

你确定 SQL 查询都是以 SELECT 开始的?

数据库引擎还会做出其他许多优化,凭证差异的次序执行查询,不外我并不是这方面的专家,以是这里就不多说了。保举:MySQL全面优化,速率飞起来。

LINQ 的查询以 FROM 开头

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

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

pandas 中的查询也根基上是这样的,不外你不必然要凭证这个次序。我凡是会像下面这样写 pandas 代码:

  1. df = thing1.join(thing2)      # JOIN 
  2. df = df[df.created_at > 1000] # WHERE 
  3. df = df.groupby('something', num_yes = ('yes', 'sum')) # GROUP BY 
  4. df = df[df.num_yes > 2]       # HAVING, 对 GROUP BY 功效举办过滤 
  5. df = df[['num_yes', 'something1', 'something']] # SELECT, 选摘要表现的列 
  6. df.sort_values('sometthing', ascending=True)[:30] # ORDER BY 和 LIMIT 
  7. df[:30] 

这样写并不是由于 pandas 划定了这些法则,而是凭证JOIN/WHERE/GROUP BY/HAVING 这样的次序来写代码会更故意义些。不外我常常会先写 WHERE 来改造机能,并且我想大大都数据库引擎也会这么做。

R 说话里的 dplyr 也应承开拓职员行使差异的语法编写 SQL 查询语句,用来查询 Postgre、MySQL 和 SQLite。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读