日期:2014-05-16  浏览次数:20893 次

关于GROUP BY规定的问题
书上在使用GROUP BY时,要有一定的规则,其中有两条是:
(1)GRUOP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。
(2)除聚集计算语句以外,SELECT语句中的每个列都必须在GROUP BY子句中给出。

我有一个test表,有三个字段:name,sex,age
我写了这样一条语句:select name, sex, count(1) from test group by age;
这条语句执行成功了。

我的问题是:
(1)GROUP BY子句中的字段age,不是检索列。
和书中第一条规定冲突。
(2)GROUP BY子句中没有列出name和sex字段。
和书中第二条规定冲突。

这是怎么回事呢?是书上说的有问题吗?

------解决方案--------------------
select name, sex, count(1) from test 
group by name,sex;
------解决方案--------------------
不是,你的SQL语句不是标准的SQL语句,只不过MYSQL没有报错

select name, sex, count(1) from test group by name, sex;

or

select age, count(1) from test group by age;
------解决方案--------------------
书上说的是SQL标准,而对于不同的数据库都可能与SQL标准有一点出入,或者说是扩展。
这就是理论和实践,研究和生产的区别吧。
------解决方案--------------------
select name, sex, count(1) from test group by age;

这句话虽然语法对 但是完全不符合任何理解

select name, sex, count(1) from test group by name,sex; 这样才对
------解决方案--------------------
MYSQL 对标准语法进行了扩充,允许使用这个 group by, 不在GROUP BY中的字段则由MYSQL自行选取。