SQL #3: Group by, having, funkcje agregujące oraz join

Group by i having

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.

Łą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

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

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

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 join

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

Może Ci się również spodoba

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *