GROUP BY i HAVING
Aby zrozumieć do czego służą funkcje agregujące, wpierw musisz pojąć założenia grupowania w języku SQL. GROUP BY i HAVING służą do grupowanie danych a potem ustawienie warunku na jego wyniku. Przypomina to bardzo filtrowanie poprzez WHERE. Podstawową różnicą między nimi jest to, że WHERE filtruje wiersze przed grupowaniem i obliczeniami (decyduje, które wiersze wejdą do obliczeń funkcji agregujących), podczas gdy HAVING selekcjonuje wiersze już pogrupowane, po wykonaniu obliczeń. Dlatego klauzula WHERE nie musi zawierać funkcji agregujących, ponieważ nie miałoby to sensu, skoro dokonuje ona wstępnej selekcji danych, które dopiero wejdą do funkcji. Z drugiej strony, klauzula HAVING zawsze zawiera funkcje agregujące. Mówiąc wprost, możesz zastosować klauzulę HAVING bez funkcji, ale jest wtedy mniej efektywna niż WHERE z tym samym warunkiem.
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name HAVING aggregate_function(column_name) operator value
SELECT imię,nazwisko,sum(wartosc_zamowienia) FROM zamowienia GROUP BY imię,nazwisko HAVING SUM(zamowienia)>200
Popularne funkcje agregujące
SUM – zwraca sumę wszystkich wartości z podanej kolumny.
AVG – wylicza średnią wartość z kolumny podanej jako argument funkcji.
MIN – zwraca najmniejszą wartość kolumny, w przypadku kolumny składającej się z łańcuchów tekstowych porównywane litery na kolejnych pozycjach wg kodu ASCII.
MAX – zwraca największą wartość kolumny.
COUNT – zlicza liczbę wierszy wg zadanych kryteriów jako argumenty do funkcji.
Funkcje agregujące rzadko spotykane: VARIANCE (obliczanie wariancji), STDDEV (obliczanie odchylenia standardowego), CHECKSUM_AGG (sprawdzanie sumy kontrolnej).
Łączenie tabel poprzez JOIN
Najprostszym sposobem łączenia tabel w jeden z zbiór wynikowy jest skorzystanie z klauzuli WHERE. Dużo jednak bardziej eleganckim i jednocześnie dającym większe możliwości jest użycie słowa kluczowego JOIN. Składnia polecenia SELECT z klauzulą JOIN jest następująca:
SELECT * FROM table1 JOIN table2 ON condition...
Występuje kilka wersji klauzuli JOIN.
INNER JOIN – dana krotka zostanie uwzględniona wyłącznie w wypadku, gdy w drugiej tabeli występuje krotka (lub krotki), których wartość dla kolumn określonych w warunku jest taka sama. Klauzula INNER jest opcjonalna (tzn. klauzula JOIN bez modyfikatorów działa jak INNER JOIN).
SELECT * FROM osoby INNER JOIN zamowienia ON zamowienia.id_osoby=osoby.id
LEFT JOIN – dana krotka zostanie uwzględniona w wyniku, nawet jeżeli w drugiej tabeli nie będzie krotek, które mogłyby być z nią połączone (dla których były spełniony warunek ON…).
SELECT * FROM osoby LEFT JOIN zamowienia ON zamowienia.id_osoby=osoby.id
RIGHT JOIN – uwzględniane są krotki z drugiej tabeli, które nie posiadają odpowiedników wśród krotek tabeli pierwszej.
SELECT * FROM osoby RIGHT JOIN zamowienia ON zamowienia.id_osoby=osoby.id
FULL OUTER JOIN – pokaże wszystkie wyniki połączeń pomiędzy tabelami nawet jeśli jedna z stron będzie wskazywała na NULL.
SELECT * FROM osoby FULL OUTER JOIN zamowienia ON zamowienia.id_osoby=osoby.id
Wykonywanie połączeń poprzez JOIN wiąże się z rozumieniem idei relacji w bazach danych. Jeśli nie wiesz jak je tworzyć i po co one są, zachęcam do przeczytania tej notki: SQL #1: podstawy baz danych, relacje oraz klucze