-
Ja. Niet-geaggregeerde kolommen zijn kolommen die geen aggregatiefunctie gebruiken, zoals
MAX
,COUNT
,SUM
,GROUP_CONCAT
, enz. -
Kolom
a
is functioneel afhankelijk van kolomb
als de waarde vanb
impliceert een bepaalde waarde vana
. Dit betekent over het algemeen datb
is een unieke sleutel voor de tabel, ena
is 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 BY
lijst: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
.