GROUP BY-reglen for SELECT-kolonner
Hvorfor alle ikke-aggregerede kolonner skal stå i GROUP BY, og hvad only-full-group-by-tilstanden betyder
GROUP BY-reglen for SELECT-kolonner er en gratis Forberedelse til SQL-interview-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Forberedelse til SQL-interview, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvorfor interviewere starter med GROUP BY
GROUP BY er det punkt, hvor jobsamtaler skelner mellem juniorer og udviklere på mellemniveau. Den regel, de oftest tester, er: Hver kolonne på din SELECT-liste skal enten være inde i en aggregatfunktion eller stå i GROUP BY.
Hvis du bryder denne regel, kan databasemotoren ikke afgøre, hvilken værdi der skal vises for en gruppe med mange rækker. Interviewere indsætter med vilje netop denne fejl for at se, om du forstår hvad en gruppe egentlig er.
Hvad en gruppe egentlig er
GROUP BY samler mange rækker til én række pr. entydig nøgle. Efter grupperingen har databasemotoren ikke længere de individuelle rækker. Den har kun én opsummeringsrække pr. gruppe.
- Kolonner, du grupperede efter, har én entydig værdi pr. gruppe.
- Aggregater som
COUNT,SUMogAVGreducerer de mange værdier til én. - Enhver anden rå kolonne er tvetydig: Hvilken af de mange værdier skal vises?
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department;Den klassiske fejl
Her er den fejl, interviewere elsker. Du grupperer efter department, men vælger også name, som er en ikke-aggregeret kolonne, der ikke står i GROUP BY.
Hver afdeling har mange medarbejdere, så der er mange navne i hver gruppe. Databasemotoren kan ikke vælge ét, så standard-SQL afviser forespørgslen.
-- ERROR: name is not in GROUP BY and not aggregated
SELECT department, name, COUNT(*)
FROM employees
GROUP BY department;To måder at rette det på
Der er to gyldige løsninger, og intervieweren vil høre, at du ved, at de giver forskellige resultater:
- Tilføj kolonnen til GROUP BY, hvis du faktisk ønsker en mere detaljeret gruppering (én række pr. afdeling og navn).
- Pak den ind i et aggregat som
MAX(name)ellerCOUNT(name), hvis du ønsker én værdi pr. eksisterende gruppe.
-- Finer grouping
SELECT department, name, COUNT(*) AS rows_for_person
FROM employees
GROUP BY department, name;ONLY_FULL_GROUP_BY i MySQL
En populær fælde: Ældre versioner af MySQL tillod, at du valgte kolonner, der ikke var grupperet, og returnerede stiltiende en vilkårlig værdi fra gruppen. Det gav forkerte rapporter, der så rigtige ud.
Moderne MySQL aktiverer ONLY_FULL_GROUP_BY som standard, hvilket håndhæver standardreglen. Postgres, SQL Server og Oracle har altid håndhævet den. Hvis du bliver spurgt, hvorfor en forespørgsel »virkede på den gamle server, men fejler nu«, er dette svaret.
-- Legal under ONLY_FULL_GROUP_BY because every
-- selected column is grouped or aggregated
SELECT department, MAX(hire_date) AS latest_hire
FROM employees
GROUP BY department;Undtagelsen for funktionel afhængighed
Der er en detalje, som interviewere bruger til at teste din dybde. Hvis du grupperer efter en tabels primærnøgle, er alle andre kolonner i tabellen funktionelt afhængige af nøglen, så de har præcis én værdi pr. gruppe.
Postgres og moderne MySQL tillader, at du vælger disse afhængige kolonner uden at angive dem. Den grupperede nøgle bestemmer dem entydigt, så der er ingen tvetydighed.
-- Legal: id is the PK, so name is determined by it
SELECT e.id, e.name, COUNT(o.id) AS orders
FROM employees e
LEFT JOIN orders o ON o.employee_id = e.id
GROUP BY e.id;Gennemarbejdet eksempel: Salg pr. region
Antag, at du skal rapportere det samlede salg pr. region. Grupperingsnøglen er region, og måltallet er SUM(amount). Alt andet skal aggregeres eller udelades.
Bemærk, hvor enkelt dette er: én række pr. region, som hver indeholder én samlet værdi. Sådan ser alle aggregerede rapporter ud.
SELECT region,
SUM(amount) AS total_sales,
COUNT(*) AS num_orders,
AVG(amount) AS avg_order
FROM sales
GROUP BY region;Blanding af detaljer og opsummering
Et lumskt spørgsmål: »Vis beløbet for hver ordre sammen med regionens samlede beløb.« Det kan du ikke gøre med almindelig GROUP BY, fordi grupperingen ødelægger de individuelle rækker.
Det rigtige svar er en vinduesfunktion (SUM(amount) OVER (PARTITION BY region)) eller et join tilbage til en grupperet underforespørgsel. Pointen med spørgsmålet er at genkende, at GROUP BY er det forkerte værktøj her.
-- Detail rows kept, region total added per row
SELECT order_id, region, amount,
SUM(amount) OVER (PARTITION BY region) AS region_total
FROM sales;GROUP BY og SELECT-aliaser
Kan du gruppere efter et alias, der er defineret i SELECT? Det afhænger af SQL-dialekten, og netop denne uoverensstemmelse undersøger interviewere.
- MySQL og Postgres: tillader gruppering efter et SELECT-alias.
- SQL Server og Oracle: gør ikke; du skal gentage hele udtrykket.
Det portable svar er at gentage udtrykket i GROUP BY, hvilket fungerer overalt.
-- Portable: repeat the expression rather than the alias
SELECT EXTRACT(YEAR FROM order_date) AS yr, COUNT(*)
FROM sales
GROUP BY EXTRACT(YEAR FROM order_date);DISTINCT kontra GROUP BY for entydighed
Hvis du kun ønsker entydige kombinationer og ikke noget aggregat, fungerer GROUP BY uden aggregat som DISTINCT. Interviewere kan spørge, hvad der er tydeligst.
Brug DISTINCT til at udtrykke hensigten (»Jeg ønsker unikke rækker«). Gem GROUP BY til situationer, hvor du også beregner aggregater. Samme resultat, men et andet signal om, hvad koden betyder.
-- These return the same rows
SELECT DISTINCT department, role FROM employees;
SELECT department, role FROM employees GROUP BY department, role;Sådan formulerer du det til jobsamtalen
Når du får et GROUP BY-spørgsmål, skal du sige reglen højt: »Hver valgt kolonne er enten en grupperingsnøgle eller pakket ind i et aggregat, fordi gruppering efterlader én række pr. nøgle.«
Angiv derefter din grupperingsnøgle og dine måltal, og bekræft, at intet slipper igennem uden at være grupperet. Det strukturerede svar signalerer kompetence på mellemniveau, allerede før du skriver forespørgslen.
Hurtigt tjek
Test din forståelse af grundreglen for GROUP BY.
Opsummering
Reglen: Hver kolonne i SELECT er enten en grupperingsnøgle eller et aggregat. Hvorfor: GROUP BY efterlader én række pr. nøgle, så ugrupperede rå kolonner bliver entydige.
- Ret overtrædelser ved at gruppere kolonnen eller aggregere den.
- MySQL's gamle adfærd returnerede vilkårlige værdier;
ONLY_FULL_GROUP_BYhåndhæver standarden. - Funktionel afhængighed af en primærnøgle er den eneste lovlige undtagelse.
- Hvis du vil beholde detaljerækker ved siden af gruppesummer, skal du bruge vinduesfunktioner, ikke GROUP BY.
Lær SQL med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 30
- Lektioner
- 120
Ofte stillede spørgsmål
Er lektionen “GROUP BY-reglen for SELECT-kolonner” gratis?
Ja — hele teksten til “GROUP BY-reglen for SELECT-kolonner” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Forberedelse til SQL-interview-kurset, skal du opgradere til CoddyKit PRO. Forberedelse til SQL-interview-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “GROUP BY-reglen for SELECT-kolonner”?
Hvorfor alle ikke-aggregerede kolonner skal stå i GROUP BY, og hvad only-full-group-by-tilstanden betyder Du øver dig i Forberedelse til SQL-interview med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Forberedelse til SQL-interview?
Der kræves ingen tidligere erfaring. Forberedelse til SQL-interview på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “GROUP BY-reglen for SELECT-kolonner”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Forberedelse til SQL-interview-lektion?
Ja. Alle Forberedelse til SQL-interview-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- GROUP BY-reglen for SELECT-kolonner
- HAVING kontra WHERE
- Gruppering efter flere kolonner og udtryk
- Optælling og filtrering af grupper