原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处
修改一下数据库中的age:
现在的需求是,统计一下每个年龄的数据各有多少个:
SELECT COUNT(id) '人数', age '年龄' FROM person GROUP BY age;
对没错,在mysql中,通过GROUP BY 对某个字段或者多个字段进行分组查询。
上面是分组统计,那么能否用分组查询数据呢:
SELECT * FROM person GROUP BY age;
很遗憾,上面这句是错的,
它报了这么个错:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mysqltest.person.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
说了这么一大堆,其实意思就是说要查询的字段不包含在被分组的字段中,换句话说,也就是要查询的字段必须从后面GROPU BY 中来选择,所以如果这句话改成这样就对了:
SELECT age FROM person GROUP BY age;
分组也是可以根据多个字段分组的,比如:
SELECT age FROM person GROUP BY age, name;
那么,既然分组的字段有个name,那就应该是可以查询name的:
SELECT age, name FROM person GROUP BY age, name;
当然,这个结果可能有些看不懂,修改一下数据库试试:
这次再运行,并且调换一下GRUOP BY 后面字段的顺序:
可以发现,如果是age在前面就主要以age来进行分组,然在此基础上再以name为基础再继续分组,如果是name在前面就主要以name来进行分组,然在此基础上再以age为基础再继续分组,
因此GROUP BY 的分组优先级也是从前往后的,至于为什么’三妖怪’,每次都只显示一条,是因为三条的age和name是一样的,他们算是一组,所以只显示一条。
说下我个人见解,我认为GROUP BY 大部分情况下用用来统计数据比较多,至于这个查询,我是没研究出有什么实际用途,知道的可以留言讨论。