1、SQL99语句完整结构:
SELECT...,...,...(存在聚合函数)
FROM...(LEFT / RIGHT)JOIN ...ON 多表的连接条件
(LEFT / RIGHT)JOIN ...ON
WHERE ...(WHERE子句不能使用聚合函数)
GROUP BY ...,...
HAVING (HAVING子句可以包含聚合函数的过滤条件也可以不包含)
ORDER BY ...,...(ASC / DESC)
LIMIT ...,...;
2、SQL语句的执行顺序
FROM …,…-> ON -> (LEFT/RIGHT JOIN) -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT->ORDER BY. -> LIMIT
(1)from:从哪些表中筛选
(2)on:关联多表查询时,去除笛卡尔积
(3)where:从表中筛选的条件
(4)group by:分组依据
(5)having:在统计结果中再次筛选
(6)select: 展示哪些字段列表
(7)order by:排序
(8)limit:分页
2.1 笛卡尔积产生的条件
1、省略了on的连接条件
2、所有表的所有行数据都相连
3、连接条件无效
3、WHERE和HAVING的区别
HAVING
1、HAVING子句可以包含聚合函数的过滤条件也可以不包含,通常与GROUP BY连用。
2、HAVING先进行计算,然后再过滤。
WHERE
1、WHERE子句不能使用聚合函数,可以与GROUP BY连用也可以不连用
2、WHERE是先进行约束,然后再进行计算。
3.1、优化HAVING的处理速度
当HAVING的逻辑中有可以使用WHERE筛选,优先使用WHERE筛选,这样可以减少HAVING的过滤查询。
4、ON和WHERE的区别
首先,内连接情况下,ON与WHERE子句是等效的。
外连接情况下有以下区别:
1、ON限制条件的发生时间比WHERE早。
2、ON在进行外部连接前,根据约束条件筛选数据。
3、WHERE在外部连接后,根据约束条件筛选数据。