COUNT(*) vs COUNT(column) vs COUNT(DISTINCT)
Klassinen kysymys siitä, miten kukin COUNT-muoto käsittelee NULL-arvoja ja kaksoiskappaleita
COUNT(*) vs COUNT(column) vs COUNT(DISTINCT) on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Kysymys, joka teille esitetään
Jos osallistutte SQL-työhaastatteluun, odottakaa tätä kysymystä ensimmäisten kymmenen minuutin aikana: Mitä eroa on COUNT(*)-, COUNT(column)- ja COUNT(DISTINCT column) -funktioilla?
Kysymys vaikuttaa yksinkertaiselta, mutta haastattelijat käyttävät sitä tarkistaakseen, ymmärrättekö todella, miten aggregaattifunktiot käsittelevät NULL-arvoja ja duplikaatteja. Varmalta ja täsmälliseltä kuulostava vastaus osoittaa, että olette kirjoittaneet oikeita kyselyitä ettekä vain opetelleet syntaksia ulkoa.
Tässä oppitunnissa rakennamme vankan ajatusmallin, jotta voitte vastata heti ja selittää myös miksi.
COUNT(*) laskee rivit
COUNT(*) laskee rivit. Se ei tarkastele lainkaan minkään sarakkeen arvoja, joten NULL-arvoilla ei ole merkitystä. Jos taulussa on 100 riviä, COUNT(*) palauttaa tulokseksi 100, piste.
Tähtimerkki ei tässä tarkoita kertomista tai sarakkeiden laajentamista. Se on erikoismerkintä, joka tarkoittaa "laske jokainen ehtoon sopiva rivi". Tätä muotoa käytätte, kun kysymys on yksinkertaisesti "kuinka monta tietuetta?"
SELECT COUNT(*) AS total_rows
FROM employees;Esimerkkidata, jonka avulla päättelyä harjoitellaan
Perustetaan kaikki yhteen pieneen tauluun. Kuvitelkaa employees-taulu, jossa on NULL-arvoja salliva department-sarake:
- Alice, Myynti
- Bob, Myynti
- Carol, NULL
- Dan, Tuotekehitys
- Eve, NULL
Taulussa on yhteensä 5 riviä. Kolmella rivillä on department-arvo (Myynti, Myynti, Tuotekehitys) ja kahdella rivillä on NULL. Pitäkää nämä luvut mielessä; laskemme tämän taulun kolmella eri tavalla.
COUNT(column) ohittaa NULL-arvot
COUNT(column) laskee vain ne rivit, joissa kyseisen sarakkeen arvo on muu kuin NULL. Se ohittaa NULL-arvot kokonaan.
Esimerkkidatassamme COUNT(department) palauttaa tulokseksi 3, ei 5, koska kaksi department-arvoa on NULL. Tämä on koko oppitunnin tärkein asia: sarakkeen COUNT ei koskaan laske NULL-arvoja.
SELECT COUNT(department) AS depts_present
FROM employees;
-- returns 3 on our sample dataVertailu tähän asti
Rinnakkain samassa viiden rivin taulussa:
COUNT(*)= 5 (kaikki rivit)COUNT(department)= 3 (department-arvot, jotka eivät ole NULL)
Niiden erotus, 5 miinus 3, on NULL-arvoisten department-arvojen määrä. Kätevä haastatteluvinkki: COUNT(*) - COUNT(col) antaa sarakkeen NULL-arvojen määrän ilman erillistä WHERE-ehtoa.
SELECT COUNT(*) - COUNT(department) AS null_departments
FROM employees;
-- returns 2COUNT(DISTINCT column)
COUNT(DISTINCT column) laskee yksilöllisten, muiden kuin NULL-arvojen määrän. Se poistaa ensin duplikaatit, ohittaa sitten NULL-arvot ja laskee lopuksi jäljelle jäävät arvot.
Datassamme yksilölliset department-arvot ovat Myynti ja Tuotekehitys, joten COUNT(DISTINCT department) palauttaa tulokseksi 2. Kahta NULL-arvoa ei lasketa mukaan, ja toistuva Myynti lasketaan vain kerran.
SELECT COUNT(DISTINCT department) AS unique_depts
FROM employees;
-- returns 2Kaikki kolme yhdessä
Kokonaiskuva viiden rivin taulustamme:
COUNT(*)= 5 — riviäCOUNT(department)= 3 — arvoja, jotka eivät ole NULLCOUNT(DISTINCT department)= 2 — yksilöllisiä arvoja, jotka eivät ole NULL
Jos osaatte palauttaa mieleen tämän järjestyksen – ensin kaikki rivit, sitten ei-NULL-arvot ja lopuksi yksilölliset ei-NULL-arvot – hallitsette koko käsitteen. Huomatkaa, että jokainen muoto palauttaa arvon, joka on enintään sitä edeltävän muodon arvo.
SELECT
COUNT(*) AS rows_total,
COUNT(department) AS depts_present,
COUNT(DISTINCT department) AS unique_depts
FROM employees;Tyypillinen haastattelumuotoilu
Haastattelijat muotoilevat kysymyksen usein näin: "Kuinka moni työntekijä on määritetty osastolle, ja kuinka monta yksilöllistä osastoa on olemassa?"
Ensimmäiseen osaan vastaa COUNT(department) (määritetty tarkoittaa, että arvo ei ole NULL). Toiseen osaan vastaa COUNT(DISTINCT department). Juuri sitä taitoa testataan, että tunnistatte, mitä COUNT-funktiota kukin ilmaus tarkoittaa.
SELECT
COUNT(department) AS assigned_employees,
COUNT(DISTINCT department) AS distinct_departments
FROM employees;Ehdollinen COUNT
Yleinen jatkokysymys on: laske vain ehdon täyttävät rivit. Siisti ja siirrettävä ratkaisu on käyttää COUNT-funktiota CASE-lausekkeen kanssa. Koska COUNT(column) ohittaa NULL-arvot, palauttakaa CASE-lausekkeella NULL niille riveille, jotka haluatte jättää pois.
Tässä laskemme Myynnin työntekijät. CASE tuottaa arvon vain Myynti-riveille ja NULL-arvon muille riveille, joten COUNT laskee vain kyseiset rivit.
SELECT
COUNT(CASE WHEN department = 'Sales' THEN 1 END) AS sales_count
FROM employees;
-- returns 2Yleiset vältettävät virheet
Varokaa näitä ansoja, joita haastattelijat usein asettavat:
- Oletetaan, että
COUNT(column)on sama kuinCOUNT(*)— näin on vain, jos sarakkeessa ei ole lainkaan NULL-arvoja. - Luullaan, että
COUNT(DISTINCT col)laskee NULL-arvon yhdeksi yksilölliseksi arvoksi — näin ei ole. - Kirjoitetaan
COUNT(1)siinä uskossa, että se ohittaa NULL-arvot — se toimii kutenCOUNT(*)ja laskee kaikki rivit.
Tuokaa nämä asiat esiin oma-aloitteisesti haastattelussa osoittaaksenne ymmärtävänne aiheen syvällisesti.
COUNT(1) ja COUNT(constant)
Ehdokkaat kysyvät usein, kumpi on nopeampi, COUNT(*) vai COUNT(1). Vastaus: ne ovat semanttisesti identtisiä — kumpikin laskee kaikki rivit NULL-arvoista riippumatta — ja nykyaikaiset optimoijat käsittelevät niitä samalla tavalla, joten suorituskyvyssä ei käytännössä ole eroa.
COUNT(1)-funktion sisällä oleva vakio ei ole koskaan NULL, joten yhtäkään riviä ei ohiteta. Suosikaa selkeyden vuoksi muotoa COUNT(*); se on vakiintunut tapa.
SELECT COUNT(*) AS a, COUNT(1) AS b
FROM employees;
-- a and b are always equalPikatarkistus
Testatkaa ajatusmallianne esimerkkitaulun avulla.
Kertaus
Nyt hallitsette yhden yleisimmin kysytyistä aggregaattifunktioihin liittyvistä kysymyksistä:
COUNT(*)laskee jokaisen rivin, myös NULL-arvot sisältävät rivit.COUNT(column)laskee vain arvot, jotka eivät ole NULL.COUNT(DISTINCT column)laskee yksilölliset arvot, jotka eivät ole NULL.COUNT(*) - COUNT(col)antaa NULL-arvojen määrän ilman erillistä laskentaa.COUNT(1)on sama kuinCOUNT(*)— NULL-arvoja ei ohiteta eikä nopeuseroa ole.
Sanokaa tämä ytimekkäästi ja perustelkaa vastaus. Seuraavaksi käsittelemme sitä, miten SUM ja AVG käsittelevät NULL-arvoja.
Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 90
- Oppitunnit
- 360
Usein kysytyt kysymykset
Onko oppitunti ”COUNT(*) vs COUNT(column) vs COUNT(DISTINCT)” ilmainen?
Kyllä – oppitunnin ”COUNT(*) vs COUNT(column) vs COUNT(DISTINCT)” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”COUNT(*) vs COUNT(column) vs COUNT(DISTINCT)”?
Klassinen kysymys siitä, miten kukin COUNT-muoto käsittelee NULL-arvoja ja kaksoiskappaleita Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”COUNT(*) vs COUNT(column) vs COUNT(DISTINCT)”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?
Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- COUNT(*) vs COUNT(column) vs COUNT(DISTINCT)
- SUM ja AVG NULL-arvojen kanssa
- MIN, MAX ja ei-numeeristen arvojen yhdistäminen
- Koostefunktiot ilman GROUP BY -lauseketta