-
Ja. Icke aggregerade kolumner är alla kolumner som inte använder en aggregeringsfunktion som
MAX
,COUNT
,SUM
,GROUP_CONCAT
, etc. -
Kolumn
a
är funktionellt beroende av kolumnb
om värdet påb
innebär ett särskilt värde påa
. Detta betyder i allmänhet attb
är en unik nyckel för tabellen ocha
är någon annan kolumn i den tabellen. -
Unikt bestämt av är detsamma som funktionellt beroende.
-
Alternativet skulle vara att lista alla icke aggregerade kolumner i
GROUP BY
lista:GROUP BY a.Z, a.Y, a.X
.
Anledningen till allt detta är att när du väljer kolumner som inte finns i GROUP BY
listan kommer de från godtyckliga rader i de grupperade raderna. Detta leder till många vanliga fel. Ett vanligt misstag är till exempel att skriva:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
och förvänta dig ip_address
för att innehålla adressen till den senaste inloggningen för varje användare. Men den kommer faktiskt att innehålla alla av adresserna de loggade in från, inte den från raden med MAX(timestamp)
. Se SQL Välj endast rader med maxvärde på en kolumn
för det korrekta sättet att göra det.
Undantaget för funktionellt beroende är vanligtvis användbart 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
Sedan user_id
är den primära nyckeln för users
tabell, bestämmer den unikt user_name
, så det är inte nödvändigt att lista det uttryckligen i GROUP BY
.