Jeśli kiedykolwiek próbowałeś policzyć średnią ocenę z egzaminów albo np. średnią pensję w dziale, to już znasz pojęcie średniej arytmetycznej. W sumie tego uczą już w szkole. W SQL każde zadanie związane z obliczaniem średniej w zbiorze danych ogarniasz funkcją AVG().
Funkcja AVG() to funkcja agregująca, która liczy średnią arytmetyczną dla kolumny numerycznej. Sumuje wszystkie wartości w podanej kolumnie i dzieli przez ich ilość. Ignoruje NULL (i to ignorowanie, co ciekawe, ułatwia życie, ale o tym za chwilę).
Składnia AVG()
Zacznijmy od podstawowej składni:
SELECT AVG(kolumna)
FROM tabela;
Zwróć uwagę: tutaj kolumna to kolumna z wartościami numerycznymi, dla których chcesz znaleźć średnią.
Przykład 1: Średnia pensja pracowników
Wyobraź sobie, że mamy tabelę employees, gdzie są dane o pracownikach i ich pensjach:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | 60000 |
| 3 | Alex | 55000 |
| 4 | Anna | NULL |
| 5 | Dan | 52000 |
Proste zapytanie do policzenia średniej pensji:
SELECT AVG(salary) AS average_salary
FROM employees;
Wynik:
| average_salary |
|---|
| 54250 |
Jak to działa?
AVG()sumuje wszystkie pensje: 50000 + 60000 + 55000 + 52000 = 217000.- Dzieli sumę przez ilość nie-NULL wartości: 217000 / 4 = 54250.
Jak AVG() działa z NULL
Pewnie zauważyłeś, że przy liczeniu średniej pensji wartość NULL w kolumnie salary została zignorowana. To kluczowa cecha AVG(). Bierze pod uwagę tylko nie-NULL wartości.
Spróbujmy przykład:
SELECT AVG(NULL) AS result;
Wynik:
| result |
|---|
| NULL |
To jeszcze raz pokazuje, że AVG() ignoruje NULL. Ale jeśli cały zbiór danych to NULL, wynik będzie NULL.
Ale jeśli w tabeli zamiast NULL będzie 0, taki wynik nie zostanie zignorowany.
Tabela employees
| id | salary |
|---|---|
| 1 | 1000 |
| 2 | 0 |
| 3 | NULL |
| 4 | 2000 |
Zapytanie SQL:
SELECT AVG(salary) AS avg_salary
FROM employees;
Wynik:
| avg_salary |
|---|
| 1000 |
Dlaczego tak?
Bo AVG() policzy:
[(1000 + 0 + 2000) / 3 = 1000]
Wiersz z NULL jest ignorowany przy liczeniu średniej.
Przykład: Liczenie średniego wieku studentów
Teraz spójrzmy na tabelę students:
| id | name | age |
|---|---|---|
| 1 | Anna | 20 |
| 2 | Max | 22 |
| 3 | Maria | NULL |
| 4 | Otto | 21 |
Zapytanie:
SELECT AVG(age) AS average_age
FROM students;
Wynik:
| average_age |
|---|
| 21 |
AVG()ignoruje studentkę Maria, bo jej wiek to NULL.- Średnia liczona jest tak: (20 + 22 + 21) / 3 = 21.
Zaokrąglanie wyniku
Czasem wynik AVG() to liczba z kilkoma miejscami po przecinku.
Jeśli chcesz dostać zaokrągloną liczbę, użyj funkcji ROUND().
Tabela employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | NULL |
Zapytanie SQL
SELECT ROUND(AVG(salary), 2) AS rounded_average_salary
FROM employees;
Wynik
| rounded_average_salary |
|---|
| 52333.33 |
Wiersz z NULL jest pomijany, więc średnia liczona jest z trzech wartości.
Filtrowanie danych przed liczeniem AVG()
Jeśli chcesz policzyć średnią tylko dla wartości spełniających jakieś warunki, użyj WHERE.
Tabela employees
| id | salary |
|---|---|
| 1 | 50000 |
| 2 | 60000 |
| 3 | 47000 |
| 4 | 60000 |
| 5 | NULL |
Przykład: Znajdźmy średnią pensję pracowników, których id > 2.
SELECT AVG(salary) AS average_salary
FROM employees
WHERE id > 2;
Wynik
| average_salary |
|---|
| 53500 |
W liczeniu biorą udział tylko pensje z id = 3 i id = 4. Wiersz z NULL jest pomijany.
Przykład: Złożone zapytania z AVG()
Możesz łączyć funkcję AVG() z innymi funkcjami agregującymi i operatorami.
Załóżmy, że mamy tabelę sprzedaży sales:
| sale_id | product | quantity | price |
|---|---|---|---|
| 1 | Telefon | 2 | 500 |
| 2 | Laptop | 1 | 1500 |
| 3 | Tablet | 3 | 300 |
Zapytanie do policzenia średniej całkowitej wartości sprzedaży:
SELECT AVG(quantity * price) AS average_total_sale
FROM sales;
Wynik:
| averagetotalsale |
|---|
| 950 |
Życiowe tipy i typowe błędy
Praca z AVG() wymaga ostrożności, żeby nie popełnić typowych błędów:
NULL-wartości: czasem dziwi, czemu wynik jest mniejszy niż się spodziewasz. Pamiętaj, że AVG() pomija wiersze z NULL.
Mieszanie typów danych: jeśli w kolumnie są liczby i tekst (co samo w sobie jest słabą praktyką), AVG() wywali błąd.
GO TO FULL VERSION