数据库中,集函数(也称为聚合函数)是一类特殊的函数,它们对一组值进行计算并返回单个结果,这些函数在数据分析、统计和报表生成等方面非常有用,以下是一些常见的数据库集函数及其使用方法:
常见集函数介绍
集函数 | 功能描述 | 示例(假设有一个employees 表,包含salary 列) |
---|---|---|
COUNT() |
计算指定列的非NULL值数量或表中所有行的数量 | SELECT COUNT() FROM employees; 计算员工总数SELECT COUNT(salary) FROM employees; 计算有薪水记录的员工数 |
SUM() |
计算指定列的所有数值总和 | SELECT SUM(salary) FROM employees; 计算总薪水 |
AVG() |
计算指定列的平均值 | SELECT AVG(salary) FROM employees; 计算平均薪水 |
MAX() |
找出指定列中的最大值 | SELECT MAX(salary) FROM employees; 找出最高薪水 |
MIN() |
找出指定列中的最小值 | SELECT MIN(salary) FROM employees; 找出最低薪水 |
使用集函数的基本语法
集函数通常与SELECT
语句一起使用,并且可以结合GROUP BY
子句来对数据进行分组后再应用集函数,基本语法如下:
SELECT 集函数名(列名) [AS 别名] FROM 表名 [WHERE 条件] [GROUP BY 分组列] [HAVING 分组后过滤条件];
WHERE
子句用于在应用集函数之前过滤行。GROUP BY
子句用于将结果集按一个或多个列进行分组,以便对每个组分别应用集函数。HAVING
子句用于在分组后过滤组,它与WHERE
子句的区别在于HAVING
可以引用集函数的结果。
示例说明
-
计算每个部门的平均薪水
假设
employees
表还有一个department_id
列,我们想要计算每个部门的平均薪水:SELECT department_id, AVG(salary) AS avg_salary FROM employees GROUP BY department_id;
这个查询会返回每个部门的ID及其对应的平均薪水。
-
找出薪水最高的前三个员工
虽然这不是直接的集函数应用,但可以通过结合集函数和排序来实现:
SELECT employee_id, salary FROM employees ORDER BY salary DESC LIMIT 3;
这里
ORDER BY
用于按薪水降序排序,LIMIT
用于限制结果集只返回前三条记录。 -
计算有薪水记录的员工总数,并过滤掉薪水低于特定值的部门
SELECT department_id, COUNT(salary) AS employee_count FROM employees WHERE salary > 50000 -假设我们只关心薪水超过50000的员工 GROUP BY department_id HAVING COUNT(salary) > 5; -只返回员工数大于5的部门
这个查询首先通过
WHERE
子句过滤掉薪水低于50000的员工,然后按部门分组,并计算每个部门的员工数。HAVING
子句过滤掉员工数不超过5的部门。
注意事项
- 当使用
COUNT()
时,如果指定了列名,则只会计算该列非NULL的值;如果使用或不指定列名,则会计算所有行,包括那些所有列都为NULL的行。 SUM()
和AVG()
只适用于数值类型的列。MAX()
和MIN()
可以应用于数值类型和字符类型的列,对于字符类型,它们会根据字符的ASCII值或Unicode值来确定大小。- 在使用
GROUP BY
时,如果选择了多个列,那么这些列的组合将作为分组的依据。 HAVING
子句总是跟在GROUP BY
之后,并且可以包含集函数,而WHERE
子句不能包含集函数。
相关问答FAQs
如何在MySQL中使用集函数来计算某个列的中位数?
MySQL没有直接的中位数函数,但可以通过结合ORDER BY
、LIMIT
和一些数学计算来模拟,一种常见的方法是先找到中间位置的行,然后根据行数的奇偶性来决定是否需要取平均值,要计算salary
列的中位数:
SELECT AVG(middle_values.salary) AS median_salary FROM ( SELECT salary FROM employees ORDER BY salary LIMIT 2 (SELECT COUNT() FROM employees) % 2 -如果行数是奇数,则取中间一行;如果是偶数,则取中间两行 OFFSET (SELECT FLOOR((COUNT() 1) / 2) FROM employees) -跳过前面的行,直到中间位置 ) AS middle_values;
这个查询首先确定要选择的行数(奇数行数选一行,偶数行数选两行),然后跳过前面的行直到中间位置,最后计算这些行的平均值作为中位数。
为什么在使用GROUP BY
时有时需要同时使用HAVING
子句?
GROUP BY
子句用于将结果集按一个或多个列进行分组,而HAVING
子句则用于在这些分组形成之后过滤掉不符合条件的组,这是因为WHERE
子句只能在分组之前过滤行,而不能基于分组后的数据(如集函数的结果)进行过滤,当你需要根据分组后的数据统计结果(如每组的平均值、总和等)来过滤组时,就需要使用HAVING
子句,如果你只想看到员工数超过10的部门的平均薪水,就需要在GROUP BY
之后使用HAVING
来过滤掉员工数不足
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/71053.html