软件测试工程师,基础技能之一就是数据库,不管是基础的功能测试还是自动化测试、性能测试,都需要应用到数据库知识,并且要对数据库的学习不断深入,多学习一些高级的用法和原理。
当我们需要写一个比较长的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>
上述SQL示例语句执行顺序拆解如下:
所以查询语句并不是从SELECT开始执行的,而是按照下面的顺序执行:FROM子句->WHERE子句->GROUP BY子句->HAVING子句->SELECT子句->ORDER BY子句->LIMIT子句 每个子句执行后都会产生一个虚拟中间表,供接下来的子句使用,如果不存在某个子句,就跳过 。