Sottoquery scalari in SELECT e WHERE
Sottoquery che restituiscono un singolo valore e l'errore che si verifica quando restituiscono più di una riga
Sottoquery scalari in SELECT e WHERE è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.
Cosa si intende per sottoquery scalare in un colloquio
Una sottoquery scalare è una query che restituisce esattamente una riga e una colonna — un singolo valore. Poiché si risolve in un unico valore, SQL consente di inserirla quasi ovunque sia possibile usare un valore letterale: in SELECT, WHERE, HAVING e persino ORDER BY.
- Gli intervistatori verificano che conosca la regola una riga, una colonna.
- Il caso problematico classico è una sottoquery che restituisce accidentalmente più di una riga.
Se riesce a enunciare chiaramente questa definizione, ha già superato il primo controllo.
Una sottoquery scalare nell'elenco SELECT
Inserire una sottoquery scalare nell'elenco SELECT consente di aggiungere un singolo valore calcolato a ogni riga del risultato. Qui mostriamo ogni dipendente accanto allo stipendio medio dell'intera azienda.
La sottoquery (SELECT AVG(salary) FROM employees) viene eseguita e riduce l'intera tabella a un unico numero; poi quel numero viene ripetuto in ogni riga.
SELECT
name,
salary,
(SELECT AVG(salary) FROM employees) AS company_avg
FROM employees;Una sottoquery scalare in WHERE
Lo stesso singolo valore può guidare un filtro. Una richiesta molto comune nei colloqui è trovare tutte le persone che guadagnano più della media aziendale.
La sottoquery calcola la media una volta, poi ogni riga della query esterna viene confrontata con essa. Questa sottoquery non è correlata — la query interna non dipende dalla riga esterna, quindi viene eseguita una sola volta.
SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);L'errore «più di una riga»
Questo è l'errore che gli intervistatori si aspettano che sappia prevedere. Se la sottoquery viene usata con = o > ma restituisce più righe, il motore genera un errore:
- Postgres: more than one row returned by a subquery used as an expression
- MySQL: Subquery returns more than 1 row
La query seguente fallisce perché nel reparto 5 potrebbero esserci diversi dipendenti — la sottoquery non è scalare.
SELECT name
FROM employees
WHERE salary = (SELECT salary FROM employees WHERE dept_id = 5);Come rendere scalare una sottoquery
Esistono due modi affidabili per garantire un singolo valore:
- Usare un'aggregazione come
MAX,MINoAVG— le aggregazioni senzaGROUP BYrestituiscono sempre una riga. - Usare
LIMIT 1(Postgres/MySQL) oppureFETCH FIRST 1 ROW ONLYdopo unORDER BY.
La versione corretta seguente richiede lo stipendio più alto nel reparto 5.
SELECT name
FROM employees
WHERE salary = (
SELECT MAX(salary) FROM employees WHERE dept_id = 5
);Le sottoquery scalari restituiscono NULL se non trovano righe
Un dettaglio sottile, spesso chiesto nei colloqui: se una sottoquery scalare trova zero righe, non genera un errore — restituisce NULL. Quel NULL si propaga poi nel confronto.
Poiché salary > NULL restituisce UNKNOWN (non true), la query esterna non restituisce alcuna riga. Spesso i candidati si aspettano un errore; la risposta corretta è risultato vuoto, senza messaggi di errore.
SELECT name, salary
FROM employees
WHERE salary > (
SELECT AVG(salary) FROM employees WHERE dept_id = 9999
);Esempio svolto: dipendenti sopra la media e differenza
Combiniamo entrambe le posizioni. Mostriamo ogni dipendente sopra la media e di quanto supera la media. La stessa sottoquery scalare compare in SELECT e in WHERE.
Un intervistatore potrebbe chiedere se la sottoquery viene eseguita due volte. Dal punto di vista logico compare due volte, ma un buon ottimizzatore può valutare una sola volta la sottoquery non correlata e riutilizzarne il risultato.
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;Una sottoquery scalare in ORDER BY
Poiché una sottoquery scalare è semplicemente un valore, è consentito usarla anche in ORDER BY. Raramente è l'approccio più chiaro, ma agli intervistatori piace verificare che sappia che è possibile.
Qui ordiniamo i reparti in base a un valore ottenuto da un'altra tabella — il numero di dipendenti di ciascun reparto — senza usare un join.
SELECT d.dept_name
FROM departments d
ORDER BY (
SELECT COUNT(*) FROM employees e WHERE e.dept_id = d.id
) DESC;Scalare rispetto a correlata: riconoscere la differenza
L'esempio con ORDER BY precedente fa riferimento in modo implicito a d.id della query esterna — questo lo rende una sottoquery scalare correlata, eseguita una volta per ogni riga esterna.
Gli intervistatori amano questa distinzione:
- Sottoquery scalare non correlata: autonoma, viene eseguita una volta.
- Sottoquery scalare correlata: fa riferimento alla riga esterna, viene eseguita per ogni riga.
Entrambe sono comunque scalari (un solo valore), ma le prestazioni possono differire drasticamente.
Quando non usare una sottoquery scalare
Una sottoquery scalare correlata nell'elenco SELECT è comoda, ma può essere lenta su tabelle di grandi dimensioni — viene eseguita per ogni riga. Gli intervistatori si aspettano che conosca le alternative:
- Un
LEFT JOINa una tabella derivata pre-aggregata. - Una funzione finestra come
AVG(salary) OVER ().
La versione con funzione finestra seguente produce la stessa colonna con la media aziendale senza una scansione separata della sottoquery.
SELECT
name,
salary,
AVG(salary) OVER () AS company_avg
FROM employees;La frase da dire al colloquio
Se le chiedono di definire una sottoquery scalare, risponda così: "Una sottoquery scalare restituisce una riga e una colonna, quindi si comporta come un singolo valore e può essere usata ovunque sia consentito un valore letterale. Se restituisce più di una riga, il motore genera un errore; se non restituisce righe, produce NULL."
Questa singola frase copre la definizione, il caso di errore e il caso limite di NULL — i tre aspetti che ogni intervistatore cerca di verificare.
Verifica rapida
Verifichi la Sua comprensione del comportamento delle sottoquery scalari.
Riepilogo
Ora conosce le sottoquery scalari:
- Definizione: una riga e una colonna — utilizzabile come un valore letterale in SELECT, WHERE, HAVING e ORDER BY.
- Più righe con =/> causano un errore; renda la sottoquery scalare usando un'aggregazione o
LIMIT 1. - Zero righe producono NULL, che in un filtro elimina silenziosamente le righe.
- Le sottoquery scalari correlate vengono eseguite per ogni riga; quando le prestazioni sono importanti, preferisca join o funzioni finestra.
Prossimo argomento: le sottoquery nella clausola FROM, in cui il risultato è un'intera tabella virtuale.
Domande Frequenti
La lezione «Sottoquery scalari in SELECT e WHERE» è gratuita?
Sì — il testo completo di «Sottoquery scalari in SELECT e WHERE» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.
Cosa imparerò in «Sottoquery scalari in SELECT e WHERE»?
Sottoquery che restituiscono un singolo valore e l'errore che si verifica quando restituiscono più di una riga Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Interview Prep?
Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Sottoquery scalari in SELECT e WHERE»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?
Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Sottoquery scalari in SELECT e WHERE
- Sottoquery nella clausola FROM (tabelle derivate)
- Sottoquery con IN, ANY e ALL
- Prestazioni di EXISTS rispetto a IN