Forberedelse til SQL-intervju · leksjon

COUNT(*) versus COUNT(column) versus COUNT(DISTINCT)

Det klassiske spørsmålet om hvordan hver COUNT-form behandler NULL-verdier og duplikater.

Leksjon 1 av 413 trinn

COUNT(*) versus COUNT(column) versus COUNT(DISTINCT) er en gratis leksjon i Forberedelse til SQL-intervju på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Forberedelse til SQL-intervju, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Spørsmålet du vil få

Hvis du skal på et SQL-intervju, kan du forvente dette i løpet av de første ti minuttene: Hva er forskjellen mellom COUNT(*), COUNT(column) og COUNT(DISTINCT column)?

Det virker trivielt, men intervjuere bruker det for å sjekke om du virkelig forstår hvordan aggregatfunksjoner behandler NULL-verdier og duplikater. Et selvsikkert og presist svar viser at du har skrevet reelle spørringer, ikke bare pugget syntaks.

I denne leksjonen bygger vi en solid mental modell, slik at du kan svare umiddelbart og forklare hvorfor.

COUNT(*) teller rader

COUNT(*) teller rader. Den ser ikke på noen kolonneverdier i det hele tatt, så NULL-verdier er irrelevante. Hvis tabellen har 100 rader, returnerer COUNT(*) 100, punktum.

Asterisken betyr ikke at kolonner multipliseres eller utvides her. Den er et spesialtoken som betyr «tell hver rad som oppfyller vilkårene». Dette er formen du bruker når spørsmålet ganske enkelt er «hvor mange poster?»

SELECT COUNT(*) AS total_rows
FROM employees;

Eksempeldata å resonnere ut fra

La oss forankre alt i én liten tabell. Tenk deg en employees-tabell med en department-kolonne som kan være NULL:

  • Alice, Salg
  • Bob, Salg
  • Carol, NULL
  • Dan, Utvikling
  • Eve, NULL

Det er 5 rader totalt. Tre rader har en avdelingsverdi (Salg, Salg, Utvikling), og to rader har NULL. Husk disse tallene; vi skal telle denne tabellen på tre forskjellige måter.

COUNT(column) hopper over NULL

COUNT(column) teller bare radene der kolonnen ikke er NULL. Den ignorerer NULL-verdier fullstendig.

For eksempeldataene våre returnerer COUNT(department) 3, ikke 5, fordi to avdelingsverdier er NULL. Dette er det viktigste faktumet i hele leksjonen: COUNT av en kolonne teller aldri NULL-verdier.

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

Sammenligning så langt

Side om side i den samme tabellen med 5 rader:

  • COUNT(*) = 5 (alle rader)
  • COUNT(department) = 3 (avdelinger som ikke er NULL)

Forskjellen mellom dem, 5 minus 3, er lik antallet NULL-avdelinger. Et nyttig intervjutriks: COUNT(*) - COUNT(col) gir antallet NULL-verdier i kolonnen uten at du trenger å skrive en egen WHERE-betingelse.

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

COUNT(DISTINCT column)

COUNT(DISTINCT column) teller antallet unike verdier som ikke er NULL. Den fjerner først duplikater, ignorerer deretter NULL og teller til slutt det som gjenstår.

I dataene våre er de unike avdelingsverdiene Salg og Utvikling, så COUNT(DISTINCT department) returnerer 2. De to NULL-verdiene teller ikke, og duplikatet Salg slås sammen til én.

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

Alle tre samlet

Hele bildet for tabellen med 5 rader:

  • COUNT(*) = 5 — rader
  • COUNT(department) = 3 — verdier som ikke er NULL
  • COUNT(DISTINCT department) = 2 — unike verdier som ikke er NULL

Hvis du kan gjengi denne rekkefølgen, først med NULL-håndtering og deretter med duplikathåndtering, har du forstått hele konseptet. Legg merke til at hver variant returnerer en verdi som er mindre enn eller lik den ovenfor.

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

En gjennomgang av en intervj variant

Intervjuere formulerer ofte spørsmålet litt mer utførlig: «Hvor mange ansatte er tilordnet en avdeling, og hvor mange unike avdelinger finnes?»

Den første delen er COUNT(department) (tilordnet betyr ikke NULL). Den andre delen er COUNT(DISTINCT department). Å gjenkjenne hvilken COUNT hver formulering tilsvarer, er nøyaktig ferdigheten som testes.

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

COUNT med en betingelse

Et vanlig oppfølgingsspørsmål er å bare telle rader som oppfyller en betingelse. Et ryddig og portabelt triks er å bruke COUNT over et CASE-uttrykk. Siden COUNT(column) hopper over NULL-verdier, lar du CASE returnere NULL for radene du vil utelate.

Her teller vi ansatte i Salg. CASE gir en verdi bare for salgsradene og NULL ellers, så COUNT teller bare disse.

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

Vanlige feil du bør unngå

Vær oppmerksom på disse fellene intervjuere legger ut:

  • Å anta at COUNT(column) er lik COUNT(*) — det gjelder bare når kolonnen ikke inneholder NULL-verdier.
  • Å tro at COUNT(DISTINCT col) inkluderer NULL som én unik verdi — det gjør den ikke.
  • Å skrive COUNT(1) i forventning om at NULL-verdier skal hoppes over — den oppfører seg som COUNT(*) og teller alle rader.

Nevn dette uoppfordret i et intervju for å vise dybdeforståelse.

COUNT(1) og COUNT(konstant)

Kandidater spør ofte hva som er raskest, COUNT(*) eller COUNT(1). Svaret er at de er semantisk identiske — begge teller hver rad uavhengig av NULL-verdier — og moderne optimaliseringsmotorer behandler dem likt, så det er ingen reell ytelsesforskjell.

Konstanten i COUNT(1) er aldri NULL, så ingen rader hoppes over. Velg COUNT(*) for tydelighet; det er den idiomatiske formen.

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

Hurtigsjekk

Test den mentale modellen din på eksempeltabellen.

Oppsummering

Nå kan du svare på det vanligste spørsmålet om aggregatfunksjoner:

  • COUNT(*) teller hver rad, inkludert NULL-verdier.
  • COUNT(column) teller bare verdier som ikke er NULL.
  • COUNT(DISTINCT column) teller unike verdier som ikke er NULL.
  • COUNT(*) - COUNT(col) gir antallet NULL-verdier uten ekstra arbeid.
  • COUNT(1) er lik COUNT(*) — ingen NULL-verdier hoppes over, og det er ingen hastighetsforskjell.

Si det kort og presist, og forklar hvorfor. Neste: hvordan SUM og AVG behandler NULL-verdier.

Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «COUNT(*) versus COUNT(column) versus COUNT(DISTINCT)» gratis?

Ja – hele teksten i «COUNT(*) versus COUNT(column) versus COUNT(DISTINCT)» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Forberedelse til SQL-intervju-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Forberedelse til SQL-intervju inneholder totalt 4 leksjoner.

Hva lærer jeg i «COUNT(*) versus COUNT(column) versus COUNT(DISTINCT)»?

Det klassiske spørsmålet om hvordan hver COUNT-form behandler NULL-verdier og duplikater. Du øver på Forberedelse til SQL-intervju med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Forberedelse til SQL-intervju?

Ingen tidligere erfaring er nødvendig. Forberedelse til SQL-intervju på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «COUNT(*) versus COUNT(column) versus COUNT(DISTINCT)»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Forberedelse til SQL-intervju-leksjonen?

Ja. Alle Forberedelse til SQL-intervju-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. COUNT(*) versus COUNT(column) versus COUNT(DISTINCT)
  2. SUM og AVG med NULL-verdier
  3. MIN, MAX og aggregering av ikke-numeriske verdier
  4. Aggregeringer uten GROUP BY
← Tilbake til Forberedelse til SQL-intervju