SELECT COUNT(*), grade_level
FROM employees e
JOIN job_grades g ON e.salary BETWEEN g.lowest_sal AND g.highest_sal
GROUP BY grade_level
HAVING COUNT(*) > 20
ORDER BY grade_level DESC;
为什么需要GROUP BY而不是仅仅ORDER BY?
聚合数据:GROUP BY用于将结果集中的行分组,每组共享相同的grade_level值。在每组内,你可以使用聚合函数(如COUNT(*))来计算该组内的行数。没有GROUP BY,你将无法按grade_level进行分组并计算每个级别的员工数量。
筛选分组:HAVING子句用于过滤分组后的结果。在这个例子中,HAVING COUNT(*) > 20确保只有那些员工数量大于20的grade_level组被包含在最终的结果中。HAVING子句在GROUP BY之后执行,用于过滤聚合后的结果。
排序结果:ORDER BY用于对最终的结果集进行排序。在这个例子中,它根据grade_level的值以降序方式排序结果。但请注意,ORDER BY不能在没有GROUP BY的情况下直接应用于聚合函数的结果,因为那样会导致SQL语句的语法错误或逻辑错误。
-
select语句中出现的列必须出现在group by语句中,而其他语句中的列可与select不一致??
-
where分组前过滤,having分组后过滤,故having是对分组的值即聚集函数进行过滤