Funkcja COUNT() to jedna z najpopularniejszych i najbardziej przydatnych funkcji agregujących w SQL. Jej główne zadanie — liczyć ilość wierszy w wynikach zapytania. Gdyby COUNT() była superbohaterem w świecie SQL, jej supermocą byłoby szybkie odpowiadanie na takie pytania jak:
- Ilu pracowników pracuje w firmie?
- Ilu studentów studiuje na każdym wydziale?
- Ile produktów zostało sprzedanych w ostatnim miesiącu?
Składnia COUNT() jest całkiem prosta:
COUNT(kolumna)
gdzie kolumna — to nazwa kolumny, której wiersze będą liczone. Ale są też inne warianty użycia, które zaraz ogarniemy w tym wykładzie.
Zacznijmy od najbardziej podstawowego użycia COUNT().
Wariant 1: Liczenie wszystkich wierszy za pomocą COUNT(*)
Kiedy chcesz policzyć każdy wiersz w tabeli, niezależnie od tego, czy są tam dane czy nie, używasz COUNT(*). Gwiazdka oznacza „wszystkie kolumny”.
Przykład: Mamy tabelę students z taką zawartością:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Wykonajmy takie zapytanie:
SELECT COUNT(*)
FROM students;
Wynik:
| count |
|---|
| 4 |
Funkcja COUNT(*) nie zwraca uwagi na NULL w poszczególnych kolumnach, bo po prostu liczy ilość wierszy w tabeli.
Wariant 2: Liczenie wierszy z istniejącymi wartościami w kolumnie COUNT(column)
A co jeśli chcemy policzyć tylko te wiersze, gdzie jest nie-NULL wartość w konkretnej kolumnie? Wtedy używamy COUNT(column).
Przykład: policzmy ilu studentów ma wpisane imię.
SELECT COUNT(name)
FROM students;
Wynik:
| count |
|---|
| 3 |
Widzisz różnicę? W tabeli są 4 wiersze, ale w jednym z nich kolumna name ma wartość NULL. Funkcja COUNT(column) ignoruje wiersze, gdzie wartość kolumny to NULL.
Porównanie COUNT(*) i COUNT(column)
No to czym się różnią te dwa warianty użycia funkcji: COUNT(*) i COUNT(column)?
COUNT(*)liczy wszystkie wiersze w tabeli, także te zNULLw dowolnej kolumnie.COUNT(column)liczy tylko te wiersze, gdzie w podanej kolumnie wartość nie jest NULL.
Przykładowa tabela:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
Zapytania:
-- Policz wszystkie wiersze.
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (wszystkie wiersze)
-- Policz tylko te wiersze, gdzie imię nie jest NULL.
SELECT COUNT(name) FROM students; -- 3 -- Liczymy wiersze z wpisanym imieniem
-- Policz tylko te wiersze, gdzie wiek nie jest NULL.
SELECT COUNT(age) FROM students; -- 3 -- Liczymy wiersze z wpisanym wiekiem
Wariant 3: Liczenie unikalnych wartości z COUNT(DISTINCT column)
Czasem trzeba policzyć tylko unikalne wartości w kolumnie. Na przykład chcemy wiedzieć, ile różnych wieków mają studenci. Tu przydaje się COUNT(DISTINCT column).
Przykład:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
Wynik:
| count |
|---|
| 3 |
Zwróć uwagę, że w tym przypadku DISTINCT ignoruje nie tylko duplikaty, ale też NULL.
Jeśli spróbujesz użyć DISTINCT razem z COUNT(*), dostaniesz błąd: DISTINCT można stosować tylko do konkretnych kolumn.
Przykłady użycia COUNT() w realnych zadaniach
Przykład 1. Liczenie ilości studentów
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
Wynik:
| total_students |
|---|
| 4 |
Przykład 2. Liczenie studentów ze znanym wiekiem
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
Wynik:
| students_with_age |
|---|
| 3 |
Przykład 3. Liczenie unikalnych wieków
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
Wynik:
| unique_ages |
|---|
| 2 |
Typowe błędy przy używaniu COUNT()
Oczekiwanie, że COUNT(column) policzy wszystkie wiersze, nawet jeśli są NULL.
To nieprawda: COUNT(column) ignoruje wiersze z NULL w podanej kolumnie.
Używanie COUNT(*) do liczenia unikalnych wartości.
Zamiast tego użyj COUNT(DISTINCT column).
Zapominalstwo przy liczeniu konkretnych danych z filtrowaniem.
Na przykład:
SELECT COUNT(*) FROM students WHERE age > 20;
Tutaj dostaniesz tylko studentów starszych niż 20 lat, bo WHERE już filtruje wiersze przed liczeniem.
Te niuanse często prowadzą do błędów logicznych w zapytaniach. Uważaj na to!
GO TO FULL VERSION