具有非聚合函数的GROUP BY子句

时间:2014-03-19 08:18:35

标签: mysql

为什么mysql允许使用带有GROUP BY子句的非聚合函数?

例如,此查询可以正常工作:

SELECT col, CHAR_LENGTH(col) FROM table
GROUP BY col

可以接受使用这样的查询吗?

3 个答案:

答案 0 :(得分:1)

有时候是完全可以接受的。您使用更标准的SQL编写的查询类似于:

SELECT col, CHAR_LENGTH(col)
FROM (SELECT col FROM table GROUP BY col) c

或作为:

SELECT col, MAX(CHAR_LENGTH(col))
FROM table
GROUP BY col

使用非聚合函数可以稍微简化查询,但查询会更难阅读。

当您确定所有非聚合列共享相同的值时,它也可能很有用:

SELECT id, name, surname
FROM table
GROUP BY id
HAVING COUNT(*)=1

或当您需要返回哪个值无关紧要时:

SELECT id, name
FROM table
GROUP BY id

将返回与该id相关联的单个名称(可能是遇到的第一个名称,但我们无法确定哪个是第一个,order by在这里没有帮助......)。请注意,如果要选择多个非聚合列:

SELECT id, name, surname
FROM table
GROUP BY id

我们无法保证返回的姓名和姓氏属于同一行。

我不想使用此扩展程序,除非您100%确定使用它的原因。

答案 1 :(得分:1)

MySQL有一些"改进"并尝试运行并返回无效查询的结果,例如像你的每个好的RDBMS应该抛出语法错误,但是MySQL会运行它,将结果按col分组并将随机选择的行的值放入第二列。

答案 2 :(得分:0)

如果我正确猜测你想做什么,DISTINCT是更好的选择:

SELECT DISTINCT col, CHAR_LENGTH(col) FROM table;

它更清楚地表明了读者你想要完成的事情。

Here是一个SQLFiddle。