group分组

按照deptno分组之后,每个组再按照job进行细分,然后统计每个job小分组的数量

select deptno,job,count(*) from emp group by deptno,job order by deptno,count(*)

先按照deptno job将整张表进行分组,然后然后筛选出count>1的
having的优先级比较低,可以做到先分组后筛选
where优先级要比group高,用多行函数的时候不能用where,否则逻辑错误


                
在 SQL 中,`GROUP BY` 子句用于将结果集按照一个或多个列进行分组,以便对每个分组执行聚合操作(如 `SUM`、`AVG`、`COUNT`、`MAX`、`MIN` 等)[^1]。通过 `GROUP BY`,可以对不同类别的数据进行汇总分析,从而更有效地理解数据分布。 ### 基本语法 ```sql SELECT column1, column2, AGGREGATE_FUNCTION(column3) FROM table_name GROUP BY column1, column2; ``` 此语法表示将 `table_name` 中的数据按照 `column1` 和 `column2` 的组合值进行分组,并对 `column3` 执行聚合函数(如 `SUM`、`AVG` 等)[^1]。 ### 示例 1:基本分组 假设有一个名为 `employees` 的表,包含以下字段: - `department`:部门名称 - `salary`:员工薪资 若要查询每个部门的平均薪资,可以使用如下语句: ```sql SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department; ``` 该查询将 `employees` 表按照 `department` 字段分组,并对每组计算平均薪资 `AVG(salary)` [^2]。 ### 示例 2:使用 HAVING 进行分组过滤 `HAVING` 子句用于对分组后的结果进行过滤。例如,只显示平均薪资大于 50000 的部门: ```sql SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department HAVING AVG(salary) > 50000; ``` 与 `WHERE` 子句不同,`HAVING` 是在分组之后应用的,因此可以使用聚合函数作为条件 [^3]。 ### 示例 3:多列分组 如果希望按照多个列进行分组,例如部门和职位(`position`),可以使用以下语句: ```sql SELECT department, position, AVG(salary) AS average_salary FROM employees GROUP BY department, position; ``` 该查询将数据按照 `department` 和 `position` 的组合进行分组,并计算每个组合的平均薪资 [^1]。 ### 示例 4:结合 ORDER BY 排序 可以在 `GROUP BY` 查询基础上使用 `ORDER BY` 对结果进行排序。例如,按平均薪资降序排列部门: ```sql SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department ORDER BY average_salary DESC; ``` 该查询将结果按照 `average_salary` 降序排列 [^2]。 ### 示例 5:结合 WHERE 进行行过滤 `WHERE` 子句用于在分组之前过滤数据。例如,仅统计薪资大于 30000 的员工的平均薪资: ```sql SELECT department, AVG(salary) AS average_salary FROM employees WHERE salary > 30000 GROUP BY department; ``` 此查询在分组前先过滤掉薪资小于等于 30000 的记录,再对符合条件的数据进行分组和聚合 [^3]。 ### 总结 - `GROUP BY` 用于将数据按照一个或多个列进行分组。 - `HAVING` 用于对分组后的结果进行条件过滤。 - `WHERE` 用于在分组前对原始数据进行筛选。 - `ORDER BY` 用于对最终结果集进行排序。 通过合理使用这些子句,可以实现复杂的数据聚合与分析任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值