Os designers do MySQL colocaram sua extensão não padrão em
GROUP BY
na tentativa de tornar o desenvolvimento mais fácil e certas consultas mais eficientes. Aqui está o raciocínio deles.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Existe um modo de servidor chamado
ONLY_FULL_GROUP_BY
que desativa as extensões não padrão. Você pode definir esse modo usando esta instrução. SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Aqui está uma citação dessa página, com ênfase adicionada.
SeONLY_FULL_GROUP_BY
está desabilitado, uma extensão do MySQL para o uso SQL padrão deGROUP BY
permite a lista de seleção,HAVING
condição ouORDER BY
list para se referir a colunas não agregadas, mesmo que as colunas não sejam funcionalmente dependentes deGROUP BY
colunas... Neste caso, o servidor é livre para escolher qualquer valor de cada grupo , portanto, a menos que sejam iguais, os valores escolhidos são não determinísticos , que provavelmente não é o que você deseja.
A palavra importante aqui é não determinístico. O que isso significa? Significa aleatório, mas pior. Se o servidor escolher valores aleatórios, isso significa que ele retornará valores diferentes em consultas diferentes, então você tem a chance de detectar o problema ao testar seu software. Mas não determinístico neste contexto significa que o servidor escolhe sempre o mesmo valor, até que não o faça.
Por que ele pode alterar o valor que escolhe? Uma atualização do servidor é um dos motivos. Uma mudança no tamanho da tabela pode ser outra. A questão é que o servidor é livre para retornar qualquer valor que desejar.
Eu gostaria que as pessoas que estão aprendendo SQL recentemente configurassem isso
ONLY_FULL_GROUP_BY
modo; eles obteriam resultados muito mais previsíveis de suas consultas, e o servidor rejeitaria consultas não determinísticas.