-
да. Неагрегирани колони са всяка колона, която не използва функция за агрегиране като
MAX
,COUNT
,SUM
,GROUP_CONCAT
и др. -
Колона
a
е функционално зависима от колонаb
ако стойността наb
предполага конкретна стойност наa
. Това обикновено означава, чеb
е уникален ключ за таблицата иa
е друга колона в тази таблица. -
Уникално определен от е същото като функционалната зависимост.
-
Алтернативата би била да се изброят всички неагрегирани колони в
GROUP BY
списък:GROUP BY a.Z, a.Y, a.X
.
Причината за всичко това е, че когато изберете колони, които не са в GROUP BY
списък, те ще идват от произволни редове в групираните редове. Това води до много често срещани грешки. Например често срещана грешка е да се пише:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
и очаквайте ip_address
да съдържа адреса на последното влизане за всеки потребител. Но всъщност ще съдържа всякакво от адресите, от които са влезли, а не този от реда с MAX(timestamp)
. Вижте SQL Изберете само редове с максимална стойност в колона
за правилния начин да направите това.
Изключението за функционална зависимост обикновено е полезно с съединения.
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
Тъй като user_id
е първичният ключ на users
таблица, той уникално определя user_name
, така че не е необходимо да го изброявате изрично в GROUP BY
.