SQL底层执行原理

SQL92语法

SELECT ...
FROM ...
WHERE ... 
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT

SQL99语法

SELECT ...
FROM ... (LEFT / RIGHT) JOIN ... ON ...
WHERE ... 
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT ...

SQL语句的执行顺序

在这里插入图片描述
SQL语句执行的先后顺序为:FROM -> CROSS JOIN ->ON -> (LEFT/RIGHT) JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT

  1. FROM阶段。如果这个阶段存在多表查询,则还需要经历
    1.1. CROSS JOIN得到笛卡儿积,得到虚拟表vt1-1
    1.2. ON进行筛选,得到虚拟表vt1-2
    1.3. LEFT/RIGHT JOIN,添加外部行,得到vt1-3
    FROM阶段后,得到原始数据,即虚拟表vt1
  2. WHERE阶段,对vt1进行过滤,得到虚拟表vt2
  3. GROUP BY阶段,对vt2分组,得到虚拟表vt3
  4. HAVING阶段,对vt3进行过滤,得到虚拟表vt4
  5. SELECT阶段,从vt4中提取想要的字段,得到虚拟表vt5
  6. DISTINCT阶段,对vt5去重,得到vt6
  7. ORDER BY阶段,按指定字段进行排序,得到vt7
  8. LIMIT阶段,从vt7中取出指定行,得到vt8,即最终的结果。

SQL语句的执行顺序很好地解释了:

  • 为什么 ORDER BY中可以使用列的别名,而WHERE中不可以使用列的别名(因为WHERE在前,SELECT其次,最后是ORDER BY)。
  • 为什么 如果过滤条件中包含聚合函数,必须用HAVING, 不能用WHERE(因为WHERE在GROUP BY前,HAVING在GROUP BY后)。
  • 为什么 如果过滤条件中没有聚合函数时,虽然WHERE、HAVING都可以用,但推荐使用WHERE,WHERE的执行效率会更高(因为FROM … WHERE … GROUP BY… 是先过滤再分组,而FROM… GROUP BY …HAVING…是先分组再过滤)。

相关链接

使用ORDER BY 排序
使用HAVING过滤分组

猜你喜欢

转载自blog.csdn.net/qzw752890913/article/details/126467585