Wyobraź sobie... Masz mega długą listę zakupów z supermarketu. Chcesz policzyć, ile w sumie wydałeś kasy. Przecież nie będziesz tego sumować ręcznie, nie? A sprzedawcy mają już wszystko w bazie danych. Dlatego dostajesz końcowy paragon z poprawną sumą. Najprawdopodobniej gdzieś w ich apce pomaga im bohaterka dzisiejszego wykładu — funkcja SUM()! To funkcja agregująca, która pozwala sumować wartości w kolumnie typu liczbowego.
Składnia SUM()
Funkcja SUM() wygląda tak prosto, jak jej nazwa, ale rozłóżmy to na czynniki pierwsze:
SELECT SUM(kolumna)
FROM tabela;
Funkcja bierze wszystkie wartości w podanej kolumnie i sumuje je. Ale, powiedzmy sobie szczerze: nie ma tu żadnej magii z sumowaniem tekstów czy dat! Tylko liczby.
Przykłady użycia SUM()
Zacznijmy od prostego przykładu. Będziemy pracować z tabelą salaries, która przechowuje pensje pracowników:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 55000 |
| 4 | 75000 |
Przykład 1: Sumowanie wszystkich pensji
Chcesz się dowiedzieć, jaki jest całkowity fundusz wynagrodzeń w firmie. Tak to robisz:
SELECT SUM(salary) AS total_salary
FROM salaries;
Wynik:
| total_salary |
|---|
| 240000 |
Co tu się wydarzyło? PostgreSQL zsumował wszystkie wartości z kolumny salary (50000 + 60000 + 55000 + 75000) i zwrócił wynik w nowej kolumnie o nazwie total_salary.
Przykład 2: Sumowanie z warunkiem
Załóżmy, że chcesz poznać sumę pensji tylko tych pracowników, którzy zarabiają więcej niż 55 000. Przypomnijmy sobie nasz ulubiony operator WHERE:
SELECT SUM(salary) AS high_salary_total
FROM salaries
WHERE salary > 55000;
Wynik:
| high_salary_total |
|---|
| 135000 |
Co się tu wydarzyło? Najpierw PostgreSQL zastosował filtr WHERE salary > 55000, zostawiając tylko wiersze z pensjami 60000 i 75000. Potem zsumował te dwie pensje (60000 + 75000).
3. Cechy działania SUM()
Jak NULL wpływa na SUM()? Jak już widzieliśmy, NULL to "nic", i SUM() nie bierze go pod uwagę w obliczeniach. Spójrzmy na tabelę:
| employee_id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | NULL |
| 4 | 75000 |
Jeśli będziemy chcieli poznać całkowity fundusz wynagrodzeń:
SELECT SUM(salary) AS total_salary
FROM salaries;
Wynik:
| total_salary |
|---|
| 185000 |
Dlaczego "185000", a nie "NULL"? PostgreSQL po prostu ignoruje NULL przy liczeniu sumy.
Przykłady bardziej złożonych zapytań z SUM()
Przykład 1: Sumowanie i filtrowanie w jednym zapytaniu
Wyobraź sobie tabelę sales, która przechowuje dane o sprzedaży. Oto jej struktura:
| product_id | amount |
|---|---|
| 1 | 150 |
| 2 | 200 |
| 3 | NULL |
| 1 | 100 |
Chcesz poznać całkowitą sumę sprzedaży amount tylko dla pierwszego produktu product_id = 1:
SELECT SUM(amount) AS total_sales
FROM sales
WHERE product_id = 1;
Wynik:
| total_sales |
|---|
| 150 |
Przykład 2: Suma i dodatkowe obliczenia
Znowu pracujemy z tabelą salaries. Chcesz się dowiedzieć, o ile fundusz wynagrodzeń przekracza 200 000:
SELECT SUM(salary) - 200000 AS surplus
FROM salaries;
Wynik:
| surplus |
|---|
| 40000 |
Typowe błędy przy użyciu SUM()
Używanie SUM() do danych nieliczbowych: jeśli przypadkiem spróbujesz zsumować np. wartości tekstowe, dostaniesz błąd. Bądź czujny i sprawdzaj typy danych w swojej kolumnie.
Ignorowanie NULL: często początkujący zapominają o NULL i myślą, że bierze udział w obliczeniach. To może prowadzić do nieoczekiwanych wyników.
GO TO FULL VERSION