-
TAk. Kolumny niezagregowane to dowolne kolumny, które nie używają funkcji agregacji, takiej jak
MAX
,COUNT
,SUM
,GROUP_CONCAT
itp. -
Kolumna
a
jest funkcjonalnie zależny od kolumnyb
jeśli wartośćb
implikuje konkretną wartośća
. Ogólnie oznacza to, żeb
jest unikalnym kluczem dla tabeli, aa
to 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 BY
lista: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
.