SQL 查询并不是从 SELECT 开始的
如果不喜欢以上五彩斑斓的图片形式,也可以看下面的文字:
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)
https://mp.weixin.qq.com/s/j2_8UXrwFtOcTor_Jl5SPA
https://mp.weixin.qq.com/s/VXRENi7vswxNhGLw3ruaxA
故乡明
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话