问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql 语句中那些是聚合函数?

发布网友 发布时间:2022-04-22 09:46

我来回答

4个回答

热心网友 时间:2023-10-30 19:14

常见聚合函数,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,

热心网友 时间:2023-10-30 19:15

一下内容纯属抄袭~,希望有点用~

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表中所有不同的工资记录的平均值。

热心网友 时间:2023-10-30 19:15

聚合函数是用来做纵向运算的函数:
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子句,例如查询每个部门的工资和,这说明要使用部分来分组。

热心网友 时间:2023-10-30 19:16

sum, avg, count, max, min 基本上就这了.
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
悲观的意思是什么悲观是什么意思 ...坐立不安的。还总想挠挠手呀、胳膊什么的。这是怎么回事啊?是一种... ...胳膊肘麻,有时会麻到感觉大拇指根部疼,食指也有点... ...入睡感觉左胳膊从手腕到肩膀酥溜溜的酸,睁开眼又好了,什么原因... 胳膊上麻溜溜的 像是有小疙瘩 还很痒 有点硬 少量蔗糖,食盐,食油,食醋分别倒入一定量水中,并用筷子不断搅拌,观察... 将食盐 蔗糖 泥土 植物油与水混合 英文会计的provision对应中文会计的哪个词啊? 双人旁一个直一个心念什么,什么意思 白瓷有隙是成语吗 SQL是否有用于字符串的聚合函数设有SUM 印尼现在女子还割礼吗? SQL 对字符串的聚合函数是什么? 如何在sql server的group by语句中聚合字符串字段 数据库SQL语言,字符串聚合 C语言字符串会聚 MySql SELECT 字符串聚合 印度的割礼是什么 到目前,印度还有割礼存在吗? 华为手机现在最新的型号是? 印度女性割礼是什么 电脑打不出来字,是电脑的问题还是键盘的问题 笔记本上面的DEL键在哪里,有没有可替代的键。 delete键在哪 联想笔记本电脑哪个是删除键 翅的部首、再查几画、读音、结构、组词(写两个) 笔记本上的删除键是什么 翅膀的翅的偏旁是什么 翅膀的是部首是什么? 笔记本电脑上面哪个键盘是删除键? 华为新机V9和P10同样搭载麒麟960,有什么不一样 我是女生妈妈说明天带我去割礼 什么是割礼? 疼吗?我应该去吗? access能不能实现字符串连接的聚合函数,类似于sum 如何对r中包含字符串变量的数据集进行K均值聚类 华为发布的新机是什么,价格参数。荣耀8何时上市 java字符串数组合并 怎么合并成一个数组? 华为手机有s型的吗 07-SQLSERVER聚合函数 python聚类分析可以用字符串吗 谁能给我个sql2000的连加字符串的聚集函数 ORACLE 多行字符串合并的问题 oracle 10g怎么实现 listagg功能 sql server 有类似 listagg 函数吗 和探探,陌陌类似的软件有哪些 之前有一个名字和陌陌差不多的社交软件叫什么名字? 有没有和陌陌一样的软件 涓什么意思?近义词和反义词是什么?英文翻译是什么? edge阅读模式打不开 和陌陌差不多类型的软件有哪些求教高分哦