-
да. Неагрегирани колони са всяка колона, която не използва функция за агрегиране като
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 .