当你自以为对SELECT查询了如指掌的时候,你真的理解它的执行顺序吗?
给你看看SELECT语句的主要语法:
-- 选择要查询的列 SELECT [DISTINCT] column1, -- 去重选择列1 column2, -- 选择列2 aggregation_function(column3) AS alias_name, -- 聚合函数和别名 expression -- 或计算表达式 -- 指定数据来源 FROM table_name1 -- 从主表开始查询 -- 表连接(可选) -- INNER JOIN table_name2 -- 内连接另一个表 -- LEFT JOIN table_name2 -- 左连接另一个表 -- ON table_name1.column = table_name2.column -- 连接条件 -- 过滤条件(可选) -- WHERE condition -- 在分组前过滤行 -- 分组(可选) -- GROUP BY column1, column2 -- 按指定列分组 -- 分组后过滤(可选) -- HAVING condition -- 过滤分组后的结果 -- 排序(可选) -- ORDER BY column1 ASC, -- 按列1升序排序 -- column2 DESC -- 按列2降序排序 -- 限制结果数量(可选) -- LIMIT 10 -- 只返回10行 -- OFFSET 20 -- 从第21行开始返回
其执行顺序如下表所示:
顺序 | 子句 | 核心作用 | 关键说明 |
---|---|---|---|
1 | FROM | 确定数据源表 | 首先读取所有指定的表。 |
JOIN | 连接多表 | 根据ON条件将表连接,生成第一个中间结果集。 | |
2 | WHERE | 行过滤 | 对中间结果集进行逐行筛选。不能使用SELECT中的别名。 |
3 | GROUP BY | 分组 | 将数据分组,为聚合运算做准备。 |
4 | HAVING | 组过滤 | 对分组后的结果进行筛选。条件通常包含聚合函数。 |
5 | SELECT | 选择列和计算 | 计算表达式、执行聚合函数、定义别名。 |
6 | DISTINCT | 去重 | 去除SELECT结果中的重复行。 |
7 | ORDER BY | 排序 | 对最终结果排序。可以使用SELECT中定义的别名。 |
8 | LIMIT | 限制行数 | 返回指定数量的记录,用于分页。 |
“从逻辑概念上讲,SQL引擎遵循标准的执行顺序(如FROM→WHERE→GROUP BY…),每一步都基于上一步的中间结果(可理解为虚拟表)进行操作,这一模型完美解释了SQL的语法语义。然而,在实际物理执行中,查询优化器会生成一个高度优化的执行计划,它可能重排操作顺序、利用索引直接定位数据、并采用流水线处理等方式,避免生成不必要的物理中间结果,从而极大地提升查询性能。因此,‘虚拟表’模型是理解SQL的正确逻辑框架,而优化器的智能优化是实现高效查询的物理保障。”
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程