为什么mysql允许使用带有GROUP BY
子句的非聚合函数?
例如,此查询可以正常工作:
SELECT col, CHAR_LENGTH(col) FROM table
GROUP BY col
可以接受使用这样的查询吗?
答案 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。