Förberedelse inför kodningsintervjuer · Lektion

Skalära underfrågor i SELECT och WHERE

Underfrågor med ett enda värde och felet som uppstår när de returnerar mer än en rad

Lektion 1 av 413 steg

Skalära underfrågor i SELECT och WHERE är en gratis lektion i Förberedelse inför kodningsintervjuer på CoddyKit. Detta är lektion 1 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.

Vad intervjuaren menar med en skalär underfråga

En skalär underfråga är en fråga som returnerar exakt en rad och en kolumn — ett enda värde. Eftersom den resulterar i ett enda värde kan SQL låta dig placera den nästan överallt där en literal kan användas: i SELECT, WHERE, HAVING och till och med ORDER BY.

  • Intervjuare testar om du känner till regeln en rad, en kolumn.
  • Den klassiska fallgropen är en underfråga som av misstag returnerar mer än en rad.

Om du kan formulera definitionen tydligt har du redan klarat den första kontrollpunkten.

En skalär underfråga i SELECT-listan

Genom att placera en skalär underfråga i SELECT-listan kan du lägga till ett beräknat enskilt värde på varje resultatrad. Här visas varje anställd bredvid företagets genomsnittslön.

Underfrågan (SELECT AVG(salary) FROM employees) körs och reducerar hela tabellen till ett tal, som sedan upprepas på varje rad.

SELECT
  name,
  salary,
  (SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;

En skalär underfråga i WHERE

Samma enskilda värde kan styra ett filter. En mycket vanlig intervjufråga är hitta alla som tjänar mer än företagets genomsnitt.

Underfrågan beräknar genomsnittet en gång, och sedan jämförs varje rad i den yttre frågan med det. Detta är inte korrelerat — den inre frågan är inte beroende av den yttre raden, så den körs en enda gång.

SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

Felet "Fler än en rad"

Det här är felet som intervjuare vill att du ska förutse. Om underfrågan används med = eller > men returnerar flera rader genererar databasmotorn följande fel:

  • Postgres: fler än en rad returnerades av en underfråga som används som uttryck
  • MySQL: Underfrågan returnerar mer än 1 rad

Frågan nedan misslyckas eftersom det kan finnas flera anställda på avdelning 5 — underfrågan är inte skalär.

SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);

Så garanterar du att en underfråga blir skalär

Två tillförlitliga sätt att garantera ett enda värde:

  • Använd ett aggregat som MAX, MIN eller AVG — aggregat utan GROUP BY returnerar alltid en rad.
  • Använd LIMIT 1 (Postgres/MySQL) eller FETCH FIRST 1 ROW ONLY efter en ORDER BY.

Den korrigerade versionen nedan hämtar den högsta lönen på avdelning 5.

SELECT name
FROM employees
WHERE salary = (
  SELECT MAX(salary) FROM employees WHERE dept_id = 5
);

Skalära underfrågor returnerar NULL när inga rader matchar

En viktig detalj i intervjusammanhang: om en skalär underfråga matchar noll rader uppstår inget fel — den returnerar NULL. Det NULL-värdet förs sedan vidare i jämförelsen.

Eftersom salary > NULL utvärderas till UNKNOWN (inte true) returnerar den yttre frågan inga rader. Kandidater förväntar sig ofta ett fel här; det korrekta svaret är tomt resultat, utan felmeddelande.

SELECT name, salary
FROM employees
WHERE salary > (
  SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);

Genomarbetat exempel: löner över genomsnittet och skillnaden

Vi kombinerar båda placeringarna. Vi visar varje person med lön över genomsnittet och hur mycket över genomsnittet personen ligger. Samma skalära underfråga förekommer i SELECT och WHERE.

En intervjuare kan fråga om underfrågan körs två gånger. Logiskt sett förekommer den två gånger, men en bra optimerare kan utvärdera den okorrelerade underfrågan en enda gång och återanvända resultatet.

SELECT
  name,
  salary,
  salary - (SELECT AVG(salary) FROM employees) AS above_avg
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees)
ORDER BY above_avg DESC;

Skalär underfråga i ORDER BY

Eftersom en skalär underfråga bara är ett värde är den också tillåten i ORDER BY. Detta är sällan det tydligaste sättet, men intervjuare vill gärna kontrollera att du vet att det är tillåtet.

Här sorterar vi avdelningar efter ett värde från en annan tabell — antalet anställda på varje avdelning — utan att använda en join.

SELECT d.dept_name
FROM departments d
ORDER BY (
  SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;

Skalär kontra korrelerad: förstå skillnaden

Exemplet med ORDER BY ovan refererar i hemlighet till d.id från den yttre frågan — det gör den till en korrelerad skalär underfråga som körs en gång per yttre rad.

Intervjuare uppskattar denna distinktion:

  • Okorrelerad skalär underfråga: fristående, körs en gång.
  • Korrelerad skalär underfråga: refererar till den yttre raden, körs en gång per rad.

Båda är fortfarande skalära (ett värde), men prestandan kan skilja sig dramatiskt.

När en skalär underfråga INTE bör användas

En korrelerad skalär underfråga i SELECT-listan är praktisk men kan vara långsam i stora tabeller — den körs en gång per rad. Intervjuare förväntar sig att du känner till alternativen:

  • En LEFT JOIN till en föraggregerad härledd tabell.
  • En fönsterfunktion som AVG(salary) OVER ().

Fönsterversionen nedan ger samma kolumn med företagets genomsnitt utan en separat genomsökning med en underfråga.

SELECT
  name,
  salary,
  AVG(salary) OVER () AS company_avg
FROM employees;

Kort intervjusvar

Om du ombeds definiera en skalär underfråga kan du säga: "En skalär underfråga returnerar en rad och en kolumn, så den fungerar som ett enda värde och kan användas överallt där en literal är tillåten. Om den returnerar mer än en rad uppstår ett fel i databasmotorn; om den inte returnerar några rader ger den NULL."

Den enda meningen täcker definitionen, fallet med flera rader och NULL-fallet — de tre saker som alla intervjuare lyssnar efter.

Snabbtest

Testa din förståelse av hur skalära underfrågor fungerar.

Sammanfattning

Nu behärskar du skalära underfrågor:

  • Definition: en rad, en kolumn — kan användas som en literal i SELECT, WHERE, HAVING och ORDER BY.
  • Flera rader med =/> orsakar ett fel; garantera skalärhet med ett aggregat eller LIMIT 1.
  • Noll rader ger NULL, vilket tyst filtrerar bort rader i ett filter.
  • Korrelerade skalära underfrågor körs en gång per rad; föredra joinar eller fönsterfunktioner när prestandan är viktig.

Nästa steg: underfrågor i FROM-satsen, där resultatet är en hel virtuell tabell.

Gratis att börja

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 ”Skalära underfrågor i SELECT och WHERE” gratis?

Ja – hela texten till ”Skalära underfrågor i SELECT och 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ö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 ”Skalära underfrågor i SELECT och WHERE”?

Underfrågor med ett enda värde och felet som uppstår när de returnerar mer än en 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 1 av 4.

Hur lång tid tar lektionen ”Skalära underfrågor i SELECT och 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ö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

  1. Skalära underfrågor i SELECT och WHERE
  2. Underfrågor i FROM-satsen (härledda tabeller)
  3. IN-, ANY- och ALL-underfrågor
  4. EXISTS kontra IN – prestanda
← Tillbaka till Förberedelse inför kodningsintervjuer