当你自以为对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行开始返回

其执行顺序如下表所示:

顺序子句核心作用关键说明
1FROM确定数据源表首先读取所有指定的表。

JOIN连接多表根据ON条件将表连接,生成第一个中间结果集。
2WHERE行过滤对中间结果集进行逐行筛选。不能使用SELECT中的别名
3GROUP BY分组将数据分组,为聚合运算做准备。
4HAVING组过滤对分组后的结果进行筛选。条件通常包含聚合函数
5SELECT选择列和计算计算表达式、执行聚合函数、定义别名
6DISTINCT去重去除SELECT结果中的重复行。
7ORDER BY排序对最终结果排序。可以使用SELECT中定义的别名
8LIMIT限制行数返回指定数量的记录,用于分页。

“从逻辑概念上讲,SQL引擎遵循标准的执行顺序(如FROM→WHERE→GROUP BY…),每一步都基于上一步的中间结果(可理解为虚拟表)进行操作,这一模型完美解释了SQL的语法语义。然而,在实际物理执行中,查询优化器会生成一个高度优化的执行计划,它可能重排操作顺序、利用索引直接定位数据、并采用流水线处理等方式,避免生成不必要的物理中间结果,从而极大地提升查询性能。因此,‘虚拟表’模型是理解SQL的正确逻辑框架,而优化器的智能优化是实现高效查询的物理保障。”

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)