-
Ja. Ikke-aggregerede kolonner er enhver kolonne, der ikke bruger en aggregeringsfunktion såsom
MAX
,COUNT
,SUM
,GROUP_CONCAT
osv. -
Kolonne
a
er funktionelt afhængig af kolonneb
hvis værdien af b
indebærer en bestemt værdi afa
. Dette betyder generelt, atb
er en unik nøgle til tabellen oga
er en anden kolonne i den tabel. -
Entydigt bestemt af er det samme som funktionel afhængighed.
-
Alternativet ville være at liste alle ikke-aggregerede kolonner i
GROUP BY
liste:GROUP BY a.Z, a.Y, a.X
.
Grunden til alt dette er, at når du vælger kolonner, der ikke er i GROUP BY
liste, vil de komme fra vilkårlige rækker i de grupperede rækker. Dette fører til mange almindelige fejl. For eksempel er en almindelig fejl at skrive:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
og forventer ip_address
til at indeholde adressen på det seneste login for hver bruger. Men den vil faktisk indeholde enhver af de adresser, de loggede ind fra, ikke den fra rækken med MAX(timestamp)
. Se SQL Vælg kun rækker med maksimal værdi på en kolonne
for den korrekte måde at gøre det på.
Den funktionelle afhængighedsundtagelse er typisk nyttig med 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
Siden user_id
er den primære nøgle for users
tabel, bestemmer den entydigt user_name
, så det er ikke nødvendigt at angive det eksplicit i GROUP BY
.