SQL语句的执行顺序

本文详细解释了SQL语句的执行顺序,包括FROM和JOIN、WHERE、GROUPBY、HAVING、SELECT、ORDERBY和LIMIT等部分,强调了在多表联查中的步骤和优化策略,如避免在WHERE中使用聚合函数和在SELECT中直接使用函数的影响。
摘要由CSDN通过智能技术生成

SQL语句的执行顺序并不是按照我们编写的顺序来执行的。

下面是SQL语句的通常编写顺序

#方式1:
SELECT ...,....,...
FROM ...,...,....
WHERE 多表的连接条件
AND 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...

#方式2:
SELECT ...,....,...
FROM ... JOIN ...
ON 多表的连接条件
JOIN ...
ON ...
WHERE 不包含组函数的过滤条件
AND/OR 不包含组函数的过滤条件
GROUP BY ...,...
HAVING 包含组函数的过滤条件
ORDER BY ... ASC/DESC
LIMIT ...,...

下面是SQL语句的通常执行顺序

  • FROM 和 JOIN:

首先,数据库会根据FROM和JOIN子句确定需要查询的表。

  • WHERE:

接下来,会应用WHERE子句中的条件,过滤出满足条件的记录。

  • GROUP BY:

然后,根据GROUP BY子句对结果集进行分组。

  • HAVING:

HAVING子句用于过滤分组后的结果集。

  • SELECT:

确定需要返回的列。如果我们对列进行了计算或函数处理,这时也会进行。

  • ORDER BY:

对结果集进行排序。

  • LIMIT / OFFSET:

限制返回的记录数和偏移量。

  • 返回结果:

最后,返回查询结果。

如果是多张表联查,还会经历下面的几个步骤:
1. 首先先通过 CROSS JOIN 求笛卡尔积,相当于得到虚拟表 vt(virtual table)1-1;
2. 通过 ON 进行筛选,在虚拟表 vt1-1 的基础上进行筛选,得到虚拟表 vt1-2;
3. 添加外部行。如果我们使用的是左连接、右链接或者全连接,就会涉及到外部行,也就是在虚拟
表 vt1-2 的基础上增加外部行,得到虚拟表 vt1-3。
当然如果我们操作的是两张以上的表,还会重复上面的步骤,直到所有表都被处理完为止。这个过程得到是我们的原始数据
 


这里给出一个简单的SQL查询及其执行顺序:

SELECT column1, SUM(column2) 
FROM table1 
WHERE column3 = 'value' 
GROUP BY column1 
HAVING SUM(column2) > 100 
ORDER BY SUM(column2) DESC 
LIMIT 10;
  • FROM table1:确定从哪个表查询数据。
  • WHERE column3 = 'value':过滤出column3值为'value'的记录。
  • GROUP BY column1:按照column1的值分组数据。
  • HAVING SUM(column2) > 100:过滤分组后的数据,只保留那些column2的总和大于100的组。
  • SELECT column1, SUM(column2):确定要返回哪些列,这里返回column1和column2的总和。
  • ORDER BY SUM(column2) DESC:对结果集按照column2的总和进行降序排序。
  • LIMIT 10:限制返回的记录数为10条。

由此顺序可以得到一些注意事项和理解:

  • Where在group,having之前执行,所以在where中就不能使用聚合函数过滤,同时where过滤一层,再在having语句中再使用聚合函数过滤也能提高查询的效率。
  • 在功能上having是where的升级版,也意味着更多的代码,非聚合函数单独地放在having中效率也不如放在where中,因此只有非聚合函数过滤条件建议放在where中。
  • 同理,列的别名在select中声明,就只能在select执行后的order by等中使用,不可以在先前的语句中使用。
  • WHERE子句优先,由于WHERE子句在执行顺序中靠前,应尽可能早地过滤出你需要的记录。这样不仅可以减少后续操作的数据量,还可以提高查询效率。
  • 合理使用GROUP BY和HAVING,虽然GROUP BY和HAVING在执行顺序中相对靠后,但它们对结果集的过滤仍然很重要。确保明确地知道为什么要使用GROUP BY,以及HAVING中的条件是什么。
  • 避免在SELECT中使用函数:在SELECT子句中对列使用函数会使得函数在每一行上都执行一次,这可能会导致性能问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值