标题: SQL语言中统计函数后面不一定要跟GROUPBY分组,那什么情况下需要跟GROUP BY呢? [打印本页] 作者: 姬晓军 时间: 2013-7-11 14:15 标题: SQL语言中统计函数后面不一定要跟GROUPBY分组,那什么情况下需要跟GROUP BY呢? 另外这个实例:统计并显示女职工奖金的平均值select 性别,avg(奖金) as 平均奖金 from[Sheet5$] where 性别="女" group by 性别这里如果不输入group by 性别,会报错,是为什么?既然有了where 性别="女",那已经是对女的求平均奖金,为何还要group by 性别?请指教一下作者: 淡写轻描 时间: 2013-7-11 14:21
where是记录约束条件,GROUP BY是分组依据,两者不存在可比性。select 性别,avg(奖金) as 平均奖金 from[Sheet5$] where 性别="女" group by 性别复制代码GROUP BY性别的意思是,对记录按性别进行分组,若存在聚合函数,那么,聚合函数的统计依据GROUP BY子句列出的字段作为分组统计记录。WHERE 性别='女'只说明了返回的记录性别必须为女。以下情况必须使用GROUP BY子句:在SELECT后面列出的字段中,除了聚合函数外,还存在没有使用聚合函数的其他字段,那么,这些字段必须在GROUP BY子句中列出,若不列出,SQL就无法为这些字段进行分组,故无法运行。另外,使用插入常量的字段,不会影响GROUP BY子句对记录的分组,故插入常量的字段可以不用在GROUP BY中列出。如:SELECT 1 AS 插入常量,名称,MAX(金额) AS 最大值 FROM 表 GROUP BY 名称复制代码以下情况可以不用GROUP BY子句:使用子查询提取分组极值(包括最大、最小、平均值、首次出现、最后出现值等等):SELECT 名称,金额 FROM 表 AS 表1 WHEREEXISTS (SELECT 1 FROM 表 AS 表2 WHERE 表1.名称=表2.名称 HAVING MAX(金额)=表2.金额)复制代码此语句意思是:在名称相同的条件下,对金额进行比较。返回主查询的金额是子查询金额最大值的记录。对整个表的记录进行统计:SELECT MAX(金额) FROM 表复制代码此情况下是对整个表进行统计,也就是不存在分组,或者说按整个表进行分组,故不需要GROUP BY子句(类似哲理中的没有规律也是规律,套在这里既是不是分组也是分组)