where on having 的区别
where on having都是查询条件,可以筛选出符合条件的数据,三者的主要区别是限制条件起作用的时机不同。
执行顺序: ON------>WHERE------>HAVING
where和having
①where的筛选单位是数据行,符合条件的数据行才会被筛选出来,
where
子句在GROUP BY
分组和聚合函数之前对数据行进行过滤;所以where中不可以使用聚合函数。where起作用的时机在having之前。
②having不能单独使用,只能出现在GROUP BY子句之后,
having
子句对GROUP BY
分组和聚合函数之后的数据行进行过滤。所以having中可以使用聚合函数来筛选分组。③having中可以出现的条件:聚合函数以及分组后能得到的数据的列名(即只能使用分组字段或者聚合函数。)
从性能的角度来说,
HAVING
子句中如果使用了分组字段作为过滤条件,应该替换成WHERE
子句;因为WHERE
可以在执行分组操作和计算聚合函数之前过滤掉不需要的数据,性能会更好。having的条件通常为聚合函数。
总结就是:where用于分组和聚合函数之前对数据进行过滤,having用于聚集函数计算结果出来之后筛选结果,符合条件的分组才会被返回。
on 和where
①on是用来限制表和表之间连接的条件。
②在左外连接中,ON会返回左表中的所有记录;在右外连接中,ON会返回右表中的所有记录。如果是内连接,where和on的作用一样
③不符合on条件的数据行不会出现在临时表中(过滤数据),where根据on条件后得到的结果筛选出符合where条件的数据行。
总的来说,ON根据限制条件对数据行记录进行过滤,然后产生临时表;而WHERE是在临时表生产之后,根据限制条件从临时表中筛选结果。
因为ON限制条件发生时间较早,临时表的数据集要小,因此ON的性能要优于WHERE。