SELECT COUNT(*) FROM table / SELECT COUNT(colunm) FROM table
SELECT COUNT(DISTINCT column) FROM table
SELECT AVG(colunm) FROM table
SELECT AVG( ISNULL(relaxTime,10) ) AS RelaxTime FROM table
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