开发者、数据分析师每天都在写【SELECT 列a,聚合函数 FROM 表名 WHERE 过滤条件 GROUP BY 列a HAVING 筛选条件】这样的查询语句。
SQL与其他语言不同的最明显特征是代码的处理顺序,大多数编程语言中,代码是按照编写顺序来处理的,但在SQL中第一个要处理的子句是FROM子句,尽管SELECT语句第一个出现,但基本都在最后处理。
每一步都会生成一个虚拟表,该虚拟表会作为下一步的输入, 这些虚拟表对于调用者(客户端应用程序或者外部查询)都是不可用的,只有最后一步生成的虚拟表才会返回给调用者,这种形态可对比LINQ理解。
①FROM FROM阶段负责标识表或要查询的表,如果指定了表运算符(JOIN, APPLY,PIVOT,UNPIVOT ),还要进行表运算符的处理。
例如:表联接运算中涉及的阶段是 笛卡尔积、ON筛选器和 添加外部行,FROM阶段生成虚拟表VT1.
②WHERE 这个阶段根据在WHERE子句中出现的谓词对VT1中进行筛选,只有让谓词计算结果为TRUE的行,才会插入VT2中。
③GROUP BY 按照GROUP BY 子句中指定的列名列表,对VT2中的行进行分组,生成VT3, 最终每个分组只有一个结果行。
④HAVING 根据HAVING子句中出现的谓词,对VT3中行记录进行筛选,只有让谓词结果为TRUE的行记录,才会进入VT4, Having 筛选器是唯一可用于分组数据的筛选器。
⑤SELECT 处理SELECT子句中字段(某些字段可能进行一些操作,形成新的字段),形成虚拟表VT5
⑥ORDER BY 根据ORDER BY子句中指定的列名列表,对VT5 中行进行排序,输出最后结果。