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 SQL 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 SQL Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs SQL 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 dataPoró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 2COUNT(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 2Wszystkie trzy formy razem
Pełny obraz dla naszej tabeli zawierającej 5 wierszy:
COUNT(*)= 5 — wierszeCOUNT(department)= 3 — wartości inne niż NULLCOUNT(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 2Typowe 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ówneCOUNT(*)— 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 jakCOUNT(*)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 equalSzybki 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ówneCOUNT(*)— 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 SQL Interview Prep, przejdź na CoddyKit PRO. Kurs SQL 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 SQL 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ąć SQL Interview Prep?
Nie wymagamy żadnego doświadczenia. SQL 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 SQL Interview Prep?
Tak. Każda lekcja SQL 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
- COUNT(*) a COUNT(column) i COUNT(DISTINCT)
- SUM i AVG z wartościami NULL
- MIN, MAX i agregowanie wartości nieliczbowych
- Agregaty bez GROUP BY