HAVING vs WHERE
Erottakaa toisistaan HAVING (suodattaa ryhmiä) ja WHERE (suodattaa rivejä) ja käyttäkää molempia oikein samassa kyselyssä.
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 ordersWHERE- 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:
FROM— valitsee taulut ja tekee liitoksetWHERE— suodattaa rivitGROUP BY— muodostaa ryhmätHAVING— suodattaa ryhmätSELECT— valitsee sarakkeetORDER BY— lajitteleeLIMIT— 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 1MAliakset 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 / MySQLHAVING 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?
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
- COUNT, SUM, AVG, MIN, MAX
- GROUP BY yhdellä ja usealla sarakkeella
- HAVING vs WHERE
- Yleiset sudenkuopat: NULL-arvot aggregoinneissa