不要被长SQL吓到,深刻理解SQL执行顺序
软件测试工程师,基础技能之一就是数据库,不管是基础的功能测试还是自动化测试、性能测试,都需要应用到数据库知识,并且要对数据库的学习不断深入,多学习一些高级的用法和原理。
当我们需要写一个比较长的SQL语句时,常常分不清哪个关键字在前哪个在后,这是因为SQL 语句的执行顺序跟它语法顺序并不一致,导致我们的书写顺序和实际执行有偏差。
示例表
执行如下SQL语句:
select Sclass,count(Ssex) as count from student where Sage>18 group by Sclass having count > 1 order by Sclass desc limit 2;
结果如下:
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示例语句执行顺序拆解如下:
所以查询语句并不是从SELECT开始执行的,而是按照下面的顺序执行:FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句 每个子句执行后都会产生一个虚拟中间表,供接下来的子句使用,如果不存在某个子句,就跳过 。