Logisk ordning för frågekörning
Varför FROM körs före SELECT och hur den verkliga körordningen besvarar ett dussin luriga frågor
Logisk ordning för frågekörning ä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 som leder till ett dussin andra
Intervjuare frågar "I vilken ordning körs en fråga egentligen?" eftersom svaret förklarar så mycket: varför ett SELECT-alias misslyckas i WHERE, varför WHERE inte kan filtrera ett aggregat och mycket mer.
Skriven ordning kontra logisk ordning
Du skriver en fråga med början i SELECT, men motorn kör den med början i FROM. Den skillnaden, där SELECT utvärderas nästan sist, orsakar den mesta förvirringen.
Den fullständiga logiska ordningen
Den fullständiga logiska ordningen är: FROM, därefter WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY och slutligen LIMIT. Alla fallgropar nedan följer direkt av den här listan.
Varför FROM körs först
FROM körs först eftersom motorn behöver rader att arbeta med innan något annat kan göras. Den bygger upp källraderna, och först därefter kan WHERE avgöra vilka som ska behållas.
SELECT e.name, d.name AS dept
FROM employees e
JOIN departments d ON d.id = e.department_id
WHERE e.salary > 50000;Fallgrop: Alias kan inte användas i WHERE
Den vanligaste följden som intervjuare frågar om: ett SELECT-alias kan inte användas i WHERE, eftersom WHERE körs före SELECT. Koden nedan visar felet och lösningen: upprepa uttrycket.
-- FAILS: alias 'annual' unknown in WHERE
SELECT salary * 12 AS annual
FROM employees
WHERE annual > 600000;
-- FIX: repeat the expression
SELECT salary * 12 AS annual
FROM employees
WHERE salary * 12 > 600000;Fallgrop: WHERE kan inte se aggregat
WHERE körs före grupperingen, så det kan inte se aggregat som COUNT(). Det är det HAVING är till för: WHERE filtrerar rader och HAVING filtrerar grupper efter aggregeringen.
-- WHERE cannot use COUNT(*)
SELECT department, COUNT(*) AS headcount
FROM employees
GROUP BY department
HAVING COUNT(*) > 5;Varför ORDER BY kan använda alias
Motsatsen gäller här: ORDER BY körs efter SELECT, så det kan använda SELECT-alias. Samma alias, men olika tidpunkt, vilket är anledningen till att det fungerar här men inte i WHERE.
SELECT name, salary * 12 AS annual
FROM employees
ORDER BY annual DESC;Var DISTINCT passar in
DISTINCT körs efter SELECT men före ORDER BY. Eftersom det tar bort dubbletter baserat på resultatkolumnerna kan du bara sortera efter något som finns kvar i SELECT-listan.
-- ERROR in many engines:
-- ORDER BY column not in the DISTINCT select list
SELECT DISTINCT department
FROM employees
ORDER BY hire_date;Genomgång av en fullständig fråga
Låt oss följa en riktig fråga genom stegen: FROM läser raderna, WHERE filtrerar, GROUP BY grupperar, HAVING behåller grupper, SELECT beräknar, ORDER BY sorterar och LIMIT begränsar resultatet.
SELECT customer_id, SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(amount) > 1000
ORDER BY total DESC
LIMIT 10;Logisk kontra fysisk körning
En detalj som gör ett gott intryck: detta är den logiska ordningen som definierar korrektheten. Optimerarens fysiska plan kan se annorlunda ut, så länge den producerar samma rader.
En minnesregel för ordningen
En minnesregel: föreställ dig rader som flödar genom en pipeline, där varje steg lämnar över en mindre mängd till nästa. När något misslyckas kontrollerar du om ett tidigare steg producerade det som behövs.
Snabbkontroll
Tillämpa körordningen för att hitta felet.
Sammanfattning
Sammanfattning: den logiska ordningen är FROM, WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, LIMIT. WHERE körs före SELECT, så alias kan inte användas där; ORDER BY körs efter SELECT, så alias fungerar där.
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 ”Logisk ordning för frågekörning” gratis?
Ja – hela texten till ”Logisk ordning för frågekörning” 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 ”Logisk ordning för frågekörning”?
Varför FROM körs före SELECT och hur den verkliga körordningen besvarar ett dussin luriga frågor 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 ”Logisk ordning för frågekörning”?
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
- Vad är SQL och varför frågar intervjuare om det
- Logisk ordning för frågekörning
- Primärnycklar, främmande nycklar och begränsningar
- Läs ett schema under press