SQL中的聚合函数介绍

 

SQL中的聚合函数介绍

 

什么是聚合函数(aggregate function)?

聚合函数对一组值执行计算并返回单一的值。

SQL中的聚合函数介绍

 

聚合函数有什么特点?

  1. 除了 COUNT 以外,聚合函数忽略空值。
  2. 聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。
  3. 所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。
  4. 标量函数:只能对单个的数字或值进行计算。主要包括字符函数、日期/时间函数、数值函数和转换函数这四类。

SQL中的聚合函数介绍

 

常见的聚合函数有哪些?

1、求个数/记录数/项目数等:count()

例如: 统计员工个数?

select count( ) from Company --包括空值
select count(*) from Company --不包括空值

2、求某一列平均数 :avg()

例如:求某个班平均成绩 ?求某个公司员工的平均工资?

select avg(score) from Scores ---平均成绩
select avg(salary) from Company --平均工资

注意:

若某行的score值为null时,计算平均值时会忽略带有null值得那一行。

如果想要把null当做0,那么可以使用IsNull函数把null转换成0,语法如下:

 avg(IsNull(score,0)) as ’Average Score‘

3、求总和,总分等:sum() --必须为数字列

例如:求某个班的总成绩?求公司总薪资支出?

select sum(score) from Scores
select sum(salary) from Company

4、求最大值,最高分,最高工资等:max()

例如:求班里最高分,公司员工最高工资?

select max(Score) from Scores
select max(salary) from Company

5、求最小值,最低分,最低工资等:max()

例如:求班里最低分,公司员工最低工资?

select min(Score) from Scores
select min(salary) from Company

SQL中的聚合函数介绍

 

聚合函数怎么正确的使用?

  • 1、 select 语句的选择列表(子查询或外部查询);
  • 2、having 子句;
  • 3、compute 或 compute by 子句中等;

注意: 在实际应用中,聚合函数常和分组函数group by结合使用,用来查询.where 子句的作用对象一般只是行,用来作为过滤数据的条件。

SQL中的聚合函数介绍

 

其他聚合函数(aggregate function)

6、 count_big()返回指定组中的项目数量。

与count()函数区别:count_big()返回bigint值,而count()返回的是int值。

数据类型详见:

SQL Server 数据类型的详细介绍及应用实例1

SQL Server 数据类型的详细介绍及应用实例2

SQL Server 数据类型的详细介绍及应用实例3

例如:

select count_big(prd_no) from sales

7、 grouping()产生一个附加的列。

当用cube或rollup运算符添加行时,输出值为1;

当所添加的行不是由cube或rollup产生时,输出值为0.

例如:

select prd_no,sum(qty),grouping(prd_no) from sales group by prd_no with rollup

8、binary_checksum() 返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改。

例如:

select prd_no,binary_checksum(qty) from sales group by prd_no

9、checksum_agg() 返回指定数据的校验值,空值被忽略。

例如:

select prd_no,checksum_agg(binary_checksum(*)) from sales group by prd_no

10、checksum() 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。

11、stdev()返回给定表达式中所有值的统计标准偏差。

例如:

select stdev(prd_no) from sales

12、stdevp() 返回给定表达式中的所有值的填充统计标准偏差。

例如:

select stdevp(prd_no) from sales

13、 var() 返回给定表达式中所有值的统计方差。

例如:

select var(prd_no) from sales

14、 varp()返回给定表达式中所有值的填充的统计方差。

例如:

select varp(prd_no) from sales

 

<think>我们正在讨论SQL聚合函数。根据引用[1][2][3],聚合函数用于对一组值执行计算并返回单一的值。常见的聚合函数包括:COUNT(), SUM(), AVG(), MAX(), MIN()等。它们通常与GROUP BY子句一起使用,用于对数据进行分组统计。 引用[1]提到:聚合函数的难点在于精确、准确的使用方法,使用方法前还需要考虑该方法支持的数据类型。比如sum(),此方法仅用于数字列。 引用[2]给出了聚合函数的基本语法:select 列名+聚合函数 from 库名 group by 列名 having +聚合函数; 引用[3]强调了GROUP BY改变了SQL的思维方式:按组处理,而不是逐行处理,因此必须使用聚合函数或GROUP BY的列来选择值。 另外,引用[4]虽然讲的是Flink SQL自定义聚合函数,但其中提到自定义聚合函数至少需要createAccumulator、accumulate、getValue这三个方法,这可以帮助我们理解聚合函数的内部机制(但标准SQL中我们主要关注内置函数)。 下面我将详细介绍SQL聚合函数的使用方法。 ## SQL聚合函数详解 ### 一、常用聚合函数列表 1. **COUNT()**: 计算行数(或非NULL值的个数)。 - `COUNT(*)`:统计所有行数(包括NULL)。 - `COUNT(列名)`:统计指定列中非NULL值的个数。 2. **SUM()**: 计算数值列的总和(忽略NULL)。 3. **AVG()**: 计算数值列的平均值(忽略NULL)。 4. **MAX()**: 返回列中的最大值(适用于数值、字符串、日期等类型)。 5. **MIN()**: 返回列中的最小值(适用于数值、字符串、日期等类型)。 6. **GROUP_CONCAT()** (MySQL特有):将组内的字符串连接成一个字符串。 7. **STDDEV()**, **VARIANCE()**:标准差和方差(数值列)。 ### 二、基本使用语法 聚合函数通常与`GROUP BY`子句一起使用,用于分组统计。如果没有`GROUP BY`,则整个表作为一个组。 #### 示例1:整个表作为一组 ```sql -- 计算员工表的总人数 SELECT COUNT(*) AS total_employees FROM employees; -- 计算员工表中工资总和、平均工资、最高工资、最低工资 SELECT SUM(salary) AS total_salary, AVG(salary) AS avg_salary, MAX(salary) AS max_salary, MIN(salary) AS min_salary FROM employees; ``` #### 示例2:按部门分组统计 ```sql -- 按部门分组,统计每个部门的员工人数、工资总和、平均工资 SELECT department_id, COUNT(*) AS employee_count, SUM(salary) AS total_salary, AVG(salary) AS avg_salary FROM employees GROUP BY department_id; ``` ### 三、GROUP BY与HAVING子句 - `GROUP BY`:将数据按指定列的值分组,然后对每组应用聚合函数。 - `HAVING`:用于过滤分组后的结果(类似于WHERE,但用于聚合条件)。 ```sql -- 查询平均工资超过10000的部门 SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id HAVING AVG(salary) > 10000; -- HAVING后面跟聚合条件 ``` 注意:`WHERE`子句在分组前过滤行,而`HAVING`在分组后过滤组。 ### 四、注意事项 1. **数据类型匹配**:聚合函数对数据类型有要求。例如,`SUM()`和`AVG()`只能用于数值列,而`MAX()`和`MIN()`可用于数值、字符串、日期等[^1]。 2. **NULL值处理**:聚合函数忽略NULL值(`COUNT(*)`除外)。 3. **非分组列**:在SELECT子句中,除了聚合函数和GROUP BY列,其他列不能直接出现(除非它们在功能上依赖于GROUP BY列)。 - 错误示例(在MySQL的严格模式下会报错): ```sql -- 错误:department_name不在GROUP BY子句中,也不是聚合函数 SELECT department_id, department_name, COUNT(*) FROM employees GROUP BY department_id; ``` - 修正:如果department_name与department_id一一对应,可以加入GROUP BY(或使用函数如ANY_VALUE): ```sql SELECT department_id, ANY_VALUE(department_name), COUNT(*) FROM employees GROUP BY department_id; ``` 或者(在支持功能依赖的数据库如MySQL 5.7+的宽松模式下可能允许,但不推荐依赖此特性)[^3]。 4. **性能优化**:聚合操作可能涉及全表扫描,对大型表应确保在GROUP BY列上建立索引。 ### 五、进阶用法:多列分组 可以按多个列分组,此时分组依据是这些列的组合值。 ```sql -- 按部门和职位分组统计 SELECT department_id, job_id, COUNT(*) AS employee_count, AVG(salary) AS avg_salary FROM employees GROUP BY department_id, job_id; ``` ### 六、聚合函数与DISTINCT 聚合函数可以与`DISTINCT`结合使用,以计算不同值的聚合。 ```sql -- 计算不同部门的数量(非NULL的department_id) SELECT COUNT(DISTINCT department_id) FROM employees; -- 计算每个部门中不同职位的数量 SELECT department_id, COUNT(DISTINCT job_id) AS distinct_jobs FROM employees GROUP BY department_id; ``` ## 总结 SQL聚合函数是数据分析的核心工具,通过`GROUP BY`实现分组统计,用`HAVING`对分组结果进行过滤。使用时需注意数据类型、NULL值处理以及非分组列的处理规则[^1][^2][^3]。 §§相关问题§§ 1. 如何在SQL中同时使用多个聚合函数? 2. 聚合函数中COUNT(1)和COUNT(*)有什么区别? 3. 为什么在GROUP BY查询中不能直接使用非分组列? 4. 如何优化包含GROUP BY和聚合函数的大数据量查询? 5. 除了常见的聚合函数SQL还支持哪些高级聚合函数(如窗口函数中的聚合)?</think>### SQL聚合函数详解 SQL聚合函数用于对一组值执行计算并返回单一的值,常用于数据统计和分析。以下是核心聚合函数及使用方法: #### 一、常用聚合函数列表 1. **COUNT()** - 统计行数或非NULL值数量 - 示例: ```sql SELECT COUNT(*) AS total_users FROM users; -- 统计所有行数 SELECT COUNT(email) AS valid_emails FROM users; -- 统计非NULL的邮箱数 ``` 2. **SUM()** - 计算数值列的总和(仅适用于数值类型)[^1] - 示例: ```sql SELECT SUM(salary) AS total_payroll FROM employees; ``` 3. **AVG()** - 计算数值列的平均值 - 示例: ```sql SELECT AVG(score) AS average_score FROM exam_results; ``` 4. **MAX()/MIN()** - 返回列的最大值/最小值(支持数值、日期、字符串) - 示例: ```sql SELECT MAX(temperature) AS max_temp, MIN(temperature) AS min_temp FROM weather_data; ``` 5. **GROUP_CONCAT()** (MySQL特有) - 将分组内的值连接成字符串 - 示例: ```sql SELECT department, GROUP_CONCAT(name) AS employees FROM staff GROUP BY department; ``` #### 二、核心使用规则 1. **基本语法结构** ```sql SELECT 列名, 聚合函数(列名) FROM 表名 GROUP BY 列名 HAVING 聚合函数(列名) 条件; ``` - `GROUP BY`:定义分组依据(必选)[^3] - `HAVING`:过滤聚合结果(类似`WHERE`但作用于分组后)[^2] 2. **典型工作流程** 整张表 → 按字段值分组 → 每组做聚合 → 输出每组统计结果[^3] #### 三、使用示例 1. **单字段分组统计** ```sql -- 统计每个部门的平均工资 SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department; ``` 2. **多字段分组统计** ```sql -- 统计每个部门+职级的最高工资 SELECT department, job_level, MAX(salary) AS max_salary FROM employees GROUP BY department, job_level; ``` 3. **HAVING过滤分组** ```sql -- 筛选平均工资>10000的部门 SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department HAVING AVG(salary) > 10000; -- 注意:不可用列别名 ``` #### 四、注意事项 1. **数据类型匹配** - `SUM()/AVG()`仅适用于数值类型[^1] - `MAX()/MIN()`支持数值、日期、字符串 2. **NULL值处理** 所有聚合函数自动忽略NULL值(`COUNT(*)`除外) 3. **性能优化** - 对`GROUP BY`列建立索引加速分组 - 避免`SELECT *`,仅选择必要列 4. **与普通列混用限制** `SELECT`中的聚合列必须出现在`GROUP BY`中[^3]: ```sql -- 错误示例(name未在GROUP BY中) SELECT department, name, AVG(salary) FROM employees GROUP BY department; ``` #### 五、高级应用 1. **嵌套聚合** ```sql -- 计算各部门最高平均工资 SELECT MAX(avg_salary) FROM ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) AS dept_avg; ``` 2. **结合DISTINCT** ```sql -- 统计不重复客户数量 SELECT COUNT(DISTINCT customer_id) FROM orders; ``` > 关键点:聚合函数将多行数据"折叠"成单行统计值,必须与`GROUP BY`配合使用(整表聚合时可省略)[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值