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

MySQL 5.7 &only_full_group_by


  1. Sim. Colunas não agregadas são quaisquer colunas que não usam uma função de agregação como MAX , COUNT , SUM , GROUP_CONCAT , etc

  2. Coluna a é funcionalmente dependente da coluna b se o valor de b implica um valor específico de a . Isso geralmente significa que b é uma chave exclusiva para a tabela e a é alguma outra coluna nessa tabela.

  3. Exclusivamente determinado por é o mesmo que dependência funcional.

  4. A alternativa seria listar todas as colunas não agregadas no GROUP 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 .