Aggregeringar utan GROUP BY
Så får en fristående aggregering en hel tabell att bli en enda rad
Aggregeringar utan GROUP BY är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 4 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örberedelse inför kodningsintervjuer, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Ett aggregat, en rad
Intervjuare testar en grundläggande idé med den här frågan: "Vad händer när du använder en aggregatfunktion utan GROUP BY?"
Svaret är att hela tabellen sammanfattas till en enda rad. Aggregatet behandlar alla rader som uppfyller villkoren som en enda implicit grupp. När du förstår modellen med den "implicita gruppen" blir många efterföljande regler lättare att förstå, så låt oss bygga upp den steg för steg.
Den implicita enda gruppen
När du skriver ett fristående aggregat utan GROUP BY beter sig SQL som om det finns en grupp som innehåller varje rad. Resultatet består alltid av exakt en rad, oavsett hur många rader tabellen har — även om tabellen är tom.
Så SELECT COUNT(*) FROM employees returnerar en rad med ett tal som sammanfattar hela tabellen.
SELECT COUNT(*) AS total_employees
FROM employees;
-- always returns exactly one rowFlera aggregat tillsammans
Du kan ange flera aggregat i samma SELECT. De sammanfattar alla samma implicita grupp, så du får fortfarande exakt en rad med flera kolumner.
Detta är den vanliga frågan "ge mig sammanfattningsstatistiken". Alla fyra tal beskriver samma fullständiga mängd rader.
SELECT
COUNT(*) AS num_rows,
SUM(salary) AS total_pay,
AVG(salary) AS avg_pay,
MAX(salary) AS top_pay
FROM employees;Blandningsfelet
Här är den regel som testas oftast. Du kan inte blanda ett fristående aggregat med en icke-aggregerad kolumn i samma SELECT utan GROUP BY.
Varför? Aggregatet producerar en rad, men en vanlig kolumn har många värden — vilket av dem skulle visas? Det är tvetydigt, så standard-SQL genererar ett fel.
-- ERROR: name is not aggregated and there is no GROUP BY
SELECT name, MAX(salary)
FROM employees;Varför det är tvetydigt
Tänk igenom det med vår tabell. MAX(salary) sammanfattar alla rader till ett värde. Men name har ett annat värde på varje rad. Den enda sammanfattningsraden kan inte innehålla fem namn i en cell.
Databasen vägrar att gissa. Det är samma princip som ligger bakom GROUP BY-regeln: varje vald kolumn måste antingen aggregeras eller ingå i gruppen. Utan GROUP BY är endast aggregat tillåtna.
MySQL:s lösa undantag
En dialektskillnad som är värd att nämna: äldre eller icke-strikt MySQL tillät blandningsfrågan och returnerade ett godtyckligt namn — inte nödvändigtvis namnet på den bäst betalda anställda.
Modernt MySQL med ONLY_FULL_GROUP_BY aktiverat, vilket numera är standard, avvisar frågan precis som alla andra databaser. Att nämna detta visar att du är medveten om skillnader mellan dialekter, men behandla alltid den blandade frågan som felaktig.
Hämta raden bakom maxvärdet
Hur får du då namnet på den bäst betalda anställda? Inte genom att blanda kolumner. Använd ORDER BY + LIMIT eller en underfråga som jämför med aggregatet.
Varianten med ORDER BY/LIMIT är enklast. Underfrågevarianten generaliserar på ett bra sätt och returnerar alla anställda som delar maxvärdet.
-- Subquery: returns everyone earning the max
SELECT name, salary
FROM employees
WHERE salary = (SELECT MAX(salary) FROM employees);Aggregat på en tom tabell
Här är ett specialfall som intervjuare gärna smyger in: "Vad returnerar ett fristående aggregat för en tom tabell?"
COUNT(*)returnerar 0 (en rad med värdet 0).SUM,AVG,MINochMAXreturnerar NULL (en rad med värdet NULL).
Viktigt är att du fortfarande får tillbaka en rad, aldrig noll rader. Garantin om en enda rad är hela poängen med ett aggregat utan GROUP BY.
SELECT COUNT(*) AS c, SUM(salary) AS s, MAX(salary) AS m
FROM employees
WHERE 1 = 0;
-- one row: c=0, s=NULL, m=NULLInget WHERE-aggregat av aggregat
En annan regel som följer av modellen är att du inte kan placera ett aggregat i en WHERE-sats, eftersom WHERE filtrerar enskilda rader innan aggregeringen sker.
För att filtrera på ett aggregatresultat använder du HAVING (tillsammans med gruppering) eller bäddar in aggregatet i en underfråga. WHERE körs helt enkelt för tidigt i exekveringsordningen för att kunna se aggregatet.
-- ERROR: aggregate not allowed in WHERE
-- SELECT * FROM employees WHERE salary > AVG(salary);
-- Correct: compare to the aggregate via subquery
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);Fristående aggregat jämfört med GROUP BY
Formulera kontrasten så här:
- Utan GROUP BY: en implicit grupp = hela tabellen = exakt en resultatrad.
- Med GROUP BY col: en grupp per unikt värde i col = en rad per grupp.
Ett fristående aggregat är helt enkelt GROUP BY utan grupperingskolumner. Samma mekanism, en enda stor grupp.
-- Whole table: one row
SELECT AVG(salary) FROM employees;
-- Per department: one row each
SELECT department, AVG(salary)
FROM employees
GROUP BY department;Så förklarar du det
Ett tydligt svar är: "Ett aggregat utan GROUP BY behandlar hela resultatuppsättningen som en implicit grupp och returnerar exakt en sammanfattningsrad, även för en tom tabell. Du kan inte välja en icke-aggregerad kolumn tillsammans med det, eftersom värdet skulle vara tvetydigt. För att hämta raden bakom ett MAX- eller MIN-värde använder jag ORDER BY med LIMIT eller en underfråga som jämför med aggregatet."
Snabbtest
Förutsäg resultatets form.
Sammanfattning
Aggregat utan GROUP BY i korthet:
- Hela tabellen blir en implicit grupp → exakt en resultatrad.
- Du kan inte blanda ett fristående aggregat med en icke-aggregerad kolumn.
- Tom tabell:
COUNT(*)= 0, övriga returnerar NULL, fortfarande en rad. - Aggregat kan inte förekomma i
WHERE; använd en underfråga ellerHAVING. - För att hämta raden bakom MIN/MAX använder du ORDER BY + LIMIT eller en underfråga.
Därmed är övningarna om aggregatfunktioner inför intervjun klara.
Lär dig Förberedelse inför kodningsintervjuer 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
- 90
- Lektioner
- 360
Vanliga frågor
Är lektionen ”Aggregeringar utan GROUP BY” gratis?
Ja – hela texten till ”Aggregeringar utan GROUP BY” 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örberedelse inför kodningsintervjuer, kan Ni uppgradera till CoddyKit PRO. Kursen i Förberedelse inför kodningsintervjuer innehåller totalt 4 lektioner.
Vad lär jag mig i ”Aggregeringar utan GROUP BY”?
Så får en fristående aggregering en hel tabell att bli en enda rad Ni övar på Förberedelse inför kodningsintervjuer 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örberedelse inför kodningsintervjuer?
Du behöver inga förkunskaper. Utbildningen i Förberedelse inför kodningsintervjuer 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 4 av 4.
Hur lång tid tar lektionen ”Aggregeringar utan GROUP BY”?
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örberedelse inför kodningsintervjuer-lektionen?
Ja. Varje Förberedelse inför kodningsintervjuer-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
- COUNT(*) kontra COUNT(column) kontra COUNT(DISTINCT)
- SUM och AVG med NULL
- MIN, MAX och aggregering av icke-numeriska värden
- Aggregeringar utan GROUP BY