不要被长SQL吓到,深刻理解SQL执行顺序

软件测试工程师,基础技能之一就是数据库,不管是基础的功能测试还是自动化测试、性能测试,都需要应用到数据库知识,并且要对数据库的学习不断深入,多学习一些高级的用法和原理。

当我们需要写一个比较长的SQL语句时,常常分不清哪个关键字在前哪个在后,这是因为SQL 语句的执行顺序跟它语法顺序并不一致,导致我们的书写顺序和实际执行有偏差。

示例表

不要被长SQL吓到,深刻理解SQL执行顺序_java


执行如下SQL语句:

select Sclass,count(Ssex) as count
from student
where Sage>18 
group by Sclass 
having count > 1 
order by Sclass desc
limit 2;

结果如下:

不要被长SQL吓到,深刻理解SQL执行顺序_java_02



mysql的书写顺序如下:

SELECT DISTINCT
    < select_list >
FROM
    < left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
    < where_condition >
GROUP BY
    < group_by_list >
HAVING
    < having_condition >
ORDER BY
    < order_by_condition >
LIMIT < limit_number >

mysql解析器的执行顺序

 1 FROM <left_table>
 2 ON <join_condition>
 3 <join_type> JOIN <right_table>
 4 WHERE <where_condition>
 5 GROUP BY <group_by_list>
 6 HAVING <having_condition>
 7 SELECT
 8 DISTINCT <select_list>
 9 ORDER BY <order_by_condition>
10 LIMIT <limit_number>
  • FROM:指定了要查询的表

  • where:过滤表中数据的条件

  • group by:对过滤的数据进行分组

  • having:对上面已经分组的数据进行过滤的条件

  • select:查看结果集中的哪个列,或列的计算结果

  • order by :对查询结果进行排序

  • limit:取出指定行的数据,返给用户


上述SQL示例语句执行顺序拆解如下:

不要被长SQL吓到,深刻理解SQL执行顺序_java_03

 

所以查询语句并不是从SELECT开始执行的,而是按照下面的顺序执行:FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句 每个子句执行后都会产生一个虚拟中间表,供接下来的子句使用,如果不存在某个子句,就跳过 。

不要被长SQL吓到,深刻理解SQL执行顺序_java_04