Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL - Selecionando uma coluna que não está em Group By


É verdade que esse recurso permite algumas consultas ambíguas e retorna silenciosamente um conjunto de resultados com um valor arbitrário selecionado dessa coluna. Na prática, tende a ser o valor da linha dentro do grupo que é armazenado fisicamente primeiro.

Essas consultas não são ambíguas se você escolher apenas colunas que são funcionalmente dependentes das colunas nos critérios GROUP BY. Em outras palavras, se pode haver apenas um valor distinto da coluna "ambígua" por valor que define o grupo, não há problema. Essa consulta seria ilegal no Microsoft SQL Server (e ANSI SQL), mesmo que não possa resultar logicamente em ambiguidade:
SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

Além disso, o MySQL tem um modo SQL para fazê-lo se comportar de acordo com o padrão:ONLY_FULL_GROUP_BY

FWIW, o SQLite também permite essas cláusulas GROUP BY ambíguas, mas escolhe o valor do último fila no grupo.

Pelo menos na versão que testei. O que significa ser arbitrário é que tanto o MySQL quanto o SQLite podem mudar sua implementação no futuro e ter um comportamento diferente. Portanto, você não deve confiar que o comportamento permanece do jeito que está atualmente em casos ambíguos como este. É melhor reescrever suas consultas para serem determinísticas e não ambíguas. É por isso que o MySQL 5.7 agora habilita ONLY_FULL_GROUP_BY por padrão.