当我们要统计一张表数据有多少的时候
例如,想查询employees表一共有多少条记录,难道就要把SELECT * FROM employees查出来然后再数一数有多少行吗?
虽然这个方法可以,但是不推荐使用。对于统计总数、平均数这类计算,oracle提供了专门的分组函数,就是通过使用分组函数进行查询,就是分组查询,它可以快速获得结果。
以查询employees表一共有多少条记录为例,我们可以使用oracle内置的COUNT()函数查询:
-- 使用COUNT()函数进行分组查询:
SELECT COUNT(*)
FROM employees
COUNT(*)表示查询所有列的行数,要注意分组的计算结果虽然是一个数字,但是查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)。
不过,通常时候,在使用分组查询时,我们应该给列名设置一个别名,便于处理结果:
-- 使用分组查询并设置结果集的列名为num:
SELECT COUNT(*) num
FROM employees
COUNT(*)和COUNT(id)实际上是一样的效果。
不过,要注意的是,分组查询同样可以使用WHERE条件,因此我们可以方便地统计出有多少姓相同的员工、多少工资10000以上的员工等:
-- 使用分组查询并设置WHERE条件:
SELECT COUNT(*)
FROM employees
WHERE salary > 10000
分组函数除了COUNT()函数外,oracle还提供了以下分组函数:
函数 说明
SUM 计算某一列的合计值,该列必须为数值类型
AVG 计算某一列的平均值,该列必须为数值类型
MAX 计算某一列的最大值
MIN 计算某一列的最小值
注意,MAX()和MIN()函数并不限于数值类型。如果是字符类型,MAX()和MIN()会返回排序最后和排序最前的字符。
要统计男生的平均成绩,我们用下面的分组查询:
-- 使用分组查询计算员工平均工资:
SELECT AVG(*) avg
FROM employees ;
要特别注意:如果分组查询的WHERE条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL:
-- WHERE条件salary < 0匹配不到任何行:
SELECT AVG(*) avg
FROM employees
WHERE salary < 0;