-
Ja. Niet-geaggregeerde kolommen zijn kolommen die geen aggregatiefunctie gebruiken, zoals
MAX,COUNT,SUM,GROUP_CONCAT, enz. -
Kolom
ais functioneel afhankelijk van kolombals de waarde vanbimpliceert een bepaalde waarde vana. Dit betekent over het algemeen datbis een unieke sleutel voor de tabel, enais een andere kolom in die tabel. -
Uniek bepaald door is hetzelfde als functionele afhankelijkheid.
-
Het alternatief zou zijn om alle niet-geaggregeerde kolommen op te sommen in de
GROUP BYlijst:GROUP BY a.Z, a.Y, a.X.
De reden voor dit alles is dat wanneer u kolommen selecteert die niet in de GROUP BY lijst, komen ze uit willekeurige rijen in de gegroepeerde rijen. Dit leidt tot veel voorkomende fouten. Een veelgemaakte fout is bijvoorbeeld om te schrijven:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
en verwacht ip_address om het adres van de meest recente login voor elke gebruiker te bevatten. Maar het zal eigenlijk elke . bevatten van de adressen waarmee ze zich hebben aangemeld, niet die van de rij met MAX(timestamp) . Zie SQL Selecteer alleen rijen met maximale waarde in een kolom
voor de juiste manier om dat te doen.
De uitzondering voor functionele afhankelijkheid is meestal handig bij joins.
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
Sinds user_id is de primaire sleutel van de users tabel, bepaalt het op unieke wijze user_name , dus het is niet nodig om dat expliciet te vermelden in GROUP BY .