SQL Academy · leksjon

HAVING kontra WHERE

Skill HAVING (filtrerer grupper) fra WHERE (filtrerer rader), og bruk begge riktig i samme spørring.

Leksjon 3 av 413 trinn

HAVING kontra WHERE er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 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 SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

To filtreringsstadier

WHERE filtrerer individuelle rader FØR gruppering. HAVING filtrerer grupper ETTER aggregering. De ser like ut, men brukes på ulike stadier.

WHERE-eksempel

WHERE filtrerer rådata i form av rader. Det kan ikke se aggregater:

-- 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-eksempel

HAVING filtrerer grupper. Det kan referere til aggregater:

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

Kombiner WHERE og HAVING

Begge kan brukes i samme spørring:

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

Ikke plasser aggregater i WHERE

Planleggeren kjører WHERE før grupperingen – aggregatene er ikke tilgjengelige ennå:

-- 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;

Flytt predikater til WHERE når det er mulig

WHERE filtrerer før grupperingen, slik at færre rader går inn i aggregeringen. Bruk bare HAVING for betingelser som ikke kan uttrykkes i WHERE.

-- 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;

Logisk kjøringsrekkefølge

Konseptuell rekkefølge:

  1. FROM – velg tabeller og utfør join
  2. WHERE – filtrer rader
  3. GROUP BY – lag grupper
  4. HAVING – filtrer grupper
  5. SELECT – projiser kolonner
  6. ORDER BY – sorter
  7. LIMIT – de N øverste

HAVING uten GROUP BY

De kan bruke HAVING uten GROUP BY – hele tabellen blir da én gruppe:

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

Alias i HAVING

Noen databaser lar HAVING referere til aliaser fra SELECT. PostgreSQL gjør det, MySQL gjør det, mens standard SQL ikke gjør det. Mest portabelt er å gjenta aggregatet:

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 med flere aggregater

Bruk HAVING for sammensatte aggregatbetingelser:

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

Ytelsesmerknad

Et aggregatfilter i HAVING kan ikke bruke indekser på samme måte som WHERE på en kolonne kan. Flytt det De kan, til WHERE.

Oppsummering

WHERE = filtrerer rader. HAVING = filtrerer grupper.

  • Aggregater skal bare brukes i HAVING, aldri i WHERE
  • Flytt predikater til WHERE for bedre ytelse
  • Bruk begge når det er nødvendig

Kort sjekk

De vil finne brukere som har lagt inn mer enn 10 bestillinger. Hvilken klausul filtrerer dette?

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

Ofte stilte spørsmål

Er leksjonen «HAVING kontra WHERE» gratis?

Ja – hele teksten i «HAVING kontra WHERE» 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 SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «HAVING kontra WHERE»?

Skill HAVING (filtrerer grupper) fra WHERE (filtrerer rader), og bruk begge riktig i samme spørring. Du øver på SQL Academy 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 SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy 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 3 av 4.

Hvor lang tid tar leksjonen «HAVING kontra WHERE»?

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 SQL Academy-leksjonen?

Ja. Alle SQL Academy-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, SUM, AVG, MIN, MAX
  2. GROUP BY med én eller flere kolonner
  3. HAVING kontra WHERE
  4. Vanlige fallgruver: NULL-verdier i aggregater
← Tilbake til SQL Academy