GROUP BY grupperer rækker, der deler en værdi, så aggregatfunktioner beregner per gruppe. HAVING filtrerer disse grupper (som WHERE, men for grupper/aggregater). Sammen er de kernerne i opsummering og analyse af data efter kategori.
GROUP BY — aggregat per gruppe
SELECT country, COUNT(*) AS user_count, AVG(age) AS avg_age
FROM users
GROUP BY country;
-- one result row PER country, with that country's count and average age
GROUP BY country kollapserer alle rækker for hvert land til én gruppe, og aggregatfunktioner (COUNT, AVG) beregner en værdi for hver gruppe. Du kan gruppere efter flere kolonner:
GROUP BY country, city -- a group per unique (country, city) combination
HAVING — filtrer grupperne
-- show only countries with MORE THAN 100 users
SELECT country, COUNT(*) AS user_count
FROM users
GROUP BY country
HAVING COUNT(*) > 100; -- filter on the AGGREGATE
HAVING filtrerer efter gruppering, på aggregatværdier — noget som WHERE ikke kan gøre (WHERE filtrerer individuelle rækker før gruppering).
WHERE vs HAVING — en vigtig skelnen
SELECT country, COUNT(*) AS cnt
FROM users
WHERE active = true -- WHERE: filter ROWS first (before grouping)
GROUP BY country
HAVING COUNT(*) > 100; -- HAVING: filter GROUPS after (on aggregates)
WHERE → filters individual ROWS, runs BEFORE grouping, can't use aggregates
HAVING → filters GROUPS, runs AFTER grouping, used WITH aggregates
→ Use WHERE to filter rows, HAVING to filter aggregated groups. (Filter with WHERE
first when possible — it's more efficient, reducing rows before grouping.)
Eksekveringsrækkefølgen
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
(WHERE before grouping, HAVING after — which is why their roles differ)
Hvorfor det betyder noget
GROUP BY og HAVING er centrale for analytisk SQL — opsummering og analyse af data efter kategori er et fundamentalt, konstant behov (tælling per region, salg per produkt, gennemsnit per gruppe), så forståelse af dem er essentiel. GROUP BY (gruppering af rækker så aggregater beregnes per gruppe) er fundamentet for disse opsummeringsspørgsmål, og forståelse af, hvordan det kollapserer rækker til grupper for aggregering, er nødvendig for enhver rapportering eller analyse.
Skelnen WHERE vs HAVING er særlig vigtig og ofte forvirrende: WHERE filtrerer individuelle rækker før gruppering (og kan ikke bruge aggregater), mens HAVING filtrerer grupper efter gruppering (på aggregatværdier) — brug af den forkerte forårsager fejl eller forkerte resultater, og forståelse af hvornår hver gælder (WHERE til filtrering på radniveau, HAVING til filtrering på aggregatniveau af grupper) er en vigtig færdighed.
Kendskab til at filtrere med WHERE først, når det er muligt (mere effektivt — reducerer rækker før gruppering) er en nyttig optimering.
Forbindelsen til eksekveringsrækkefølgen (WHERE før gruppering, HAVING efter) forklarer, hvorfor deres roller er forskellige.
Da gruppering og aggregatfiltrering er allestedsnærværende inden for rapportering og dataanalyse, og da WHERE-vs-HAVING-skelnen både er vigtig for korrekthed og almindeligt misforstået, er mesterskab af GROUP BY og HAVING — gruppering til per-kategori-aggregater og to-niveau-filtreringsmodellen — vigtig, hyppigt anvendt viden, der er essentiel for analytisk SQL og et almindeligt interviewemne.
