0Pricing
Coding Interview Prep · Lekcja

COUNT(*) a COUNT(column) i COUNT(DISTINCT)

Klasyczne pytanie o sposób, w jaki poszczególne postacie COUNT traktują wartości NULL i duplikaty

COUNT(*) a COUNT(column) i COUNT(DISTINCT) to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Pytanie, które może zostać zadane

Jeśli przystępuje Pan/Pani do rozmowy kwalifikacyjnej dotyczącej SQL, proszę spodziewać się tego pytania w ciągu pierwszych dziesięciu minut: Jaka jest różnica między COUNT(*), COUNT(column) i COUNT(DISTINCT column)?

Wygląda ono banalnie, ale rekruterzy używają go, aby sprawdzić, czy naprawdę rozumie Pan/Pani sposób, w jaki agregaty traktują wartości NULL i duplikaty. Pewna i precyzyjna odpowiedź pokazuje, że ma Pan/Pani doświadczenie w pisaniu rzeczywistych zapytań, a nie tylko zapamiętanej składni.

W tej lekcji zbudujemy solidny model mentalny, dzięki któremu będzie Pan/Pani w stanie natychmiast odpowiedzieć i wyjaśnić dlaczego.

COUNT(*) zlicza wiersze

COUNT(*) zlicza wiersze. Nie analizuje w ogóle wartości żadnej kolumny, więc wartości NULL nie mają tu znaczenia. Jeśli tabela zawiera 100 wierszy, COUNT(*) zwraca 100 — bez wyjątków.

Gwiazdka nie oznacza tutaj mnożenia ani rozwijania kolumn. Jest specjalnym tokenem oznaczającym „zlicz każdy kwalifikujący się wiersz”. Tej formy należy użyć, gdy pytanie brzmi po prostu: „ile jest rekordów?”.

SELECT COUNT(*) AS total_rows
FROM employees;

Przykładowe dane do analizy

Oprzyjmy wszystkie wyjaśnienia na jednej małej tabeli. Wyobraźmy sobie tabelę employees z kolumną department, która może zawierać wartość NULL:

  • Alice, Sales
  • Bob, Sales
  • Carol, NULL
  • Dan, Engineering
  • Eve, NULL

Łącznie jest to 5 wierszy. W trzech wierszach znajduje się wartość działu (Sales, Sales, Engineering), a w dwóch wierszach jest NULL. Proszę zapamiętać te liczby — tę tabelę zliczymy na trzy różne sposoby.

COUNT(column) pomija wartości NULL

COUNT(column) zlicza tylko te wiersze, w których dana kolumna ma wartość inną niż NULL. Całkowicie pomija wartości NULL.

Dla naszych przykładowych danych COUNT(department) zwraca 3, a nie 5, ponieważ dwie wartości w kolumnie department to NULL. To najważniejszy fakt w całej lekcji: COUNT kolumny nigdy nie zlicza wartości NULL.

SELECT COUNT(department) AS depts_present
FROM employees;
-- returns 3 on our sample data

Porównanie obu form

Porównanie dla tej samej tabeli zawierającej 5 wierszy:

  • COUNT(*) = 5 (każdy wiersz)
  • COUNT(department) = 3 (działy inne niż NULL)

Różnica między nimi, czyli 5 minus 3, jest równa liczbie działów o wartości NULL. Przydatny trik na rozmowie kwalifikacyjnej: COUNT(*) - COUNT(col) podaje liczbę wartości NULL w kolumnie bez pisania osobnej klauzuli WHERE.

SELECT COUNT(*) - COUNT(department) AS null_departments
FROM employees;
-- returns 2

COUNT(DISTINCT column)

COUNT(DISTINCT column) zlicza liczbę unikalnych wartości innych niż NULL. Najpierw usuwa duplikaty, następnie pomija wartości NULL, a na końcu zlicza pozostałe wartości.

W naszych danych unikalne wartości kolumny department to Sales i Engineering, więc COUNT(DISTINCT department) zwraca 2. Dwie wartości NULL nie są zliczane, a powtarzająca się wartość Sales zostaje zredukowana do jednej.

SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 2

Wszystkie trzy formy razem

Pełny obraz dla naszej tabeli zawierającej 5 wierszy:

  • COUNT(*) = 5 — wiersze
  • COUNT(department) = 3 — wartości inne niż NULL
  • COUNT(DISTINCT department) = 2 — unikalne wartości inne niż NULL

Jeśli potrafi Pan/Pani wyrecytować tę kolejność — najpierw uwzględnienie NULL, a następnie duplikatów — zna Pan/Pani całą istotę tego zagadnienia. Proszę zauważyć, że każda forma zwraca wartość mniejszą lub równą wartości powyżej.

SELECT
  COUNT(*)                       AS rows_total,
  COUNT(department)              AS depts_present,
  COUNT(DISTINCT department)     AS unique_depts
FROM employees;

Przykładowe pytanie z rozmowy

Rekruterzy często przedstawiają to zagadnienie w bardziej praktycznej formie: „Ilu pracowników jest przypisanych do działu i ile istnieje unikalnych działów?”

Pierwsza część wymaga użycia COUNT(department) (przypisanie oznacza wartość inną niż NULL). Druga część wymaga użycia COUNT(DISTINCT department). Rozpoznanie, której formie COUNT odpowiada każde sformułowanie, jest dokładnie umiejętnością sprawdzaną w tym pytaniu.

SELECT
  COUNT(department)          AS assigned_employees,
  COUNT(DISTINCT department) AS distinct_departments
FROM employees;

COUNT z warunkiem

Ulubione pytanie dodatkowe: zliczyć tylko wiersze spełniające warunek. Czystym i przenośnym rozwiązaniem jest użycie COUNT dla wyrażenia CASE. Ponieważ COUNT(column) pomija wartości NULL, należy sprawić, aby CASE zwracało NULL dla wierszy, które chcemy wykluczyć.

W tym przykładzie zliczamy pracowników działu Sales. CASE zwraca wartość tylko dla wierszy dotyczących Sales, a w pozostałych przypadkach NULL, więc COUNT zlicza wyłącznie te wiersze.

SELECT
  COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count
FROM employees;
-- returns 2

Typowe błędy, których należy unikać

Proszę uważać na następujące pułapki zastawiane przez rekruterów:

  • Założenie, że COUNT(column) jest równe COUNT(*) — jest tak tylko wtedy, gdy kolumna nie zawiera żadnych wartości NULL.
  • Przekonanie, że COUNT(DISTINCT col) uwzględnia NULL jako jedną unikalną wartość — tak nie jest.
  • Użycie COUNT(1) z oczekiwaniem, że pominie wartości NULL — działa ono tak jak COUNT(*) i zlicza wszystkie wiersze.

Proszę wspomnieć o tym z wyprzedzeniem podczas rozmowy kwalifikacyjnej, aby pokazać pełne zrozumienie tematu.

COUNT(1) i COUNT(constant)

Kandydaci często pytają, co jest szybsze: COUNT(*) czy COUNT(1). Odpowiedź brzmi: są semantycznie identyczne — oba zliczają każdy wiersz niezależnie od wartości NULL — a współczesne optymalizatory traktują je tak samo, więc w praktyce nie ma między nimi różnicy wydajności.

Stała wewnątrz COUNT(1) nigdy nie ma wartości NULL, więc żaden wiersz nie jest pomijany. Dla czytelności proszę preferować COUNT(*) — jest to forma idiomatyczna.

SELECT COUNT(*) AS a, COUNT(1) AS b
FROM employees;
-- a and b are always equal

Szybki test

Sprawdźmy Państwa model mentalny na przykładowej tabeli.

Podsumowanie

Znają już Państwo odpowiedź na jedno z najczęściej zadawanych pytań dotyczących agregatów:

  • COUNT(*) zlicza każdy wiersz, włącznie z wartościami NULL.
  • COUNT(column) zlicza wyłącznie wartości inne niż NULL.
  • COUNT(DISTINCT column) zlicza unikalne wartości inne niż NULL.
  • COUNT(*) - COUNT(col) bezpośrednio podaje liczbę wartości NULL.
  • COUNT(1) jest równe COUNT(*) — nie pomija wartości NULL i nie różni się szybkością.

Proszę odpowiadać zwięźle i uzasadniać odpowiedź. Następnie omówimy sposób, w jaki SUM i AVG obsługują wartości NULL.

Często zadawane pytania

Czy lekcja „COUNT(*) a COUNT(column) i COUNT(DISTINCT)” jest bezpłatna?

Tak — pełny tekst „COUNT(*) a COUNT(column) i COUNT(DISTINCT)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „COUNT(*) a COUNT(column) i COUNT(DISTINCT)”?

Klasyczne pytanie o sposób, w jaki poszczególne postacie COUNT traktują wartości NULL i duplikaty Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „COUNT(*) a COUNT(column) i COUNT(DISTINCT)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?

Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. COUNT(*) a COUNT(column) i COUNT(DISTINCT)
  2. SUM i AVG z wartościami NULL
  3. MIN, MAX i agregowanie wartości nieliczbowych
  4. Agregaty bez GROUP BY
← Powrót do Coding Interview Prep