-
TAk. Kolumny niezagregowane to dowolne kolumny, które nie używają funkcji agregacji, takiej jak
MAX,COUNT,SUM,GROUP_CONCATitp. -
Kolumna
ajest funkcjonalnie zależny od kolumnybjeśli wartośćbimplikuje konkretną wartośća. Ogólnie oznacza to, żebjest unikalnym kluczem dla tabeli, aato jakaś inna kolumna w tej tabeli. -
Wyjątkowo określony przez jest tym samym, co zależność funkcjonalna.
-
Alternatywą byłoby wyświetlenie listy wszystkich niezagregowanych kolumn w
GROUP BYlista:GROUP BY a.Z, a.Y, a.X.
Powodem tego wszystkiego jest to, że po wybraniu kolumn, które nie znajdują się w GROUP BY listy, będą pochodzić z dowolnych wierszy w zgrupowanych wierszach. Prowadzi to do wielu typowych błędów. Na przykład częstym błędem jest napisanie:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
i oczekuj ip_address zawierać adres ostatniego logowania dla każdego użytkownika. Ale w rzeczywistości będzie zawierać dowolne z adresów, z których się zalogowali, a nie z wiersza z MAX(timestamp) . Zobacz SQL Wybierz tylko wiersze z maksymalną wartością w kolumnie
we właściwy sposób, aby to zrobić.
Wyjątek zależności funkcjonalnej jest zazwyczaj przydatny w przypadku złączeń.
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
Od user_id jest podstawowym kluczem users tabeli, jednoznacznie określa user_name , więc nie ma potrzeby wymieniać tego wyraźnie w GROUP BY .