SQL 查询并不是从 SELECT 开始的

日常使用中写 SQL 查询命令都是以 SELECT 开始的(注意:本文仅探讨 SELECT 查询,不涵盖 insert 或其他 SQL 命令)。

昨天我想到一个问题:可以用 WHERE、HAVING 或者其他方式来过滤窗口函数执行结果吗?

经过一番探索,我得出的最终结论是否定的,因为窗口函数必须在 WHERE 和 GROUP BY 之后才能运行。但是,这也延伸到了一个更大的问题——SQL 查询的执行顺序是怎么样的呢?

你所不知道的 SQL 查询执行顺序
我专门查了一下文档 SQL 查询执行顺序如下:

如果不喜欢以上五彩斑斓的图片形式,也可以看下面的文字:

FROM/JOIN/ON
WHERE
GROUP BY
HAVING
SELECT(窗口函数即在此步骤执行)
ORDER BY
LIMIT
上图可以解答你的如下疑惑:

上图是 SQL 查询的语义说明。看懂这张图,便能迅速判断一个给定的 SQL 查询将会返回什么结果,也可以轻松解答如下疑问:

可以对 GROUP BY 的结果进行 WHERE 筛选吗?(不可以!因为 WHERE 在 GROUP BY 之前执行)
可以对窗口函数的执行结果进行过滤吗?(不可以!因为窗口函数在 SELECT 步骤执行,而这步是在 WHERE 和 GROUP BY 之后)
可以对 GROUP BY 的结果再执行 ORDER BY 操作吗? (可以!ORDER BY 基本上是最后一个步骤了,所以可以对任何操作的执行结果执行 ORDER BY)
LIMIT 执行在哪个步骤? (最后一步!)
虽然如此,但实际上数据库引擎并非严格按照这个顺序运行查询,因为它们还会执行一系列的优化,以便提升查询速度。

所以:

当你想了解查询语句的有效性,或是想搞明白为什么会返回这样一个查询结果时,可以尝试用该图来解释;

但是,使用该图是无法解释查询性能或索引相关问题的,它们会涉及到更多变量,因而也更为复杂。

一、最容易搞混的:列别名
比如:关联姓和名,并对其进行分组。SQL 语法是允许这样写:

SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
FROM table
GROUP BY full_name
上面的查询看起来像是在 SELECT 之后执行 GROUP BY,但其实 GROUP BY是先执行的,因为 GROUP BY 引用了 SELECT 中的 alias。

数据库引擎是可以将查询重写为:

SELECT CONCAT(first_name, ' ', last_name) AS full_name, count(*)
FROM table
GROUP BY CONCAT(first_name, ' ', last_name)
接着,先执行 GROUP BY 中的语句,再进行 SELECT 操作,所以上面那么写是可行的。

groups.tianya.cn/post-15258-8cd8a4b1b1c6440984d569aa6a4d8e85-1.shtml
groups.tianya.cn/post-15258-7de57c9ad2bd4131b2eb3837ce46c5d7-1.shtml
groups.tianya.cn/post-15258-e4729c5bf6c846b3930cda38389d50e8-1.shtml
groups.tianya.cn/post-15258-f638c01cecb745168f918be9a4728e32-1.shtml
groups.tianya.cn/post-15258-ac48b834a16e46bda8a971ce6cf9e30a-1.shtml
groups.tianya.cn/post-15258-1e552880e9144b79a23020a34bbc4f8a-1.shtml
groups.tianya.cn/post-15258-0db9612ed82f4c94ac0051e10a732db2-1.shtml
groups.tianya.cn/post-15258-fe287a7b358e40168b82d4413c9e4ff4-1.shtml
groups.tianya.cn/post-15258-d4d0c9546f0d4ee08a063180b43e3e86-1.shtml
groups.tianya.cn/post-15258-40c402b45bb7433093b5b044dd280c02-1.shtml
groups.tianya.cn/post-15258-699f62a5ef1a419088fa96b027aa908d-1.shtml
groups.tianya.cn/post-15258-2668f5813ee644e4b0f15a70953a0b76-1.shtml
groups.tianya.cn/post-15258-92cc35bbd1c94b83898246605e839b3c-1.shtml
groups.tianya.cn/post-15258-cc0eddd4fc394e56948fbf46081b1025-1.shtml
groups.tianya.cn/post-15258-26b0950a1a9c44de8aa6b85207f5a53e-1.shtml
groups.tianya.cn/post-15258-a8bdbb09e15e45fd947e36b8c2525895-1.shtml
groups.tianya.cn/post-15258-da1ae6ac4f354e048bf2f9f055f1152a-1.shtml
groups.tianya.cn/post-15258-88f88729919343ee8f4704576ffeccdb-1.shtml
groups.tianya.cn/post-15258-c70acf9e465c42bbb00b97700c374f3a-1.shtml
groups.tianya.cn/post-15258-ffe3ab0c07414cb7aeda8edcd0cabf40-1.shtml
groups.tianya.cn/post-15258-5b1ad0c128534607b3365b076e7598bd-1.shtml
groups.tianya.cn/post-15258-a163b01aabe9437f888bad141c865b10-1.shtml
groups.tianya.cn/post-15258-bf648f2e867f4a15ad6d6f7826a6e683-1.shtml
groups.tianya.cn/post-15258-7b6b05c7c0584f448cc9718e58aaadfb-1.shtml
groups.tianya.cn/post-15258-c1cf6cfcf8ac4f85bd319165f527f35c-1.shtml
groups.tianya.cn/post-15258-7ad9e054fe294dc59bac8ef52455c0d1-1.shtml
groups.tianya.cn/post-15258-ea5a984335ea4b1e8402f52eeb780cdc-1.shtml
groups.tianya.cn/post-15258-1e09de1f919648d497f3fac492edec0e-1.shtml
groups.tianya.cn/post-15258-35d44b9dd1904430af5f909545b09a17-1.shtml
groups.tianya.cn/post-15258-b0dc79f218c943f9bac71fe5f19aa415-1.shtml
groups.tianya.cn/post-15258-16bee541841a45888613a38707ae9f29-1.shtml
groups.tianya.cn/post-15258-7d44f22ffb1a49c9a1a52a2b9422dfba-1.shtml
groups.tianya.cn/post-15258-64fdba5fb66649f7b1b18f437f8fc04a-1.shtml
groups.tianya.cn/post-15258-bde0afe080eb4b9d81ea4899652a617f-1.shtml
groups.tianya.cn/post-10498-e9f228610e5b43c58accd9c1ae3026d7-1.shtml
groups.tianya.cn/post-10498-e8b495f9d7b944adabac2e147a183363-1.shtml
groups.tianya.cn/post-10498-5d11dbe54f9f45838db4b38a3896a47a-1.shtml
groups.tianya.cn/post-10498-e6590d2200c64054accaf74e1e55f977-1.shtml
groups.tianya.cn/post-10498-c074899ee17c41998c394a39aa3f8eb3-1.shtml
groups.tianya.cn/post-10498-d1fd4efacffa4cb98e57f0e2e2931187-1.shtml
groups.tianya.cn/post-10498-0ea6b82458b6442f835cb646982d1f83-1.shtml
groups.tianya.cn/post-10498-f5aa521233a44f2cbb71f017b271aa18-1.shtml
groups.tianya.cn/post-10498-f3a13a30734b40e4986f108a7317d2b0-1.shtml
groups.tianya.cn/post-10498-88a096e03ae044a0b30aa4d4f213ef41-1.shtml
groups.tianya.cn/post-10498-5625c6c3648e418ab92b26749f863f8a-1.shtml
groups.tianya.cn/post-10498-5f00166972534a2f83722ef5db71de98-1.shtml
groups.tianya.cn/post-10498-40f6a590e7c248629e682f66efe6f8de-1.shtml
groups.tianya.cn/post-10498-6b61fe137c7a4fbc91bb7305f07d5028-1.shtml
groups.tianya.cn/post-10498-4fd4cbe9485e4eebb3cba1e02cc7233c-1.shtml
groups.tianya.cn/post-10498-94e229ffbfad44aba0a7187bba181fde-1.shtml
groups.tianya.cn/post-10498-3825feb11a314403b541a90f08cc89a1-1.shtml
groups.tianya.cn/post-10498-04b1752c9a634c04b1a8825e09cdbde2-1.shtml
groups.tianya.cn/post-10498-6c450bbf059a443a8f4d99fbcb1341fd-1.shtml
groups.tianya.cn/post-10498-6c450bbf059a443a8f4d99fbcb1341fd-1.shtml
groups.tianya.cn/post-10498-6c6fd5d71c0f488f978a706e565718b8-1.shtml
groups.tianya.cn/post-10498-4d76694d8dff4e248fa0af18e5cdff00-1.shtml
groups.tianya.cn/post-10498-0195b0e70dd944578c29f863eec0ef17-1.shtml
groups.tianya.cn/post-10498-7622405509174ac5aacbba75a0bfabb1-1.shtml
groups.tianya.cn/post-10498-ee3162619dde4169b0da58e8c04e21b6-1.shtml
groups.tianya.cn/post-10498-26b01fcc79874638a72421c3b16f529f-1.shtml
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值