TI:WTBD/Agregacje

Transkrypt

TI:WTBD/Agregacje
TI:WTBD/Agregacje
W ,,zwykłym" zapytaniu (instrukcji SELECT) -- tzn. bez agregacji, każdy wiersz zbioru wynikowego
odpowiada jednemu wierszowi źródłowego złączenia. Nie zachodzi oczywiście związek odwrotny:
klauzula WHERE wybiera podzbiór wierszy źródłowego złączenia;
w zapytaniu SELECT DISTINCT .. ze zbioru wynikowego usunięte zostają powtórzenia.
W zapytaniu z agregacją, wiersze złączenia źródłowego (po uwzględnieniu klauzuli WHERE)
podzielone zostają na rozłączne grupy (których suma razem tworzy cały zbiór); każdy wiersz zbioru
wynikowego pochodzi od jednej z tych grup (różne wiersze wyniku zawsze odpowiadają różnym
grupom źródła). Definicję grupowania stanowi klazula GROUP BY:
SELECT wynik
FROM źródło_danych
WHERE warunek
GROUP BY wyrażenia_grupowania;
Każda grupa odpowiada innemu zbiorowi wartości wyrażeń_grupowania, które są ciągiem wyrażeń
zbudowanych według tych samych zasad, co inne wyrażenia (np. określające kolumny wyniku).
Do celów grupowania, wartości NULL uważa się za równe sobie.
Klauzulę GROUP BY stosuje się w połączeniu z funkcjami (wyrażeniami) agregującymi w definicji
wyniku. Wyrażenia agregujące tworzone są z udziałem funkcji, określonych dla grup wartości (lub
wierszy). Przykłady takich funkcji, to MAX, MIN, COUNT, SUM, AVG, GROUP_CONCAT. Nota bene
to w zasadzie wszystkie, jakie implementuje SQLite; inne systemy mają ich więcej (obliczających np.
wariancję, odchylenie standardowe itd.). Jednoargumentowe funkcje agregujące biorą za argument
wyrażenie (zbudowane zgodnie z ogólnymi regułami), i obliczają pewną wartość po zbiorze
elementów grupy.
Specjalne wyrażenie agregujące COUNT(*) liczy, z ilu wierszy składa się grupa. COUNT(X)
liczy, dla ilu wierszy wyrażenie X ma określoną wartość (nie NULL). COUNT(DISTINCT X)
liczy, ile różnych wartości X występuje wśród elementów grupy.
W szczególnym przypadku - gdy wyrażenie grupujące miałoby być stałą (powodując utworzenie
jednej grupy ze wszystkich wierszy źródłowych), klauzulę GROUP BY można pominąć (i zwykle się
pomija). Gdy brak tej klauzuli, sygnałem do zinterpretowania zapytania jako agregującego jest
obecność funkcji agregujących w wyniku.
Uwaga: w zapytaniu z agregacją nie powinno się używać w budowie wyniku wyrażeń, które nie są
stałe na grupach ani nie są wyrażeniami agregującymi. Niektóre implementacje SQL wprawdzie to
dopuszczają, ale wynik jest wtedy nieokreślony. Inne implementacje (np. Oracle) nie dopuszczają, by
w budowie wyniku użyte były wyrażenia odwołujące się do kolumn źródłowych, jeśli nie są funkcjami
wyrażeń grupowania ani wyrażeniami agregującymi.

Podobne dokumenty