SQL 查询总是先执行SELECT语句吗?你们都错了!

时间:2024-08-25 18:02:50

SELECT语句中子句的顺序。SELECT语句中使用时必须遵循的次序。

经过一段时间的学习,我们知道了SELECT语句超简版的语法如下:

SELECT 字段名 FROM 表名

后来,我们又陆续学习了WHERE/GROUP BY/HAVING/ORDER BY等子句……

因此,我们今天就来说下SELECT语句较为完整的语法结构(如下)与它的执行顺序是怎么样的?

SELECT [DISTINCT] [TOP] 字段名
FROM 表名
[WHERE] 行级过滤
[GROUP BY] 分组
[HAVING] 组级过滤
[ORDER BY] 排序

文字版较完整的SELECT语句执行顺序如下:

1)SQL首先执行的是FROM子句,根据FROM子句中指定的一个或多个表创建表。

2)如果存在WHERE子句,则对步骤1获得的表进行条件过滤,删除不符合条件的行记录。

3)如果存在GROUP BY子句,则对步骤2生成的表按指定字段进行分组,生成一份新的数据表。

4)如果存在HAVING子句,则对步骤3的表按指定条件进行过滤,删除不满足过滤条件的记录。

5)执行SELECT子句,删除不包含在SELECT子句所指定的字段。如果SELECT子句中包含关键字DISTINCT,则执行去重运算。

6)如果有ORDER BY子句,则按指定的排序规则对结果表进行排序操作。

7)如果有TOP谓词,则再进行TOP运算。


表格版较完整的SELECT语句执行顺序如下:

顺序

子句

说明

是否必须使用

1

FROM

从中检索数据的表

仅在从表中选择数据时使用

2

WHERE

行级过滤

3

GROUP BY

分组说明

仅在按组计算聚集时使用

4

HAVING

组级过滤

5

SELECT

要返回的列或表达式

6

DISTINCT

返回唯一不同的值

7

ORDER BY

输出排序顺序

8

TOP

规定要返回的记录的数目

总结:SQL的执行顺序,既不是语句的先后顺序,也不是由内到外的顺序;比如,最先出现的SELECT 子句并非首先执行的,它的执行顺序处在HAVING之后和ORDER BY之前。DISTINCT的位置处在TOP之前,但TOP的运算顺序又在DISTINCT之后。

点击关注“SQL数据库运维”,后台回复关键字:进群,带你进入高手如云的技术交流群。