-
Sim. Colunas não agregadas são quaisquer colunas que não usam uma função de agregação comoMAX,COUNT,SUM,GROUP_CONCAT, etc
-
Colunaaé funcionalmente dependente da colunabse o valor debimplica um valor específico dea. Isso geralmente significa quebé uma chave exclusiva para a tabela eaé alguma outra coluna nessa tabela.
-
Exclusivamente determinado por é o mesmo que dependência funcional.
-
A alternativa seria listar todas as colunas não agregadas noGROUP BYlist:GROUP BY a.Z, a.Y, a.X.
A razão para tudo isso é que quando você seleciona colunas que não estão no
GROUP BY list, eles virão de linhas arbitrárias nas linhas agrupadas. Isso leva a muitos erros comuns. Por exemplo, um erro comum é escrever:SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
e espere
ip_address para conter o endereço do login mais recente de cada usuário. Mas na verdade conterá qualquer dos endereços dos quais eles efetuaram login, não aquele da linha com MAX(timestamp) . Consulte SQL Selecione apenas linhas com valor máximo em uma coluna
para a maneira correta de fazer isso. A exceção de dependência funcional normalmente é útil com junções.
SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id
Desde
user_id é a chave primária dos users tabela, ele determina exclusivamente user_name , então não é necessário listar isso explicitamente em GROUP BY .