SQL Academy · Oppitunti

HAVING vs WHERE

Erottakaa toisistaan HAVING (suodattaa ryhmiä) ja WHERE (suodattaa rivejä) ja käyttäkää molempia oikein samassa kyselyssä.

Oppitunti 3/413 vaihetta

HAVING vs WHERE on ilmainen SQL Academy-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 Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Kaksi suodatusvaihetta

WHERE suodattaa yksittäisiä rivejä ENNEN ryhmittelyä. HAVING suodattaa ryhmiä aggregoinnin JÄLKEEN. Ne näyttävät samankaltaisilta, mutta toimivat eri vaiheissa.

WHERE-esimerkki

WHERE suodattaa käsittelemättömiä rivejä. Se ei voi käyttää aggregaattifunktioita:

-- Sum totals for rows where status is 'paid':
SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE status = 'paid'
GROUP BY user_id;

HAVING-esimerkki

HAVING suodattaa ryhmiä. Se voi viitata aggregaattifunktioihin:

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;     -- only users with ≥ 5 orders

WHERE- ja HAVING-lausekkeiden yhdistäminen

Molemmat voivat esiintyä samassa kyselyssä:

SELECT user_id, SUM(total) AS revenue
FROM orders
WHERE created_at >= NOW() - INTERVAL '90 days'
GROUP BY user_id
HAVING SUM(total) > 1000;

Älkää sijoittako aggregaattifunktioita WHERE-lausekkeeseen

Kyselysuunnittelija suorittaa WHERE-lausekkeen ennen ryhmittelyä — aggregaattifunktiot eivät ole vielä käytettävissä:

-- WRONG:
SELECT user_id, COUNT(*) FROM orders
WHERE COUNT(*) > 5         -- ERROR
GROUP BY user_id;

-- RIGHT — move to HAVING:
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING COUNT(*) > 5;

Siirtäkää predikaatit WHERE-lausekkeeseen aina kun mahdollista

WHERE suodattaa ennen ryhmittelyä, joten aggregointiin päätyy vähemmän rivejä. Käyttäkää HAVING-lauseketta vain asioihin, joita ei voi ilmaista WHERE-lausekkeella.

-- Slightly slower (filters after grouping):
SELECT user_id, COUNT(*) FROM orders
GROUP BY user_id
HAVING user_id IN (1,2,3);

-- Faster (filters before grouping):
SELECT user_id, COUNT(*) FROM orders
WHERE user_id IN (1,2,3)
GROUP BY user_id;

Looginen suoritusjärjestys

Käsitteellinen järjestys:

  1. FROM — valitsee taulut ja tekee liitokset
  2. WHERE — suodattaa rivit
  3. GROUP BY — muodostaa ryhmät
  4. HAVING — suodattaa ryhmät
  5. SELECT — valitsee sarakkeet
  6. ORDER BY — lajittelee
  7. LIMIT — valitsee ensimmäiset N riviä

HAVING ilman GROUP BY -lausetta

Voitte käyttää HAVING-lausetta ilman GROUP BY-lausetta — koko taulusta muodostuu yksi ryhmä:

SELECT SUM(total) FROM orders
HAVING SUM(total) > 1000000;       -- prints only if total over 1M

Aliakset HAVING-lausekkeessa

Jotkin tietokannat sallivat HAVING-lausekkeen viitata SELECT-aliaksiin; PostgreSQL ja MySQL sallivat sen, mutta SQL-standardi ei. Siirrettävin tapa on toistaa aggregaattifunktio:

SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5;       -- portable
-- HAVING order_count >= 5  -- works in PG / MySQL

HAVING useiden aggregaattifunktioiden kanssa

Käyttäkää HAVING-lausetta yhdistettyihin aggregaattiehtoihin:

SELECT user_id, COUNT(*) AS orders, SUM(total) AS revenue
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 5 AND SUM(total) > 1000;

Suorituskykyä koskeva huomautus

HAVING-lausekkeen aggregaattisuodatus ei voi käyttää indeksejä samalla tavalla kuin sarakkeen perusteella tehty WHERE-suodatus. Siirtäkää mahdolliset ehdot WHERE-lausekkeeseen.

Kertaus

WHERE = suodattaa rivejä. HAVING = suodattaa ryhmiä.

  • Käyttäkää aggregaattifunktioita vain HAVING-lausekkeessa, ei koskaan WHERE-lausekkeessa
  • Siirtäkää predikaatit WHERE-lausekkeeseen suorituskyvyn parantamiseksi
  • Käyttäkää molempia, kun se on tarpeen

Pikatarkistus

Haluatte käyttäjät, jotka ovat tehneet yli 10 tilausta. Millä lausekkeella se suodatetaan?

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
46
Oppitunnit
183

Usein kysytyt kysymykset

Onko oppitunti ”HAVING vs WHERE” ilmainen?

Kyllä – oppitunnin ”HAVING vs WHERE” 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 Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”HAVING vs WHERE”?

Erottakaa toisistaan HAVING (suodattaa ryhmiä) ja WHERE (suodattaa rivejä) ja käyttäkää molempia oikein samassa kyselyssä. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?

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

Kuinka kauan ”HAVING vs WHERE”-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 Academy-oppitunnilla?

Kyllä. Jokainen SQL Academy-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. COUNT, SUM, AVG, MIN, MAX
  2. GROUP BY yhdellä ja usealla sarakkeella
  3. HAVING vs WHERE
  4. Yleiset sudenkuopat: NULL-arvot aggregoinneissa
← Takaisin: SQL Academy