SQL Server 入门查询(下)

聚合函数和分组的使用
聚合函数是按照一定的规则将多行数据汇总成一行的函数,MAX(),AVG()等等,对数据进行汇总前,还可以按照特定的列将数据进行分组 (GROUP BY),然后根据给定的条件进行筛选 (HAVING)

 

简单的聚合函数
简单聚合函数是那些拥有很直观将多行汇总成一行计算规则的函数,简单聚合函数包括 AVG,MAX,MIN,SUM,这些函数的参数都为数字类型

 

COUNT()
count()函数用来计算给定条件下所含有的行数

SELECT COUNT(*) FROM table / SELECT COUNT(colunm) FROM table

 

当COUNT(colunm)作用于特定的某一列时,NULL值是不会被计算在其中的。而COUNT(*)是计算了所有记录,包括NULL的数据
当我们只想计算不同数据的汇总,可以使用DISTINCT关键字来让每一列每个相同的值只有一个被计算在内
SELECT COUNT(DISTINCT column) FROM table

AVG(),SUM(),MAX(),MIN()
这几个函数除了功能不同,参数与用法几乎相同,所以这里只对AVG()进行解释
AVG()表示计算在选择范围内的汇总数据的平均值,NULL值不会被计算在内
SELECT AVG(colunm) FROM table 

如果在计算的时候我想要包含NULL值,并在当前查询中将NULL值用其他值来替代并参与汇总计算,使用ISNULL(column,value)
例如,我想获取每位员工的平均休息时长,如果没有休假时间,则按10个小时计算 (关系演算法)
SELECT  AVG( ISNULL(relaxTime,10) ) AS RelaxTime FROM table 

也可以使用DISTINCT关键字让简单聚合函数中每一个值唯一参与聚合汇总计算,可参考上面的COUNT()函数
关于SUM,MAX,MIN这些用法都一样就不做解释了

 

将聚合函数得到的值按照列进行分组
分组的概念为,使被分组的列唯一
SELECT name FROM test GROUP BY name 

得到以下结果     

 

为了更好的理解GROUP BY的过程,在初始表与结果表中间想象多一个虚拟表,用来表达GROUP BY的原理

 

GROUP BY name 就是找到name那一列,使name唯一,即具有相同name值的行,合并为一行

需要注意的是:

1.查询SQL语句后面跟的值,必须是包含在聚合函数里面或跟在GROUP BY子句后面,不然会出现下面错误提示

原因为,假如执行了SELECT * FROM test GROUP BY name ,那么返回的结果应该是上面的虚拟表3,可是id和number单元格中的内容是多个值的,而SQL SERVER又是基于关系数据库的关系,一条记录是不允许拥有多值的,所以执行就会报错。

2.那么对于id和number单元格具有多个数据的情况怎么办?答案是用聚合函数,上面有关聚合函数的作用已经清晰的介绍了,就是将多行数据合并为一行的作用

SELECT name , SUM(number) FROM test GROUP BY name

3.GROUP BY多个列怎么理解呢?

SELECT name , SUM(id) FROM test GROUP BY name , number

结果如下:

 

其过程为:

 

可以用以上的思想,取唯一的name值,再取唯一的number值,再通过聚合函数计算出id值。其实正统的逻辑思维为,根据每一列唯一的name值和每一列唯一的number值进行CROSS JOIN ,生成笛卡尔积表,再过滤掉在初始表中没有的记录,再根据聚合函数生成最终结果

对分组完成后d的数据集进行再次筛选

当分完组后可以对数据集进行再筛选,通过在GROUP BY后面添加HAVING子句,在某种意义上很像WHERE子句,HAVING子句后面不可以放SELECT查询的列别名。HAVING子句最强大的地方是可以是使用聚合函数作查询条件,比如:GROUP BY name HAVING COUNT(id)>1

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值