Funkcje agregujące: jak podsumować dane w SQL
Baza danych
W załączonych plikach znajdziesz bazę danych Uczniowie w formacie przeznaczonym dla programu LibreOffice Base (rozszerzenie .odb) oraz Microsoft Access (rozszerzenie .accdb). Pobierz odpowiedni plik i zapisz na dysku.
uczniowie.odb dla LibreOffice Base.uczniowie.accdb dla Microsoft Access.W wybranym programie otwórz odpowiednią bazę. Wykorzystaj widok projektu tabeli oraz widok relacji, aby poznać schemat bazy danych.
Podane dalej polecenia SQL wykonujemy po otwarciu projektu kwerendy w widoku SQL.
Funkcje agregujące
Język SQL zawiera zestaw użytecznych funkcji agregującychfunkcji agregujących, które służą do wykonywania obliczeń bądź innych operacji na grupach rekordów. Są to:
COUNT()– zwraca liczbę rekordów spełniających podane kryteria;AVG()– zwraca średnią wartość wyliczoną dla pól zawierających liczby;SUM()– oblicza sumę dla pól zawierających liczby;MIN()– zwraca wartość minimalną zapisaną we wskazanych polach liczbowych i tekstowych;MAX()– zwraca wartość maksymalną zapisaną we wskazanych polach liczbowych i tekstowych.
Funkcji agregujących możemy używać między innymi do:
wykonywania obliczeń na wynikach zwracanych przez inne klauzule,
liczenia zgrupowanych rekordów,
wyliczania średniej albo sumy wartości z wybranej kolumny,
znajdowania wartości skrajnych we wskazanej kolumnie.
Wykorzystamy przedstawione funkcje do przeanalizowania informacji z przykładowej bazy.
Na początku sprawdźmy, ile kobiet i ilu mężczyzn zostało zapisanych w bazie. Informację na temat płci znajdziemy w tabeli uczniowie – jest to pole typu BOOLEAN, czyli przechowujące wartość TRUE (PRAWDA, Tak) lub FALSE (FAŁSZ, Nie). W naszym przypadku wartość PRAWDA (Tak) oznacza płeć żeńską.
Zacznijmy od kwerendy zliczającej wszystkie rekordy:
Znak „*” jako argument funkcji COUNT() oznacza zliczanie wszystkich rekordów, w tym zawierających wartość NULL.
Wynikiem będzie liczba 156 oraz nagłówek pola COUNT(*) (LibreOffice Base) lub Expr1000 (Microsoft Access).
Do poprzedniego zapytania dodamy warunek, dzięki któremu z tabeli wybrane zostaną rekordy, w których pole plec będzie miało wartość PRAWDA:
Wynikiem będzie liczba 65 oraz nagłówek pola liczba_kobiet dzięki użyciu klauzuli AS, która pozwala podawać aliasy pól.
W zależności od systemu bazodanowego, a także od narzędzia, którego używamy do budowania zapytań, warunki nakładane na pola typu BOOLEAN można wyrażać w inny sposób, np.: plec = 1 (działa w LibreOffice Base) lub plec IS TRUE.
Zliczać można również tylko wybrane pola, co jest przydatne np. wtedy, kiedy szukamy wartości unikalnych. Wtedy używamy klauzuli DISTINCT:
Użycie klauzuli DISTINCT w LibreOffice Base:
Użycie klauzuli DISTINCT w Microsoft Access:
W Microsoft Access klauzula DISTINCT występuje w podzapytaniupodzapytaniu, którego wyniki stają się źródłem dla kwerendy zliczającej.
Wynikiem kwerendy będzie wartość 31, czyli liczba niepowtarzających się imion żeńskich zapisanych w tabeli.
Warunki służące do wskazania zliczanych wierszy można formułować nie tylko za pomocą klauzuli WHERE. Oto przykłady użycia instrukcji warunkowychinstrukcji warunkowych:
Użycie instrukcji CASE warunek THEN wartość_prawda END w LibreOffice Base:
Jeżeli warunek po klauzuli WHEN jest prawdziwy, zwracana jest podana wartość_prawda.
W programie Microsoft Access korzystamy z funkcji IIF lub SWITCH w podzapytaniu:
Ogólna składnia funkcji warunkowych dostępnych w Microsoft Access to: IIF (wyrażenie, wartość_prawda, wartość_fałsz) oraz SWITCH (wyrażenie, wartość_prawda). Jeżeli wyrażenie jest prawdziwe, zwracana jest podana wartość_prawda.
W powyższych kwerendach jako wartość_prawda możemy podawać dowolne wartości, które mogą być później zliczone.
Wszystkie podane kwerendy zwrócą wyniki: 65 i 91.
Informację o liczbie kobiet i mężczyzn można również uzyskać za pomocą klauzuli GROUP BY, która na początku grupuje rekordy (w tym wypadku według wartości prawda i fałsz), a później przekazuje je do funkcji agregującej:
Jeszcze innym sposobem uzyskania informacji dotyczącej liczby kobiet jest użycie funkcji SUM(). Ponieważ typ BOOLEAN jest podtypem liczbowym, możemy przekształcić go na liczbę i zsumować.
W LO Base:
W LO Base reprezentacją liczbową logicznej wartości TRUE jest wartość 1. Instrukcja CAST pozwala przekształcać typy danych na inne, o ile to możliwe. W tym wypadku typ BOOLEAN zamieniamy na liczbę całkowitą, tj. typ INT.
W MS Access:
W MS Access reprezentacją liczbową logicznej wartości TRUE jest wartość -1. Funkcja INT() jest specyficzna dla MS Access. W podanym przykładzie można ją pominąć, ponieważ instrukcja SUM(plec) dokonuje konwersji automatycznie. Funkcja ABS() zwraca wartość bezwzględną liczby.
Teraz spróbujmy się dowiedzieć, jakie są średnie wyniki egzaminów z różnych przedmiotów:
Po wykonaniu kwerendy może się okazać, że dokładność wyników (liczba cyfr po przecinku) znacznie przekracza nasze potrzeby. Możemy jednak w prosty sposób ograniczyć długość części ułamkowej – użyjemy w tym celu funkcji ROUND():
Oprócz wyniku średniego możemy wyświetlić wynik minimalny i maksymalny:
Dzięki funkcjom MIN() i MAX() wyszukamy też najlepsze i najgorsze oceny wśród uczniów wskazanej płci (w tym wypadku kobiet):
Klauzula GROUP BY
Chcemy dowiedzieć się, jaka jest średnia ocen z wybranego przedmiotu we wskazanej klasie. W wynikach kwerendy chcemy zobaczyć nazwę przedmiotu, nazwę klasy i średnią ocen. Zacznijmy od kwerendy wybierającej odpowiednie pola z różnych tabel:
W LibreOffice Base napiszemy:
lub:
Warunki złączeń w kwerendach wybierających dane z wielu tabel mogą być definiowane za pomocą klauzul JOIN lub WHERE.
W Microsoft Access składnia jest bardziej skomplikowana, musimy uwzględnić nawiasy po klauzuli FROM:
W powyższych kwerendach warto zauważyć, że pola zawierające nazwę przedmiotu i klasy mają taką samą nazwę, dlatego musieliśmy je poprzedzić nazwami tabel. Drugą ważną rzeczą jest uwzględnienie w warunkach złączeń tabeli uczniowie. Mimo że nie wybieramy z niej żadnego pola, tylko dzięki niej możemy odczytać oceny podanej klasy.
Kiedy mamy listę ocen, wystarczy je zgrupować według pól podanych w klauzuli SELECT, czyli nazwy przedmiotu i klasy, i użyć funkcji AVG() na polu ocena.
W LibreOffice Base:
W Microsoft Access:
Funkcja ROUND() zaokrągla podaną wartość do podanej liczby miejsc po przecinku, w tym wypadku dwóch. Wynik podanych kwerend to: polski, 3A, 3,5.
W zapytaniach grupujących dane pola, które wybieramy w klauzuli SELECT i które nie są objęte funkcjami agregującymi, muszą wystąpić również w klauzuli GROUP BY.
Słownik
funkcje umożliwiające wykonywanie obliczeń na grupach rekordów oraz wyszukiwanie i zliczanie rekordów spełniających określone warunki
instrukcja, która pozwala nakładać warunki na wybierane rekordy; w zależności od systemu bazodanowego można korzystać z następujących funkcji: CASE WHEN warunek1 THEN wynik1 ELSE wynik2 END (mySQL, LibreOffice Base), IFF (wyrażenie, wartość_jeżeli_prawda, wartość_jeżeli_fałsz), SWITCH (wyrażenie, wartość) (MicrosoftS Access)
zapytanie SELECT umieszczone wewnątrz innego zapytania SELECT, podzapytanie wykonywane w pierwszej kolejności, a jego wyniki są źródłem dla zewnętrznego zapytania