SQL-työhaastatteluun valmistautuminen · Oppitunti

DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi

Milloin DISTINCT on oikea vastaus ja milloin haastattelija odottaa GROUP BY -lauseketta

Oppitunti 3/413 vaihetta

DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi on ilmainen SQL-työhaastatteluun valmistautuminen-oppitunti CoddyKitissä. Tämä on oppitunti 3/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 SQL-työhaastatteluun valmistautuminen-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.

Mitä DISTINCT tekee

DISTINCT poistaa päällekkäiset rivit. Haastatteluissa tarkistetaan erityisesti tämä: se toimii koko valitulla rivillä, ei vain yhdellä sarakkeella — joten SELECT DISTINCT a, b poistaa päällekkäisyydet (a, b)-pareittain.

SELECT DISTINCT department
FROM employees;

DISTINCT kattaa kaikki valitut sarakkeet

Kun sarakkeita on useita, DISTINCT säilyttää jokaisen yksilöllisen yhdistelmän — yhden rivin kutakin erilaista (department, job_title) -paria kohden. Yhden sarakkeen deduplikointiin ei ole standardin mukaista tapaa.

SELECT DISTINCT department, job_title
FROM employees;

Mitä GROUP BY tekee

GROUP BY yhdistää saman avaimen jakavat rivit yhdeksi riviksi ryhmää kohden. Pelkkä sarakkeen mukaan ryhmittely tuottaa saman tuloksen kuin DISTINCT kyseisessä sarakkeessa.

SELECT department
FROM employees
GROUP BY department;
-- equivalent to:
SELECT DISTINCT department
FROM employees;

Todellinen ero: aggregointi

Milloin ne siis eroavat toisistaan? Silloin, kun tarvitaan aggregaattia. GROUP BY voi laskea COUNT-, SUM- tai AVG-arvon ryhmittäin, mutta DISTINCT ei. Tarvitaanko yksilöllisiä rivejä? DISTINCT. Tarvitaanko ryhmäkohtainen mittari? GROUP BY.

SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

DISTINCT ei laske ryhmäkohtaisia määriä

DISTINCT-lausekkeeseen ei voi vain liittää laskentaa. Kun kysytään, "kuinka monta työntekijää kussakin osastossa on", oikea työkalu on aina GROUP BY yhdessä COUNT(*)-funktion kanssa — ei SELECT DISTINCT.

-- WRONG intent: this errors or returns one total row
-- SELECT DISTINCT department, COUNT(*) FROM employees;

-- RIGHT:
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;

COUNT(DISTINCT) yhdistää molemmat ideat

Suosittu yhdistelmä on COUNT(DISTINCT col), joka laskee yksilölliset arvot kussakin ryhmässä. Tässä DISTINCT on aggregaattifunktion sisällä ja vastaa kysymykseen "kuinka monta eri tehtävänimikettä kussakin osastossa on?"

SELECT department,
       COUNT(DISTINCT job_title) AS distinct_titles
FROM employees
GROUP BY department;

Yksilöllisten arvojen laskeminen kokonaisuutena

Ilman GROUP BY -lauseketta COUNT(DISTINCT col) laskee yksilölliset arvot koko taulusta — tämä vastaa selkeästi kysymykseen "kuinka monta eri osastoa meillä on?"

SELECT COUNT(DISTINCT department) AS n_departments
FROM employees;

-- equivalently, count the deduped subquery
SELECT COUNT(*)
FROM (SELECT DISTINCT department FROM employees) d;

Suorituskyky on usein sama

Kumpi on nopeampi, DISTINCT vai GROUP BY? Pelkän deduplikoinnin tapauksessa ne ovat yleensä yhtä tehokkaita — kyselyoptimoijat suunnittelevat ne samalla tavalla. Valitkaa käyttötarkoituksen mukaan: DISTINCT yksilöllisille riveille ja GROUP BY aggregointiin.

DISTINCT ja NULL

Miten DISTINCT käsittelee NULL-arvot? Se pitää kaikkia NULL-arvoja samanarvoisina, joten useat NULL-rivit yhdistyvät yhdeksi. GROUP BY toimii samoin — NULL-arvot muodostavat yhden ryhmän.

-- If manager_id has several NULLs, this returns one NULL row
SELECT DISTINCT manager_id
FROM employees;

Postgresin DISTINCT ON (bonus)

Bonuksena Postgres tarjoaa standardista poikkeavan DISTINCT ON (expr) -rakenteen, joka säilyttää ensimmäisen rivin kutakin avainta kohden ORDER BY -lausekkeen määrittämässä järjestyksessä. Siirrettävässä koodissa käytetään sen sijaan ROW_NUMBER()-funktiota.

-- Postgres only: latest order per customer
SELECT DISTINCT ON (customer_id) customer_id, order_id, order_date
FROM orders
ORDER BY customer_id, order_date DESC;

DISTINCT koskee koko SELECT-lauseketta, ei yhtä saraketta

Vielä yksi sudenkuoppa: DISTINCT toimii koko rivillä, joten SELECT DISTINCT customer_id, order_date ei palauta yhtä riviä asiakasta kohden. Käyttäkää siihen GROUP BY -lauseketta yhdessä MAX-funktion tai ikkunafunktion kanssa.

-- Does NOT give one row per customer
SELECT DISTINCT customer_id, order_date FROM orders;

-- One row per customer: latest order date
SELECT customer_id, MAX(order_date) AS last_order
FROM orders
GROUP BY customer_id;

Pikatarkistus

Valitkaa oikea työkalu.

Kertaus

Kertaus: DISTINCT poistaa päällekkäiset kokonaiset rivit, kun taas GROUP BY yhdistää rivit avaimen perusteella ja mahdollistaa aggregaatit. COUNT(DISTINCT col) laskee yksilölliset arvot, molemmat käsittelevät NULL-arvot yhtenä arvona, ja suorituskyky on yleensä sama.

Aloita maksutta

Opi SQL 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
30
Oppitunnit
120

Usein kysytyt kysymykset

Onko oppitunti ”DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi” ilmainen?

Kyllä – oppitunnin ”DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi” 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 SQL-työhaastatteluun valmistautuminen-kurssin, päivitä CoddyKit PROhon. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi”?

Milloin DISTINCT on oikea vastaus ja milloin haastattelija odottaa GROUP BY -lauseketta Harjoittelet SQL-työhaastatteluun valmistautuminen-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL-työhaastatteluun valmistautuminen-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin SQL-työhaastatteluun valmistautuminen-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi”-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ä SQL-työhaastatteluun valmistautuminen-oppitunnilla?

Kyllä. Jokainen SQL-työhaastatteluun valmistautuminen-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

  1. Sarakkeiden projisointi ja aliasten sudenkuopat
  2. Lasketut sarakkeet ja lausekkeiden prioriteetti
  3. DISTINCT vai GROUP BY yksikäsitteisyyden saavuttamiseksi
  4. CASE-lausekkeet SELECTissä
← Takaisin: SQL-työhaastatteluun valmistautuminen