解决SQL分组聚合函数问题

                                       SQL分组查询及聚集函数的使用

今天要做一个查询统计功能,一开始有点犯难,上午尝试大半天才写出统计sql语句,才发现自己sql分组查询及聚集函数没学好;其实就是group by子句和几个聚集函数,熟练使用统计功能很简单。在此总结下今天查询统计是用到的几个sql函数。

SQL聚集函数

sum函数 sum函数用于计算查询表中指定字段中所有 记录值的总和。 语法:sum(exp) 说明:该函数不计算包含Null 值的字段。

例:SELECT SUM(population) FROM bbc 这里的SUM作用在所有返回记录的 population字段上,结果就是该查询只返回 一个结果,即所有国家的总人口数。

avg函数 Avg函数是用来计算特定查询字段中的一组数值的 算术平均值(将全部值的总和除以值的数目)。 语法:avg(exp) 说明:该函数只能对数值类型的字段进行计算。 例:求所有雇员薪水的平均值。 SELECT AVG(emp_salary) FROM employee;

count函数 count函数是用来计算查询表中的记录数。 语法:count(exp) 说明:count函数不计算具有Null字段的记录,但如 果将exp设置为星号(*),则count函数将计算所有记 录的总量,包括有Null的字段的记录。Distinct短句可以取消指定列中的重复值 sql除了不允许对count(*)使用distinct,对其 余情况都能用distinct,但一般情况下是没有 必要用的,除非你觉得的确是需要用distinct。

min函数 min函数是用来从查询表中返回指定字段中 的最小值。 语法:min(exp)

max函数 max函数是用来从查询表中返回指定字段中 的最大值。 语法:max(exp)

GROUP BY子句

对记录的分组是通过关键字 GROUP BY 实现的, GROUP BY 后面跟着一个定义组的构成的属性列 表。 如果我们使用语句 GROUP BY A1,……, Ak 我们就把关系分成了组,这样当且仅当两条记录 在所有属性 A1,……, Ak 上的值达成一致,它们才 是同一组的。 SQL 允许我们把一个表里面的记录用GROUP BY 分成组。 然后上面描述的聚集操作符可以应用于 这些组上 (也就是说,聚集操作符的值不再是对 所有声明的列的值进行操作, 而是对一个组的所 有值进行操作。这样聚集函数是为每个组独立地 进行计算的。)

当在查询中没有使用GROUP BY子句时,数据库就把数据表 中的所有行为作为一个组来处理。通常情况下,我们并不希 望是这样的。多数用户都能理解组的概念,但在使用的时候 却很快就陷入 麻烦中。有一个技巧是:如果有一列在 GROUP BY子句中没有提到,就必须对它进行累计。换句话 说,就是必须对select中那些不包括在GROUP BY子句中的所有列使 用上面提到过的一个函数。

请注意如果要让一个使用 GROUP BY 和聚集操 作符的查询的结果有意义, 那么用于分组的属性 也必须出现在目标列表中。 所有没有在 GROUP BY 子句里面出现的属性都只能通过使用聚集函数 来选择。 否则就不会有唯一的数值与其它字段关 联. 还要注意的是在聚集上聚集是没有意义的,比如, AVG(MAX(sno)), 因为 SELECT 只做一个回合 的分组和聚集.你可以获得这样的结果, 方法是 使用临时表或者在 FROM 子句中使用一个子 SELECT 做第一个层次的聚集。

总结:

在带有group by 子句的查询语句中,在select 列表中指定的列要么是group by 子句中指定的列,要么包含聚组函数

查询语句的select group by ,having 子句是聚组函数唯一出现的地方,在where 子句中不能使用聚组函数。

当在gropu by 子句中使用having 子句时,查询结果中只返回满足having条件的组。在一个sql语句中可以有where子句和having子句。having where 子句类似,均用于设置限定条件。where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。

用到的其它函数:

1、CHARINDEX (<'substring_expression'>, <expression>)其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没有发现子串,则返回0 值。此函数不能用于TEXT 和IMAGE 数据类型。

2、CONVERT (<data_ type>[ length ], <expression> [, style])

1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。

2)length用于指定数据的长度,缺省值为30。

3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。

4)TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符,即CHAR或VARCHAR数据类型是最大长度。

5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为8000个字符。

6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。

7)BIT类型的转换把非零值转换为1,并仍以BIT类型存储。

8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示"+",以标识发生了这种截断。

9)用CONVERT() 函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME 数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。

 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值