📜  Have 子句和 Group by 子句的区别(1)

📅  最后修改于: 2023-12-03 15:15:28.862000             🧑  作者: Mango

Have子句和Group by子句的区别

在SQL中,有时需要对结果进行聚合以进行汇总。其中使用最多的是使用HAVING子句和GROUP BY子句。本文将讨论它们的区别和用法。

GROUP BY子句

GROUP BY子句用于将结果集按一个或多个列进行分组。语法如下:

SELECT column1, column2, ..., columnN
FROM table_name
GROUP BY column1, column2, ..., columnN;

例如,我们有一个名为employees的表,其中包含以下列:employee_idfirst_namelast_namesalary。我们想计算每个部门的平均工资,可以使用如下语句:

SELECT department, AVG(salary)
FROM employees
GROUP BY department;

注意,只能在SELECT语句中使用GROUP BY子句,而不能在WHERE子句或FROM子句中使用。而且,SELECT语句中必须出现GROUP BY子句中所列出的所有列。

HAVING子句

HAVING子句用于对GROUP BY分组后的结果集进行进一步限制。语法与WHERE子句类似,但在HAVING子句中可以使用聚合函数。

SELECT column1, column2, ..., columnN, aggregate_function(columnX)
FROM table_name
GROUP BY column1, column2, ..., columnN
HAVING aggregate_function(columnX) operator value;

例如,我们想筛选平均工资高于5000的部门,可以使用如下语句:

SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 5000;

HAVING子句与WHERE子句的区别在于前者用于筛选GROUP BY分组后的结果集,而后者用于筛选原始数据表中的行。因此,HAVING子句中可以使用SELECT语句中所定义的别名(如上例中的AVG(salary)),而WHERE子句中不能使用。

总结

GROUP BYHAVING子句都用于聚合结果集,但GROUP BY子句用于分组列,HAVING子句用于限制分组后的结果集。记住GROUP BY中必须列出所有需要分组的列,而HAVING子句中可以使用聚合函数及别名。