-
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 colunab
se o valor deb
implica 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 BY
list: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
.