having和where同为设定条件的语句,其差别主要体现在与聚合语句的执行顺序上。
但在查询过程中,聚合语句(sum,min,max,avg,count),比having子句先执行。
聚合语句(sum,min,max,avg,count)要在where后再执行。换言之:
Having是先分组在进行筛选,而where是先筛选再进行分组
实例:
SELECT positions AS "位置",COUNT(*) FROM sportors GROUP BY positions;
-- 位置 count(*)
-- 门将 1
-- 后卫 3
-- 中场 2
-- 前锋 3
SELECT positions AS "位置",COUNT(*),GROUP_CONCAT(NAME,":",age) FROM sportors GROUP BY positions;
-- 完整指令:
-- 找出1,2,3位置中总数大于等于2的
SELECT positions,COUNT(*) FROM sportors WHERE positions IN (1,2,3) GROUP BY positions HAVING COUNT(*)>=2;
--positions count(*)
-- 后卫 3
-- 中场 2
SELECT positions,COUNT(*) FROM sportors GROUP BY positions WHERE COUNT(*)>=2;
-- 报错 在分组后进行having
SELECT positions,COUNT(*) FROM sportors HAVING positions IN (1,2,3); -- 不会抱错但是数据不对
-- positions COUNT(*)
-- 中场 9