mysql-sql逻辑查询顺序
1、sql逻辑执行顺序(物理执行顺序可能会因索引而不同)
SELECT 7 DISTINCT 8
FROM 1
JOIN 2
ON 3
WHERE 4
GROUP BY 5
HAVING 6
ORDER BY 9
LIMIT 10
表t1 join t2 产生虚拟表VT1
VT1通过on过滤笛卡尔积产生VT2
VT2通过where过滤产生VT3
VT3通过group by 分组产生VT4
VT4通过having过滤产生VT5
VT5通过select选择指定列产生VT6
VT6通过distinct过滤重复列产生VT7
VT7通过order by 排序产生VT8
VT8通过limit n,m 产生VT9
2、由于逻辑处理顺序如上述1,则写sql时需要注意以前事项:
(1)、对null值的情况
on null = null :视为false
group by null :视为相同值
order by null :视为相同值,默认为最小值。
(2) on、where、having区别
on:
当存在外连接时,on不能过滤掉保留表中的数据(指定条件过滤保留表中数据后,外连接会将保留表中数据重新添加)
当不存在外连接时,on能过滤掉指定条件数据
where:
无论是否存在外连接,where都能过滤掉指定条件数据
不能使用聚合函数,因为执行顺序在group by前
不能使用列的别名,因为执行顺序在select前
having:
不能使用count(1)或者count(*)进行统计,这样可能会将非保留表中的空值字段统计在内导致与预期统计结果不一致
(3)使用了group by,再使用distinct则没意义
(4) limit n,m n:起始行,m:每页行数