聚合函数&groupby&having

本文深入探讨了SQL语句中的聚合函数,包括Count、Max、Min、Avg、Sum、Variance、Stddev等,解释了它们的区别及应用场景。通过示例展示了如何使用group by子句对数据进行分组,并结合having子句筛选满足特定条件的组。

                                   

1.  Sql语句的聚合函数有:

聚合函数和其他函数的区别是:聚合函数一般作用在多条记录上。

A:Count(coutexpr|distinct coutexpr)用来求有效数据的数量
B:Max(maxexpr|distinct maxexpr)用来求给定数据中最大的那一个数据 
C:Min(minexpr|distinct minexpr)用来求给定数据中最小的那一个数据
D:Avg(avgexpr|distinct avgexpr)用来求给定数据的平均值
E:Sum(sumexpr|distinct sumexpr)用来求给定数据的总和
F:Variance(varexpr|distinct varexpr)用来求给定数据的标准差
G:Stddev(stdexpr|distinctstdexpr) 用来求给定数据的方差

备注:这些聚合函数一般会和group by一起使用,从而按照给定的数据表列给查询结果集合分组的。 

在select 语句中可以使用group by 子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。group by 子句可以将查询结果分组,并返回行的汇总信息Oracle 按照group by 子句中指定的表达式的值分组查询结果。
一个必须注意的地方是:SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是聚合函数列

select deptno,sum(sal) from emp where sal>1200 group by deptno having sum(sal)>8500 order by deptno;

  当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having 与where 子句类似,均用于设置限定条件.
  where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
  having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

### 如何使用聚合函数与 `GROUP BY` 子句进行 SQL 查询 在 SQL 查询中,聚合函数和 `GROUP BY` 子句常用于对数据进行分组和汇总分析。以下是关于如何使用它们的详细说明: #### 聚合函数概述 聚合函数是对一组值执行计算,并返回单个值的函数。常见的聚合函数包括: - `COUNT(*)`: 统计行数。 - `SUM(column)`: 计算指定列的总和。 - `AVG(column)`: 计算指定列的平均值。 - `MAX(column)`: 获取指定列的最大值。 - `MIN(column)`: 获取指定列的最小值。 除了 `COUNT(*)` 外,所有聚合函数都会忽略 `NULL` 值[^1]。 #### `GROUP BY` 子句的作用 `GROUP BY` 子句用于将结果集中的行分组到汇总摘要中。当需要对数据进行聚合分析时(例如,计算每个组的总和、平均值、最大值、最小值或计数),`GROUP BY` 子句显得尤为重要[^2]。 #### 使用规则 1. 如果 `SELECT` 子句中包含聚合函数,则 `GROUP BY` 将计算每个组的汇总值。 2. 指定 `GROUP BY` 时,选择列表中任何非聚合表达式内的每个属性名都应包含在 `GROUP BY` 列表中,或者 `GROUP BY` 表达式必须与选择列表表达式完全匹配。 3. 不能对非标量基元类型的列(如 `text`, `image`, 或 `bit` 类型)使用 `GROUP BY`。 4. 在分组前可以使用 `WHERE` 子句消除不满足条件的行。 5. 使用 `GROUP BY` 子句返回的组没有特定的顺序,可以使用 `ORDER BY` 子句指定次序。 #### 示例:按部门统计员工总数和平均工资 假设有一个名为 `employees` 的表,包含以下字段:`id`, `name`, `department`, `salary`。需要按部门统计每个部门的员工总数和平均工资。 查询语句如下: ```sql SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary FROM employees GROUP BY department; ``` #### 示例:过滤出平均工资大于 5000 的部门 如果需要进一步筛选出平均工资大于 5000 的部门,可以使用 `HAVING` 子句(注意:`HAVING` 子句用于对分组后的数据进行过滤,而 `WHERE` 子句用于对原始数据进行过滤)。 查询语句如下: ```sql SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary FROM employees GROUP BY department HAVING AVG(salary) > 5000; ``` #### 示例:结合 `WHERE` 和 `GROUP BY` 如果需要先筛选出工资高于 3000 的员工,再按部门统计员工总数和平均工资: 查询语句如下: ```sql SELECT department, COUNT(*) AS employee_count, AVG(salary) AS average_salary FROM employees WHERE salary > 3000 GROUP BY department; ``` #### 注意事项 - 确保 `SELECT` 子句中的每一列要么是聚合函数的一部分,要么出现在 `GROUP BY` 子句中。 - 使用 `GROUP BY` 子句时,建议结合 `ORDER BY` 子句以确保结果的顺序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值