-
Sì. Le colonne non aggregate sono qualsiasi colonna che non utilizza una funzione di aggregazione come
MAX
,COUNT
,SUM
,GROUP_CONCAT
, ecc. -
Colonna
a
dipende funzionalmente dalla colonnab
se il valore dib
implica un valore particolare dia
. Questo generalmente significa cheb
è una chiave univoca per la tabella ea
è un'altra colonna in quella tabella. -
Determinato in modo univoco da è lo stesso della dipendenza funzionale.
-
L'alternativa sarebbe elencare tutte le colonne non aggregate in
GROUP BY
elenco:GROUP BY a.Z, a.Y, a.X
.
Il motivo di tutto ciò è che quando selezioni colonne che non sono nel GROUP BY
list, proverranno da righe arbitrarie nelle righe raggruppate. Questo porta a molti errori comuni. Ad esempio, un errore comune è scrivere:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
e aspettati ip_address
per contenere l'indirizzo del login più recente per ciascun utente. Ma in realtà conterrà qualsiasi degli indirizzi da cui hanno effettuato l'accesso, non quello della riga con MAX(timestamp)
. Vedi SQL Seleziona solo le righe con valore massimo su una colonna
per il modo corretto di farlo.
L'eccezione di dipendenza funzionale è in genere utile con i join.
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
Da user_id
è la chiave primaria degli users
tabella, determina in modo univoco user_name
, quindi non è necessario elencarlo esplicitamente in GROUP BY
.