sql 2005 聚合函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 2005 聚合函数相关的知识,希望对你有一定的参考价值。
sql 2005中的聚合函数有那些··是怎么使用滴·
谢谢
AVG聚合函数计算一个组中非NULL值的平均值
COUNT
COUNT聚合函数返回一个显示组中行数的整数值
COUNT_BIG
和COUNT功能一样,只是COUNT_BIG返回bigint数据类型值
MAX
MAX聚合函数返回一组非NULL值中的最大值
MIN
MIN聚合函数返回一组非NULL值中的最小值
SUM
SUM聚合函数返回一个表达式中所有非NULL值的总和
STDEV
STDEV函数根据数据母体的样本返回由表达式提供的所有值的标准差
STDEVP
STDEVP函数也返回由表达式提供的所有值的标准差,只是它计算整个数据母体
VAR
VAR函数根据数据母体的样本返回由表达式提供的值的方差
VARP
VARP函数也返回表达式整个数据母体提供的值的方差 参考技术A AVG
AVG聚合函数计算一个组中非NULL值的平均值
COUNT
COUNT聚合函数返回一个显示组中行数的整数值
MAX
MAX聚合函数返回一组非NULL值中的最大值
MIN
MIN聚合函数返回一组非NULL值中的最小值
SUM
SUM聚合函数返回一个表达式中所有非NULL值的总和
以上这些事最常用的几个例子。 参考技术B sum(列名) 把列相加的和 类似的函数你上MSDN查下就知道了 参考技术C 太多了 自己 看 联机丛书
sql 语句中那些是聚合函数?
当用到聚合函数的时候需要用GROUP BY 分组,那么sql中那些属于聚合函数啊?谢谢如果方便请把sql中所有函数及归属贴上。谢谢(刚刚接触sql比较晕呼~)
常见聚合函数,max(最大)、min(最小)、sum(求和)、avg(平均)等,
示例如下,
1、创建测试表,
create table test_group(id number, value number);
2、插入测试数据
insert into test_group values(1,1001);
insert into test_group values(1,1002);
insert into test_group values(1,1003);
insert into test_group values(1,1004);
insert into test_group values(1,1005);
3、查询表中所有记录,select t.*, rowid from test_group t,
4、编写sql,分别求聚合函数max、min、sum、avg,见:select max(value), min(value), sum(value), avg(value) from test_group t,
参考技术A 一下内容纯属抄袭~,希望有点用~8.2 聚合函数的应用
聚合函数在数据库数据的查询分析中,应用十分广泛。本节将分别对各聚合函数的应用进行说明。
8.2.1 求和函数——SUM()
求和函数SUM( )用于对数据求和,返回选取结果集中所有值的总和。语法如下。
SELECT SUM(column_name)
FROM table_name
说明:SUM()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
实例1 SUM函数的使用
从TEACHER表中查询所有男教师的工资总数。TEACHER表的结构和数据可参见5.2.1节的表5-1,下同。实例代码:
SELECT SUM(SAL) AS BOYSAL
FROM TEACHER
WHERE TSEX='男'
运行结果如图8.1所示。
图8.1 TEACHER表中所有男教师的工资总数
实例2 SUM函数对NULL值的处理
从TEACHER表中查询年龄大于40岁的教师的工资总数。实例代码:
SELECT SUM(SAL) AS OLDSAL
FROM TEACHER
WHERE AGE>=40
运行结果如图8.2所示。
图8.2 TEACHER表中所有年龄大于40岁的教师的工资总数
当对某列数据进行求和时,如果该列存在NULL值,则SUM函数会忽略该值。
8.2.2 计数函数——COUNT()
COUNT()函数用来计算表中记录的个数或者列中值的个数,计算内容由SELECT语句指定。使用COUNT函数时,必须指定一个列的名称或者使用星号,星号表示计算一个表中的所有记录。两种使用形式如下。
* COUNT(*),计算表中行的总数,即使表中行的数据为NULL,也被计入在内。
* COUNT(column),计算column列包含的行的数目,如果该列中某行数据为NULL,则该行不计入统计总数。
1.使用COUNT(*)函数对表中的行数计数
COUNT(*)函数将返回满足SELECT语句的WHERE子句中的搜索条件的函数。
实例3 COUNT(*)函数的使用
查询TEACHER表中的所有记录的行数。实例代码:
SELECT COUNT(*) AS TOTALITEM
FROM TEACHER
运行结果如图8.3所示。
图8.3 使用COUNT(*)函数对表中的行数计数
在该例中,SELECT语句中没有WHERE子句,那么认为表中的所有行都满足SELECT语句,所以SELECT语句将返回表中所有行的计数,结果与5.2.1节的表5-1列出的TEACHER表的数据相吻合。
如果DBMS在其系统表中存储了表的行数,COUNT(*)将很快地返回表的行数,因为这时,DBMS不必从头到尾读取表,并对物理表中的行计数,而直接从系统表中提取行的计数。而如果DBMS没有在系统表存储表的行数,将具有NOT NULL约束的列作为参数,使用COUNT( )函数,则可能更快地对表行计数。
注意
COUNT(*)函数将准确地返回表中的总行数,而仅当COUNT()函数的参数列没有NULL值时,才返回表中正确的行计数,所以仅当受NOT NULL限制的列作为参数时,才可使用COUNT( )函数代替COUNT(*)函数。
2.使用COUNT( )函数对一列中的数据计数
COUNT( )函数可用于对一列中的数据值计数。与忽略了所有列的COUNT(*)函数不同,COUNT( )函数逐一检查一列(或多列)中的值,并对那些值不是NULL的行计数。
实例4 查询多列中所有记录的行数
查询TEACHER表中的TNO列、TNAME列以及SAL列中包含的所有数据行数。实例代码:
SELECT COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME,
COUNT(SAL) AS TOTAL_SAL
FROM TEACHER
运行结果如图8.4所示。
图8.4 使用COUNT( )函数对一列中的数据计数
可见,TNO列与TNAME列由于其中不含有NULL值,所以其计数与使用COUNT(*)函数对TEACHER表中的记录计数结果相一致,而SAL列由于其中有两行数据为NULL,所以这两列没有被计入在内,计数结果也就是8。
3.使用COUNT( )函数对多列中的数据计数
COUNT( )函数不仅可用于对一列中的数据值计数,也可以对多列中的数据值计数。如果对多列计数,则需要将要计数的多列通过连接符连接后,作为COUNT( )函数的参数。下面将结合具体的多列计数的实例,说明其使用过程。
*说明
关于如何使用连接符连接多列可参见本书的7.2节。
实例5 使用COUNT( )函数对多列中的数据计数
统计TEACHER表中的TNO列、TNAME列和SAL列中分别包含的数据行数,以及TNO列和TNAME列、TNAME列和SAL列一起包含的数据行数。实例代码:
SELECT COUNT(TNO) AS TOTAL_TNO, COUNT(TNAME) AS TOTAL_TNAME,
COUNT(SAL) AS TOTAL_SAL,
COUNT(CAST(TNO AS VARCHAR(5)) + TNAME) AS T_NONAME,
COUNT(TNAME + CAST(SAL AS VARCHAR(5))) AS T_NAMESAL
FROM TEACHER
运行结果如图8.5所示。
图8.5 使用COUNT( )函数对多列中的数据计数
在进行两列的连接时,由于它们的数据类型不一致,因此要使用CAST表达式将它们转换成相同的数据类型。
在7.2.1节已经讲过,如果在被连接的列中的任何一列有NULL值时,那么连接的结果为NULL,则该列不会被COUNT( )函数计数。
注意
COUNT( )函数只对那些传递到函数中的参数不是NULL的行计数。
4.使用COUNT函数对满足某种条件的记录计数
也可以在SELECT语句中添加一些子句约束来指定返回记录的个数。
实例6 使用COUNT函数对满足某种条件的记录计数
查询TEACHER表中女教师记录的数目。实例代码:
SELECT COUNT(*) AS TOTALWOMEN
FROM TEACHER
WHERE TSEX='女'
运行结果如图8.6所示。
图8.6 使用COUNT函数对满足某种条件的记录计数
这时结果为6而不是前面的所有记录10。之所以可以通过WHERE子句定义COUNT()函数的计数条件,这与SELECT语句各个子句的执行顺序是分不开的。前面已经讲过,DBMS首先执行FROM子句,而后是WHERE子句,最后是SELECT子句。所以COUNT()函数只能用于满足WHERE子句定义的查询条件的记录。没有包括在WHERE子句的查询结果中的记录,都不符合COUNT()函数。
8.2.3 最大/最小值函数—MAX()/MIN()
当需要了解一列中的最大值时,可以使用MAX()函数;同样,当需要了解一列中的最小值时,可以使用MIN()函数。语法如下。
SELECT MAX (column_name) / MIN (column_name)
FROM table_name
说明:列column_name中的数据可以是数值、字符串或是日期时间数据类型。MAX()/MIN()函数将返回与被传递的列同一数据类型的单一值。
实例7 MAX()函数的使用
查询TEACHER表中教师的最大年龄。实例代码:
SELECT MAX (AGE) AS MAXAGE
FROM TEACHER
运行结果如图8.7所示。
图8.7 TEACHER表中教师的最大年龄
然而,在实际应用中得到这个结果并不是特别有用,因为经常想要获得的信息是具有最大年龄的教师的教工号、姓名、性别等信息。
然而SQL不支持如下的SELECT语句。
SELECT TNAME, DNAME, TSEX, MAX (AGE)
FROM TEACHER
因为聚合函数处理的是数据组,在本例中,MAX函数将整个TEACHER表看成一组,而TNAME、DNAME和TSEX的数据都没有进行任何分组,因此SELECT语句没有逻辑意义。同样的道理,下面的代码也是无效的。
SELECT TNAME, DNAME, TSEX,SAL ,AGE
FROM TEACHER
WHERE AGE=MAX (AGE)
解决这个问题的方法,就是在WHERE子句中使用子查询来返回最大值,然后再基于这个返回的最大值,查询相关信息。
实例8 在WHERE子句中使用子查询返回最大值
查询TEACHER表中年纪最大的教师的教工号、姓名、性别等信息。
实例代码:
SELECT TNAME, DNAME, TSEX, SAL, AGE
FROM TEACHER
WHERE AGE=(SELECT MAX (AGE) FROM TEACHER)
运行结果如图8.8所示。
图8.8 在WHERE子句中使用子查询返回最大值
MAX()和MIN()函数不仅可以作用于数值型数据,也可以作用于字符串或是日期时间数据类型的数据。
实例9 MAX()函数用于字符型数据
如下面代码:
SELECT MAX (TNAME) AS MAXNAME
FROM TEACHER
运行结果如图8.9所示。
图8.9 在字符串数据类型中使用MAX的结果
可见,对于字符串也可以求其最大值。
*说明
对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。当然,对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。
当然,对与日期时间类型的数据也可以求其最大/最小值,其大小排列就是日期时间的早晚,越早认为其值越小,如下面的实例。
实例10 MAX()、MIN()函数用于时间型数据
从COURSE表中查询最早和最晚考试课程的考试时间。其中COURSE表的结构和数据可参见本书6.1节的表6-1。实例代码:
SELECT MIN (CTEST) AS EARLY_DATE,
MAX (CTEST) AS LATE_DATE
FROM COURSE
运行结果如图8.10所示。
图8.10 COURSE表中最早和最晚考试课程的考试时间
可见,返回结果的数据类型与该列定义的数据类型相同。
注意
确定列中的最大值(最小值)时,MAX( )(MIN( ))函数忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则MAX( )/MIN( )函数将返回NULL值。
8.2.4 均值函数——AVG()
函数AVG()用于计算一列中数据值的平均值。语法如下。
SELECT AVG (column_name)
FROM table_name
说明:AVG()函数的执行过程实际上是将一列中的值加起来,再将其和除以非NULL值的数目。所以,与SUM( )函数一样,AVG()函数只能作用于数值型数据,即列column_name中的数据必须是数值型的。
实例11 AVG()函数的应用
从TEACHER表中查询所有教师的平均年龄。实例代码:
SELECT AVG (AGE) AS AVG_AGE
FROM TEACHER
运行结果如图8.11所示。
图8.11 TEACHER表中所有教师的平均年龄
在计算平均值时,AVG()函数将忽略NULL值。因此,如果要计算平均值的列中有NULL值,计算均值时,要特别注意。
实例12 AVG()函数对NULL值的处理
从TEACHER表中查询所有教师的平均工资。实例代码:
SELECT AVG (SAL) AS AVG_AGE1,SUM(SAL)/COUNT(*) AS AVG_AGE2,
SUM(SAL)/COUNT(SAL) AS AVG_AGE3
FROM TEACHER
运行结果如图8.12所示。
图8.12 TEACHER表中所有教师的平均工资
可以发现得到了不同的结果。实际上,“AVG (SAL)”与“SUM(SAL)/COUNT(SAL)”语句是等价的。因为AVG(SAL)语句的执行过程实际上是将SAL列中的值加起来,再将其和(也就等价于SUM(SAL))除以非NULL值的数目(也就等价于COUNT(SAL))。而语句“SUM(SAL)/COUNT(*)”则不然,因为COUNT(*)返回的是表中所有记录的个数,而不管SAL列中的数值是否为NULL。
注意
AVG()函数在计算一列的平均值时,忽略NULL值。但是,如果在该列中,所有行的值都是NULL,则AVG()函数将返回NULL值。
如果不想对列中的所有值求平均,则可在WHERE子句中使用搜索条件来限制用于计算均值的行。
实例13 在WHERE子句中使用搜索条件来限制用于计算均值的行
从TEACHER表中查询所有计算机系教师的平均年龄。实例代码:
SELECT AVG (AGE) AS AVGCOMPUTER_AGE
FROM TEACHER
WHERE DNAME = '计算机'
运行结果如图8.13所示。
图8.13 TEACHER表中所有计算机系教师的平均年龄
当执行SELECT语句时,DBMS将表中的每行对WHERE子句中的搜索条件“DNAME = '计算机'”求值。只有那些搜索条件为True时,行中的AGE值才传到均值函数AVG (AGE)中。
当然,除了显示表中某列的平均值,还可用AVG()函数作为WHERE子句的一部分。与前面介绍的MAX()函数一样,不能直接用于WHERE子句,必须以子查询的形式。
实例14 AVG()函数作为WHERE子句中搜索条件的一部分
从TEACHER表中查询所有年龄高于平均年龄的教师的信息。实例代码:
SELECT *
FROM TEACHER
WHERE AGE >= (SELECT AVG (AGE) FROM TEACHER)
ORDER BY AGE
运行结果如图8.14所示。
图8.14 TEACHER表中所有年龄高于平均年龄的教师的信息
8.2.5 聚合分析的重值处理
前面介绍的5种聚合函数,可以作用于所选列中的所有数据(不管列中的数据是否有重置),也可以只对列中的非重值进行处理,即把重复的值只取一次进行聚合分析。当然,对于MAX()/MIN()函数来讲,重值处理意义不大。
可以使用ALL关键字指明对所选列中的所有数据进行处理,使用DISTINCT关键字指明对所选列中的非重值数据进行处理。以AVG()函数为例,语法如下。
SELECT AVG ([ALL/DISTINCT] column_name)
FROM table_name
说明:[ALL/DISTINCT]在缺省状态下,默认是ALL关键字,即不管是否有重值,处理所有数据。其他聚合函数的用法与此相同。
注意
Microsoft Access数据库不支持在聚合函数中使用DISTINCT关键字。
实例15 聚合分析的重值处理
从TEACHER表中查询工资SAL列中存在的所有记录数。实例代码:
SELECT COUNT(ALL SAL) AS ALLSAL_COUNT
FROM TEACHER
运行结果如图8.15所示。
图8.15 TEACHER表中工资SAL列中存在的所有记录数
当然,在代码中去除ALL关键字,也可以得到相同的结果。而如果从TEACHER表中,查询工资SAL列中存在的不同记录的数目,可采用如下代码。
SELECT COUNT(DISTINCT SAL) AS DISTINCTSAL_COUNT
FROM TEACHER
运行结果如图8.16所示。
图8.16 TEACHER表中SAL列存在的不同记录的数目
对比两个结果,使用DISTINCT关键字后,工资SAL列中的重值并没有列入统计的范围之内。另外还要强调一点,在所有5种聚合函数中,除了COUNT(*)函数外,其他的函数在计算过程中都忽略NULL值,即把NULL值的行排除在外,不进行分析。
8.2.6 聚合函数的组合使用
前面介绍的实例中,聚合函数都是单独使用的。聚合函数也可以组合使用,即在一条SELECT语句中,可以使用多个聚合函数。
实例16 使用多个聚合函数
如下面的代码:
SELECT COUNT(*) AS num_items,
MAX(SAL) AS max_sal,
Min(AGE) AS min_age,
SUM(SAL)/COUNT(SAL) AS avg_sal,
AVG(DISTINCT SAL) AS disavg_sal
FROM TEACHER
运行结果如图8.17所示。
图8.17 聚合函数的组合应用
该例在一条SELECT语句中,几乎用到了所有的聚合函数。其中num_items为TEACHER表所有记录的条目,max_sal为TEACHER表中记录的最高工资,min_age为TEACHER表中记录的最小年龄,avg_sal为所有TEACHER表中的工资记录的平均值,disavg_sal为TEACHER表中所有不同的工资记录的平均值。本回答被提问者采纳 参考技术B 聚合函数是用来做纵向运算的函数:
COUNT():统计指定列不为NULL的记录行数;
MAX():计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算;
MIN():计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算;
SUM():计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0;
AVG():计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0;
6.1 COUNT
当需要纵向统计时可以使用COUNT()。
查询emp表中记录数:
SELECT COUNT(*) AS cnt FROM emp;
查询emp表中有佣金的人数:
SELECT COUNT(comm) cnt FROM emp;
注意,因为count()函数中给出的是comm列,那么只统计comm列非NULL的行数。
查询emp表中月薪大于2500的人数:
SELECT COUNT(*) FROM emp
WHERE sal > 2500;
统计月薪与佣金之和大于2500元的人数:
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;
查询有佣金的人数,以及有领导的人数:
SELECT COUNT(comm), COUNT(mgr) FROM emp;
6.2 SUM和AVG
当需要纵向求和时使用sum()函数。
查询所有雇员月薪和:
SELECT SUM(sal) FROM emp;
查询所有雇员月薪和,以及所有雇员佣金和:
SELECT SUM(sal), SUM(comm) FROM emp;
查询所有雇员月薪+佣金和:
SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
统计所有员工平均工资:
SELECT SUM(sal), COUNT(sal) FROM emp;
或者
SELECT AVG(sal) FROM emp;
6.3 MAX和MIN
查询最高工资和最低工资:
SELECT MAX(sal), MIN(sal) FROM emp;
分组查询
分组查询
当需要分组查询时需要使用GROUP BY子句,例如查询每个部门的工资和,这说明要使用部分来分组。 参考技术C sum, avg, count, max, min 基本上就这了.
以上是关于sql 2005 聚合函数的主要内容,如果未能解决你的问题,请参考以下文章