简单的聚合函数 简单聚合函数是那些拥有很直观将多行汇总成一行计算规则的函数;简单聚合函数包括 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