在 SQL 中,有几种对数据进行分组的常见方式,包括以下几种:
1.GROUP BY 子句:使用 GROUP BY 子句可以将结果按照一个或多个列进行分组。例如,以下示例按照部门对员工表进行分组统计每个部门的总工资:
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
2.HAVING 子句:HAVING 子句通常与 GROUP BY 子句一起使用,用于筛选分组后的结果。例如,以下示例筛选出总工资大于 5000 的部门:
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department
HAVING total_salary > 5000;
3.聚合函数:聚合函数可以对分组后的数据进行计算,返回单个结果值。常见的聚合函数包括 SUM、COUNT、AVG、MAX 和 MIN 等。例如,以下示例计算出每个部门的平均工资:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
4.窗口函数:窗口函数是一种高级技术,它可以在不破坏原始查询结果的情况下,对查询结果集的某个窗口范围进行计算。窗口函数通常与 OVER 子句一起使用。例如,以下示例计算每个部门内员工的薪资排名:
SELECT department, employee_name, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;
5.分组集合运算:使用分组集合运算可以对多个查询结果进行合并和比较。常见的分组集合运算包括 UNION、INTERSECT 和 EXCEPT/MINUS。例如,以下示例将两个查询结果进行合并:
SELECT department, salary
FROM employees
WHERE gender = 'Male'
UNION
SELECT department, salary
FROM employees
WHERE gender = 'Female';
6.子查询:子查询是一个嵌套在主查询中的查询语句,可以将子查询的结果作为主查询的条件或者数据源进行分组。例如,以下示例根据每个部门的平均工资筛选出高于公司平均工资的部门:
SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees);