CodeGym /Kursy /SQL SELF /Liczenie ilości wierszy za pomocą COUNT() i...

Liczenie ilości wierszy za pomocą COUNT() i jego warianty

SQL SELF
Poziom 7 , Lekcja 1
Dostępny

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 z NULL w 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!

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION