/Agregacje

Z Brain-wiki

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.