Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Por que os comportamentos Group By do Mysql e Group by da Oracle são diferentes


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.

Se ONLY_FULL_GROUP_BY está desabilitado, uma extensão do MySQL para o uso SQL padrão de GROUP BY permite a lista de seleção, HAVING condição ou ORDER BY list para se referir a colunas não agregadas, mesmo que as colunas não sejam funcionalmente dependentes de GROUP 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.