sql语句的书写顺序:select ---> from --->where ---> group by ---> having ---> order by
其中where和having是不能同时使用的,并且having和group by 是联合使用的;
这是程序员或DBA写SQL的顺序;
sql语句的解析顺序 :
from --->where ---> group by ---> having ---> select ---> order by
大体的过程如下,我还没完全理解;每一步形成一个虚表,这个虚表又作为下一步骤的输入,这样得到最后的结果;
SQL语句的解析顺序
1. FROM FROM后面的表标识了这条语句要查询的数据源;FROM过程之后会生成一个虚拟表VT1;
FROM又可以包括三个子步骤,如果只是单表查询的话不包括这三个;
1-J1 笛卡尔积 这个步骤会计算两个相关联表的笛卡尔积(CROSS JOIN) ,生成虚拟表VT1-J1;
如果是连接查询,计算关联表的笛卡尔积,得到虚拟表VT1-J1;
1-J2 ON过滤 ,生成虚拟表VT1-J2;
1-J3 如果使用了外连接,添加外部行,生成虚拟表VT1-J3;
2. WHERE 对步骤1生成的临时表进行过滤,得到VT2表;
3. GROUP BY ,对VT2表GROUP BY,生成VT3表;
4. HAVING ,得到VT4表;
5. SELECT 对SELECT子句中的元素进行处理,生成VT5表;
5-1 计算表达式 计算SELECT 子句中的表达式,生成VT5-1;
5-2 DISTINCT 寻找VT5-1中的重复列,并删掉,生成VT5-2;
5-3 TOP 从ORDER BY子句定义的结果中,筛选出符合条件的列,生成VT5-3表;
ORDER BY 从VT5-3中的表中,根据ORDER BY 子句的条件对结果进行排序,生成VC6表;
表的笛卡尔积
笛卡尔积指的是两个集合所有的组合情况;
假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)};
那么两个表的笛卡尔积就是指两个表连接的所有组合情况;两个表连接,每个表有5条记录,笛卡尔积是25条记录;
下图大概是百度百科的,
就是连接查询的情况下,如果2个表连接,每个表有100条记录;中间有个计算笛卡尔积的过程,会形成一个一万行记录的集合,再从中筛选,这是在C语言的层面、数据库引擎中实现;
看上去没错,它是先笛卡尔积,再ON过滤;
表的笛卡尔积可参阅此文,
https://blog.csdn.net/weixin_44953658/article/details/127087480