当前位置:首页 » 编程语言 » sql的核心集合函数
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql的核心集合函数

发布时间: 2023-06-08 09:45:56

‘壹’ 如何利用sql Server 2012 使用聚合函数统计汇总

1.用SELECT语句对数据进行统计汇总
2.集合函数(聚合函数,统计函派团激数)
3.为了有效处理查询得到的数据集合,SQL Server提供了一系列统计函数.
4.这些函数可以实现数据集合和汇总:
avg ([ALL|DISTINCT]列名或猛) 求指定数字字段的平均值
sum ([ALL|DISTINCT]列名) 求指定数字字段的总和
max([ALL|DISTINCT]列名) 求指定数字字段中最大值
min ([ALL|DISTINCT]列名) 求指定数字字段中最小值
count([ALL|DISTINCT]列名) 求满足条件记录中指定字段不为空的记录个数尘袜!

‘贰’ 关于sql聚集函数的正确描述是什么

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

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

‘叁’ SQL语句中 聚合函数count()忽略空值么

SQL语句函数count(),如果括号中是列名称,是忽略空值NULL的,即返回列的值的数目,不包含NULL值。

COUNT函数,用于Excel中对给定数据集合或者单元格区域中数据的个数进行计数,其语法结构为COUNT(value1,value2, ...)。COUNT函数只能对数字数据进行统计,对于空单元格、逻辑值或者文本数据将被忽略,因此可以利用该函数来判断给定的单元格区域中是否包含空单元格。

(3)sql的核心集合函数扩展阅读:

如果参数是一个数组或引用,那么只统计数组或引用中的数字;数组中或引用的空单元格、逻辑值、文字或错误值都将忽略。具体如下:

如果参数为数字、日期或者代表数字的文本(例如,用引号引起的数字,如 "1"),则将被计算在内。

逻辑值和直接键入到参数列表中代表数字的文本被计算在内。

如果参数为错误值或不能转换为数字的文本,则不会被计算在内。

如果参数为数组或引用,则只计算数组或引用中数字的个数。不会计算数组或引用中的空单元格、逻辑值、文本或错误值。

‘肆’ SQL函数有哪些(SQL函数有哪些)

聚合函段升数:sum-求和

avg-求平均值

max-求最大值

min-求最小值

count-求记录数

当使用这些函数时,如果不使用groupby(分组友迅)这句,则握告老是对整个表做运算。加上分组子句,则在每个组的基础上运算。

‘伍’ 求SQL的全部函数!完整的加100分!

一.聚合函数
AVG 返回组中值的平均值。空值将被忽略
BINARY_CHECKSUM 返回对表中的行或表达式列表计算的二进制校验值。BINARY_CHECKSUM 可用于检测表中行的更改
CHECKSUM 返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引
CHECKSUM_AGG 返回组中值的校验值。空值将被忽略
COUNT 返回组中项目的数量
COUNT_BIG 返回组中项目的数量。COUNT_BIG 的使用与 COUNT 函数相似。它们之间的唯一差别是它们的返回值:COUNT_BIG 总是返回 bigint 数据类型值,而 COUNT 则总是返回 int 数据类型值
GROUPING "是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。
仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择列表中才允许分组"
MAX 返回表达式的最大值
MIN 返回表达式的最小值
SUM 返回表达式中所有值的和,或只返回 DISTINCT 值。SUM 只能用于数字列。空值将被忽略
STDEV 返回给定表达式中所有值的统计标准偏差
STDEVP 返回给定表达式中所有值的填充统计标准偏差
VAR 返回给定表达式中所有值的统计方差。
VARP 返回给定表达式中所有值的填充的统计方差。

二.数学函数
ABS 返回给定数字表达式的绝对值
ACOS 返回以弧度表示的角度值,该角度值的余弦为给定的 float 表达式;本函数亦称反余弦。
ASIN 返回以弧度表示的角度值,该角度值的正弦为给定的 float 表达式;亦称反正弦
ATAN 返回以弧度表示的角度值,该角度值的正切为给定的 float 表达式;亦称反正切
ATN2 返回以弧度表示的角度值,该角度值的正切介于两个给定的 float 表达式之间;亦称反正切
CEILING 返回大于或等于所给数字表达式的最小整数
COS 一个数学函数,返回给定表达式中给定角度(以弧度为单位)的三角余弦值
COT 一个数学函数,返回给定 float 表达式中指定角度(以弧度为单位)的三角余切值
DEGREES 当给出以弧度为单位的角度时,返回相应的以度数为单位的角度
EXP 返回所给的 float 表达式的指数值
FLOOR 返回小于或等于所给数字表达式的最大整数
LOG 返回给定 float 表达式的自然对数
LOG10 返回给定 float 表达式的以 10 为底的对数
PI 返回 PI 的常量值
POWER 返回给定表达式乘指定次方的值
RADIANS 对于在数字表达式中输入的度数值返回弧度值
RAND 返回 0 到1 之间的随机float 值
ROUND 返回数字表达式并四舍五入为指定的长度或精度
SIGN 返回给定表达式的正 (+1)、零 (0) 或负 (-1) 号
SIN 以近似数字 (float) 表达式返回给定角度(以弧度为单位)的三角正弦值
SQUARE 返回给定表达式的平方
SQRT 返回给定表达式的平方根
TAN 返回输入表达式的正切值
三.日期函数
DATEADD 在向指定日期加上一段时间的基础上,返回新的 datetime 值。
DATEDIFF 返回跨两个指定日期的日期和时间边界数
DATENAME 返回代表指定日期的指定日期部分的字符串
DATEPART 返回代表指定日期的指定日期部分的整数
DAY 返回代表指定日期的天的日期部分的整数
GETDATE 按 datetime 值的 Microsoft�0�3 SQL Server�6�4 标准内部格式返回当前系统日期和时间
GETUTCDATE 返回表示当前 UTC 时间(世界时间坐标或格林尼治标准时间)的 datetime 值
MONTH 返回代表指定日期月份的整数
YEAR 返回表示指定日期中的年份的整数
四.系统函数
APP_NAME 返回当前会话的应用程序名称(如果应用程序进行了设置)。
CASE 表达式 计算条件列表并返回多个可能结果表达式之一(详见PPT资料)
CAST 和 CONVERT 将某种数据类型的表达式显式转换为另一种数据类型(详见PPT资料)
COALESCE 返回其参数中第一个非空表达式
COLLATIONPROPERTY 返回给定排序规则的属性
CURRENT_TIMESTAMP 返回当前的日期和时间。等价于 GETDATE()
CURRENT_USER 返回当前的用户。价于 USER_NAME()

‘陆’ sql聚合函数有哪些

聚集函数
和大多数其它关系数据库产品一样,PostgreSQL 支持聚集函数。一个聚集函数从多个输入行中计算出一个结果。比如,我们有在一个行集合上计算 count(数目), sum(总和), avg(均值), max(最大值), min(最小值)的函数。

比如,我们可以用下面的语句找出所有低温中的最高温度:

SELECT max(temp_lo) FROM weather; max
-----
46
(1 row)如果我们想知道该读数发生在哪个城市,可能会用:

SELECT city FROM weather WHERE temp_lo = max(temp_lo); -- 错!不过这个方法不能运转,因为聚集函数 max 不能用于 WHERE 子句中。存在这个限制是因为 WHERE 子句决定哪些行可以进入聚集阶段;因此它必需在聚集函数之前计算。不过,我们可以用其它方法实现这个目的;这里我们使用子查询:

SELECT city FROM weather
WHERE temp_lo = (SELECT max(temp_lo) FROM weather); city
---------------
San Francisco
(1 row)这样做是可以的,因为子查询是一次独立的计算,它独立于外层查询计算自己的聚集。

聚集同样也常用于 GROUP BY 子句。比如,我们可以获取每个城市低温的最高值:

SELECT city, max(temp_lo)
FROM weather
GROUP BY city; city | max
---------------+-----
Hayward | 37
San Francisco | 46
(2 rows)这样每个城市一个输出。每个聚集结果都是在匹配该城市的行上面计算的。我们可以用 HAVING 过滤这些分组:

SELECT city, max(temp_lo)
FROM weather
GROUP BY city
HAVING max(temp_lo) < 40; city | max
---------+-----
Hayward | 37
(1 row)这样就只给出那些 temp_lo 值曾经有低于 40 度的城市。最后,如果我们只关心那些名字以"S"开头的城市,我们可以用:

SELECT city, max(temp_lo)
FROM weather
WHERE city LIKE 'S%'
GROUP BY city
HAVING max(temp_lo) < 40;语句中的 LIKE 执行模式匹配,在节9.7里有解释。

理解聚集和 SQL 的 WHERE 和 HAVING 子句之间的关系非常重要。WHERE 和 HAVING 的基本区别如下:WHERE 在分组和聚集计算之前选取输入行(它控制哪些行进入聚集计算),而 HAVING 在分组和聚集之后选取输出行。因此,WHERE 子句不能包含聚集函数;因为试图用聚集函数判断那些行将要输入给聚集运算是没有意义的。相反,HAVING 子句总是包含聚集函数。当然,你可以写不使用聚集的 HAVING 子句,但这样做没什么好处,因为同样的条件可以更有效地用于 WHERE 阶段。

在前面的例子里,我们可以在 WHERE 里应用城市名称限制,因为它不需要聚集。这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算。

‘柒’ SQL——聚集函数

聚集函数 是以值是一个集合(集或者多重集)为输入、返回单个值得函数。SQL提供了五个固有聚集函数。
平均值 :avg
最小值 :min
最大值 :max
总和 :sum
计数 :count

以上五个固有聚集函数都是属于基本聚集
示例:

其他基本聚集使用形式差不多。

如果希望将聚集函数作用在单个元组集上,也希望作用到一组元组集上,此时可以利用group by子句来实现。

group by 子句作用: 对给出的一个或多个属性来构造分组,将属性上取值相同的元组分到同一组中。

示例

值得注意的是, 当SQL查询使用分组的时候,需要保证出现在select语句中但没有被聚集的属性只能是出现在group by 子句中的那些属性。换句话说,任何 没有出现 在group by子句中的属性如果出现在select子句中的话,它 只能出现在聚集函数的内部 ,否则这样的查询就是错误的,例如:

不过令我哭笑不得是,呃……,竟然运行没有报错[捂脸.jpg],然后仔细观察了以下,原因是id是没有被聚集,所以是属于查询错误,
看下面的结果,类别biology的id只有10211,其实还有另外一个。在分组计算中只输出一个元组,这样是无法确定选择哪一个id作为输出,下一次运行结果id值可能为其他值。[如果你有什么新发现,望告知]

有时候限定分组条件比对元组限定条件更有用。比如我们只对工资超过15000某一个系感兴趣。该条件并不针对某个元组,而是针对group by子句构成的分组。即是说,having子句是在分组之后才生效的,可以使用聚集函数。例如:

注意: 与select子句的情况类似,任何出现在having子句中,但没有被聚集的属性必须出现在group by子句中,否则查询就被当成是错误的。

包含聚集、group by 或者having子句的查询的含义可通过下述操作序列定义:

1、根据from子句计算出一个关系

2、如果出现where子句,where子句的谓词将应用到from子句的结果上

3、如果出现group by子句,满足where子句的元组通过group by子句形成分组。如果没有
group by子句,满足where谓词的整个元组集被当做一个分组

4、如果出现having子句,他将应用到每个分组上;不满足having子句谓词的分组将被抛弃。

5、select子句利用剩下的分组产生出查询结果中的元组,即每个分组上应用聚集函数来得到单个关系元组

空值的出现对聚集运算带来了麻烦,例如下列句子:

当instructor关系有些元组在salary属性的值为空,则在查询待求和的值中就包含了空值。SQL标准并不认为总和本身为null,而是认为sum运算符应 忽略 输入中的null值(因为算术表达式如果有null,那么结果为null)。

所以,聚集函数根据以下原则处理空值:
除了count(*)外,所有的聚集函数都忽略输入集合中的空值。由于空值被忽略,可能会造成参加聚集函数的输入值集合为空集。规定空集的count运算值为0,其他所有聚集运算在输入为空集的情况下返回一个空值。

处理布尔值的聚集函数:some 和every。
从字面意义上就可以知道,some是只要满足其中任意一个条件即可,而every则是所有条件都要满足,比如说1=some(集合A),若A={1,2,3},则为真,若A={0,2,3}则为假,又如1>some(集合A),结果分别为假、真。
例如:

‘捌’ SQL有哪些函数

1.绝对值
SQL:select abs(-1) value
O:select abs(-1) value from al
2.取整(大)
S:select ceiling(-1.001) value
O:select ceil(-1.001) value from al
3.取整(小)
S:select floor(-1.001) value
O:select floor(-1.001) value from al
4.取整(截取)
S:select cast(-1.002 as int) value
O:select trunc(-1.002) value from al
5.四舍五入
S:select round(1.23456,4) value 1.23460
O:select round(1.23456,4) value from al 1.2346
6.e为底的幂
S:select Exp(1) value 2.7182818284590451
O:select Exp(1) value from al 2.71828182
7.取e为底的对数
S:select log(2.7182818284590451) value 1
O:select ln(2.7182818284590451) value from al; 1
8.取10为底对数
S:select log10(10) value 1
O:select log(10,10) value from al; 1
9.取平方
S:select SQUARE(4) value 16
O:select power(4,2) value from al 16
10.取平方根
S:select SQRT(4) value 2
O:select SQRT(4) value from al 2
11.求任意数为底的幂
S:select power(3,4) value 81
O:select power(3,4) value from al 81
12.取随机数
S:select rand() value
O:select sys.dbms_random.value(0,1) value from al;
13.取符号
S:select sign(-8) value -1
O:select sign(-8) value from al -1
----------数学函数
14.圆周率
S:SELECT PI() value 3.1415926535897931
O:不知道
15.sin,cos,tan 参数都以弧度为单位
例如:select sin(PI()/2) value 得到1(SQLServer)
16.Asin,Acos,Atan,Atan2 返回弧度
17.弧度角度互换(SQLServer,Oracle不知道)
DEGREES:弧度-〉角度
RADIANS:角度-〉弧度
---------数值间比较
18. 求集合最大值
S:select max(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select greatest(1,-2,4,3) value from al
19. 求集合最小值
S:select min(value) value from
(select 1 value
union
select -2 value
union
select 4 value
union
select 3 value)a
O:select least(1,-2,4,3) value from al
20.如何处理null值(F2中的null以10代替)
S:select F1,IsNull(F2,10) value from Tbl
O:select F1,nvl(F2,10) value from Tbl
--------数值间比较
21.求字符序号
S:select ascii('a') value
O:select ascii('a') value from al
22.从序号求字符
S:select char(97) value
O:select chr(97) value from al
23.连接
S:select '11'+'22'+'33' value
O:select CONCAT('11','22')||33 value from al
23.子串位置 --返回3
S:select CHARINDEX('s','sdsq',2) value
O:select INSTR('sdsq','s',2) value from al
23.模糊子串的位置 --返回2,参数去掉中间%则返回7
S:select patindex('%d%q%','sdsfasdqe') value
O:oracle没发现,但是instr可以通过第四霾问 刂瞥鱿执问?BR> select INSTR('sdsfasdqe','sd',1,2) value from al 返回6
24.求子串
S:select substring('abcd',2,2) value
O:select substr('abcd',2,2) value from al
25.子串代替 返回aijklmnef
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from al
26.子串全部替换
S:没发现
O:select Translate('fasdbfasegas','fa','我' ) value from al
27.长度
S:len,datalength
O:length
28.大小写转换 lower,upper
29.单词首字母大写
S:没发现
O:select INITCAP('abcd dsaf df') value from al
30.左补空格(LPAD的第一个参数为空格则同space函数)
S:select space(10)+'abcd' value
O:select LPAD('abcd',14) value from al
31.右补空格(RPAD的第一个参数为空格则同space函数)
S:select 'abcd'+space(10) value
O:select RPAD('abcd',14) value from al
32.删除空格
S:ltrim,rtrim
O:ltrim,rtrim,trim
33. 重复字符串
S:select REPLICATE('abcd',2) value
O:没发现
34.发音相似性比较(这两个单词返回值一样,发音相同)
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from al
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差
返回0-4,4为同音,1最高
--------------日期函数
35.系统时间
S:select getdate() value
O:select sysdate value from al
36.前后几日
直接与整数相加减
37.求日期
S:select convert(char(10),getdate(),20) value
O:select trunc(sysdate) value from al
select to_char(sysdate,'yyyy-mm-dd') value from al
38.求时间
S:select convert(char(8),getdate(),108) value
O:select to_char(sysdate,'hh24:mm:ss') value from al
39.取日期时间的其他部分
S:DATEPART 和 DATENAME 函数 (第一个参数决定)
O:to_char函数 第二个参数决定
参数---------------------------------下表需要补充
year yy, yyyy
quarter qq, q (季度)
month mm, m (m O无效)
dayofyear dy, y (O表星期)
day dd, d (d O无效)
week wk, ww (wk O无效)
weekday dw (O不清楚)
Hour hh,hh12,hh24 (hh12,hh24 S无效)
minute mi, n (n O无效)
second ss, s (s O无效)
millisecond ms (O无效)
----------------------------------------------
40.当月最后一天
S:不知道
O:select LAST_DAY(sysdate) value from al
41.本星期的某一天(比如星期日)
S:不知道
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;
42.字符串转时间
S:可以直接转或者select cast('2004-09-08'as datetime) value
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;
43.求两日期某一部分的差(比如秒)
S:select datediff(ss,getdate(),getdate()+12.3) value
O:直接用两个日期相减(比如d1-d2=12.3)
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;
44.根据差值求新的日期(比如分钟)
S:select dateadd(mi,8,getdate()) value
O:SELECT sysdate+8/60/24 vaule FROM DUAL;
45.求不同时区时间
S:不知道
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;
-----时区参数,北京在东8区应该是Ydt-------
AST ADT 大西洋标准时间
BST BDT 白令海标准时间
CST CDT 中部标准时间
EST EDT 东部标准时间
GMT 格林尼治标准时间
HST HDT 阿拉斯加—夏威夷标准时间
MST MDT 山区标准时间
NST 纽芬兰标准时间
PST PDT 太平洋标准时间
YST YDT YUKON标准时间
Oracle支持的字符函数和它们的Microsoft SQL Server等价函数:
函数 Oracle Microsoft SQL Server
把字符转换为ASCII ASCII ASCII
字串连接 CONCAT (expression + expression)
把ASCII转换为字符 CHR CHAR
返回字符串中的开始字符(左起) INSTR CHARINDEX
把字符转换为小写 LOWER LOWER
把字符转换为大写 UPPER UPPER
填充字符串的左边 LPAD N/A
清除开始的空白 LTRIM LTRIM
清除尾部的空白 RTRIM RTRIM
字符串中的起始模式(pattern) INSTR PATINDEX
多次重复字符串 RPAD REPLICATE
字符串的语音表示 SOUNDEX SOUNDEX
重复空格的字串 RPAD SPACE
从数字数据转换为字符数据 TO_CHAR STR
子串 SUBSTR SUBSTRING
替换字符 REPLACE STUFF
将字串中的每个词首字母大写 INITCAP N/A
翻译字符串 TRANSLATE N/A
字符串长度 LENGTH DATELENGTH or LEN
列表中最大的字符串 GREATEST N/A
列表中最小的字符串 LEAST N/A
如果为NULL则转换字串 NVL ISNULL
日期函数
函数 Oracle Microsoft SQL Server
日期相加 (date column +/- value) or
ADD_MONTHS DATEADD
两个日期的差 (date column +/- value) or
MONTHS_BETWEEN DATEDIFF
当前日期和时间 SYSDATE GETDATE()
一个月的最后一天 LAST_DAY N/A
时区转换 NEW_TIME N/A
日期后的第一个周日 NEXT_DAY N/A
代表日期的字符串 TO_CHAR DATENAME
代表日期的整数 TO_NUMBER
(TO_CHAR)) DATEPART
日期舍入 ROUND CONVERT
日期截断 TRUNC CONVERT
字符串转换为日期 TO_DATE CONVERT
如果为NULL则转换日期 NVL ISNULL
转换函数
函数 Oracle Microsoft SQL Server
数字转换为字符 TO_CHAR CONVERT
字符转换为数字 TO_NUMBER CONVERT
日期转换为字符 TO_CHAR CONVERT
字符转换为日期 TO_DATE CONVERT
16进制转换为2进制 HEX_TO_RAW CONVERT
2进制转换为16进制 RAW_TO_HEX CONVERT
其它行级别的函数
函数 Oracle Microsoft SQL Server
返回第一个非空表达式 DECODE COALESCE
当前序列值 CURRVAL N/A
下一个序列值 NEXTVAL N/A
如果exp1 = exp2, 返回null DECODE NULLIF
用户登录账号ID数字 UID SUSER_ID
用户登录名 USER SUSER_NAME
用户数据库ID数字 UID USER_ID
用户数据库名 USER USER_NAME
当前用户 CURRENT_USER CURRENT_USER
用户环境(audit trail) USERENV N/A
在CONNECT BY子句中的级别 LEVEL N/A
合计函数
函数 Oracle Microsoft SQL Server
Average AVG AVG
Count COUNT COUNT
Maximum MAX MAX
Minimum MIN MIN
Standard deviation STDDEV STDEV or STDEVP
Summation SUM SUM
Variance VARIANCE VAR or VARP
Oracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域:
EXTRACT(YEAR FROM 日期)