HAVING kontra WHERE
Filtrera före eller efter gruppering och se vilken sats som kan använda aggregeringen
HAVING kontra WHERE är en gratis lektion i Förberedelser inför SQL-intervjun på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Förberedelser inför SQL-intervjun, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Frågan ni kommer att få
'Vad är skillnaden mellan WHERE och HAVING?' är en av de vanligaste SQL-frågorna på anställningsintervjuer. Ett svagt svar säger att 'HAVING är till för aggregat'. Ett starkt svar förklarar när varje sats körs i frågans körningskedja.
Den tidpunkten är hela förklaringen: WHERE filtrerar rader före gruppering, medan HAVING filtrerar grupper efter aggregering.
Var de förekommer i körordningen
Repetera den logiska körordningen för en fråga:
FROM/JOIN→ bygger radmängdenWHERE→ filtrerar enskilda raderGROUP BY→ slår ihop rader till grupperHAVING→ filtrerar gruppernaSELECT→ projicerar kolumnerORDER BY→ sorterar
WHERE körs innan grupperna finns, medan HAVING körs efteråt. Därför kan HAVING se aggregat, men inte WHERE.
WHERE kan inte se aggregat
Eftersom WHERE körs före gruppering har den ännu inga aggregatvärden. Att skriva WHERE COUNT(*) > 5 är ett syntaxfel i alla databaser som följer standarden.
Intervjuare lägger in exakt den här raden för att kontrollera om ni förstår körningskedjan. Aggregatet existerar inte när WHERE utvärderas.
-- ERROR: aggregate not allowed in WHERE
SELECT department, COUNT(*)
FROM employees
WHERE COUNT(*) > 5
GROUP BY department;HAVING filtrerar grupperna
Flytta aggregatvillkoret till HAVING så fungerar det, eftersom HAVING körs efter att grupperna och deras aggregat har beräknats.
Tolka det som: 'gruppera de anställda och behåll sedan bara avdelningar vars antal överstiger fem.'
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Placera radfilter i WHERE
Det omvända misstaget är att filtrera råa rader i HAVING. Det ger ofta rätt svar men är långsammare och missvisande, eftersom rader som skulle ha sorterats bort först grupperas.
Tumregel: filtrera på ett råkolumnsvärde → WHERE. Filtrera på ett aggregat → HAVING. Om radfiltreringen görs tidigt minskar mängden data som grupperingen måste bearbeta.
-- Better: drop inactive rows BEFORE grouping
SELECT department, COUNT(*) AS headcount
FROM employees
WHERE status = 'active'
GROUP BY department
HAVING COUNT(*) > 5;Båda satserna tillsammans
En fullständig fråga använder ofta båda. WHERE begränsar raderna först; HAVING behåller därefter grupper som uppfyller villkoren. Att läsa uppifrån och ned motsvarar den logiska ordningen.
Genomgångsexempel: bland beställningar som lagts i år, hitta kunder som totalt har spenderat mer än 1000.
SELECT customer_id, SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2024-01-01'
GROUP BY customer_id
HAVING SUM(amount) > 1000;HAVING på icke-aggregerade kolumner
HAVING kan referera till en grupperingskolumn, inte bara aggregat. HAVING department = 'Sales' är tillåtet men meningslöst: filtret hör hemma i WHERE så att det körs tidigare.
Om en intervjuare visar en HAVING-sats som filtrerar en vanlig grupperad kolumn är den förväntade kommentaren: 'flytta den till WHERE för bättre effektivitet.'
-- Works but inefficient; prefer WHERE department = 'Sales'
SELECT department, COUNT(*)
FROM employees
GROUP BY department
HAVING department = 'Sales';HAVING utan GROUP BY
En subtil detalj: HAVING är tillåtet även utan GROUP BY. Hela tabellen blir en enda implicit grupp, och HAVING filtrerar den gruppen.
Om aggregatvillkoret är falskt erhålls noll rader; om det är sant erhålls en rad. Det är sällan användbart, men intervjuare frågar om det för att bekräfta att ni förstår konceptet med en implicit grupp.
-- Returns the count only if the table has > 100 rows
SELECT COUNT(*) AS total
FROM orders
HAVING COUNT(*) > 100;Kan HAVING använda ett SELECT-alias?
Precis som med aliasomfångstricket på andra ställen skiljer sig dialekterna åt. Postgres och MySQL låter HAVING referera till ett SELECT-alias, medan SQL Server och Oracle inte gör det.
Den portabla vanan är att upprepa aggregatuttrycket i HAVING. Det fungerar i alla motorer och undviker överraskningar i en intervju där flera databaser kan förekomma.
-- Portable: repeat the aggregate, do not rely on the alias
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region
HAVING SUM(amount) > 5000;Prestandaperspektivet
För att imponera bör ni koppla satserna till prestanda: WHERE minskar antalet rader som grupperingsmotorn måste läsa och kan använda index; HAVING körs på redan aggregerade grupper och kan därför inte minska kostnaden för grupperingen.
Det intervjuarna vill höra är: flytta varje filter så tidigt som möjligt. Endast villkor som verkligen beror på ett aggregat behöver ligga i HAVING.
Svaret på en mening
Memorera detta inför intervjun: 'WHERE filtrerar rader före gruppering och kan inte se aggregat; HAVING filtrerar grupper efter aggregering och är den enda sats som kan testa ett aggregatvärde.'
Följ upp med listan över körordningen, så har ni gett ett fullständigt svar som låter erfaret.
Snabbtest
Avgör vilken sats varje villkor hör hemma i.
Sammanfattning
WHERE: filtrerar rader före GROUP BY, inga aggregat tillåtna. HAVING: filtrerar grupper efter aggregering och är den enda platsen där ett aggregatvillkor är tillåtet.
- Placera filter på råkolumner i WHERE för bättre hastighet och indexanvändning.
- HAVING kan referera till grupperade kolumner, men bör inte användas för vanliga filter.
- HAVING fungerar utan GROUP BY på hela tabellens implicita grupp.
- Upprepa aggregatuttryck i HAVING för säkerhet mellan olika dialekter.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”HAVING kontra WHERE” gratis?
Ja – hela texten till ”HAVING kontra WHERE” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Förberedelser inför SQL-intervjun, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelser inför SQL-intervjun innehåller totalt 4 lektioner.
Vad lär jag mig i ”HAVING kontra WHERE”?
Filtrera före eller efter gruppering och se vilken sats som kan använda aggregeringen Ni övar på Förberedelser inför SQL-intervjun med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Förberedelser inför SQL-intervjun?
Du behöver inga förkunskaper. Utbildningen i Förberedelser inför SQL-intervjun på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”HAVING kontra WHERE”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Förberedelser inför SQL-intervjun-lektionen?
Ja. Varje Förberedelser inför SQL-intervjun-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- GROUP BY-regeln för kolumner i SELECT
- HAVING kontra WHERE
- Gruppera efter flera kolumner och uttryck
- Räkna och filtrera grupper