Vai al contenuto principale

Ordine di esecuzione SQL: come vengono eseguite le query

Comprendi l'ordine di esecuzione SQL e in cosa differisce dall'ordine di scrittura. Scrivi query accurate e ottimizzate per migliorare le prestazioni ed evita errori comuni nel design delle query.
Aggiornato 3 giu 2026  · 5 min leggi

Quando scriviamo query SQL, di solito seguiamo un certo ordine (si dice che l'SQL si scriva dall'interno verso l'esterno). Tuttavia, i motori SQL seguono uno specifico ordine di esecuzione quando compilano le query, diverso dall'ordine tipico di scrittura. Capire l'ordine di esecuzione SQL è importante per padroneggiare l'ottimizzazione delle query, migliorare accuratezza e prestazioni e fare debug di problemi complessi, come vedrai.

Per iniziare, ti consiglio il corso di DataCamp Introduction to SQL e il percorso di competenze SQL Fundamentals per imparare le basi di SQL e come estrarre dati con le query. Lo SQL Basics Cheat Sheet è una guida utile alle funzioni SQL più comuni per filtrare e aggregare i dati.

Cos'è l'ordine di esecuzione SQL?

Per ordine di esecuzione SQL si intende la sequenza con cui vengono valutate le diverse clausole di una query. Vale la pena capirlo perché l'ordine di esecuzione è di solito diverso da come scriviamo le query SQL. Per prendere l'esempio più semplice, potresti pensare che nel caso di SELECT * FROM database la SELECT venga valutata per prima, ma in realtà l'ordine di esecuzione parte dalla clausola FROM.

Ecco l'ordine di esecuzione SQL. Nella prossima sezione, vedremo i passaggi nel dettaglio. 

  • FROM/JOIN: specifica le tabelle da cui recuperare i dati.
  • WHERE: filtra le righe che soddisfano la condizione prima del raggruppamento.
  • GROUP BY: raggruppa le righe che condividono una proprietà.
  • HAVING: filtra i gruppi in base a condizioni, applicato dopo il raggruppamento.
  • SELECT: specifica le colonne da recuperare o calcolare.
  • DISTINCT: rimuove le righe duplicate dal result set.
  • ORDER BY: ordina il result set in base alle colonne specificate.
  • LIMIT: specifica il numero massimo di righe da restituire.
  • OFFSET: specifica quante righe saltare prima di iniziare a restituire risultati.

Nella query seguente ho aggiunto commenti per mostrare cosa viene valutato per primo. 

-- #6+7   SELECT DISTINCT department_id                                 
-- #1     FROM employees                                                
-- #2     JOIN orders ON customers.customer_id = orders.customer_id     
-- #3     WHERE salary > 3000                                          
-- #4     GROUP BY department 
-- #5     HAVING AVG(salary) > 5000 
-- #8     ORDER BY department 
-- #9     LIMIT 10 OFFSET 5 
-- #10    OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY; 

Ho anche creato un acrostico che potrebbe aiutare: For Work Goals and Hurdles Search DataCamp's Organized Learning Opportunities.

Fasi di esecuzione di una query SQL

Anche se la maggior parte delle query SQL che scriviamo inizia con l'istruzione SELECT, l'ordine logico di esecuzione parte dalla clausola FROM. Qui scriverò delle query per mostrare l'ordine di esecuzione delle query. Tieni però presente che queste query sono incomplete e non verranno compilate.

Clausola FROM

Le query SQL iniziano il processo di esecuzione con la clausola FROM. Questo è solitamente il primo stadio, perché il database identifica le fonti dati/le tabelle. Quando sono coinvolte più tabelle, la query SQL valuterà anche la condizione di JOIN per combinare le tabelle specificate come sorgente dati.

La query incompleta qui sotto selezionerebbe prima i dati dalla tabella customers usando la clausola FROM e dalla tabella orders usando la clausola JOIN.

FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;

Clausola WHERE

La clausola WHERE viene eseguita dopo le clausole FROM e JOIN per filtrare le righe in base a condizioni specifiche. È importante notare che le colonne definite con alias nella clausola SELECT non possono essere richiamate direttamente nella clausola WHERE, poiché questa viene elaborata prima di SELECT

La query seguente usa la clausola WHERE per filtrare i record dei dipendenti con un bonus maggiore di 5000.

FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary * 0.1 > 5000;

Clausola GROUP BY

Dopo il filtraggio delle righe, SQL esegue la clausola GROUP BY per raggruppare i risultati in base alle colonne specificate. Questo passaggio è solitamente usato con funzioni di aggregazione come COUNT(), SUM() e AVG() per eseguire calcoli sulle colonne indicate.

La query seguente prima esclude i dipendenti con salary superiore a 3,000, poi li raggruppa per department e calcola lo stipendio medio per ciascun gruppo.

FROM employees e
JOIN departments d ON e.employee_id = d.department_id
WHERE e.salary > 3000
GROUP BY e.name, d.department_name;

Clausola HAVING

La clausola HAVING è simile a WHERE ma viene usata per filtrare i dati raggruppati dopo l'operazione di GROUP BY. Nella query seguente, SQL raggruppa gli employees per department, calcola lo stipendio medio per ogni gruppo e poi esclude i gruppi in cui lo stipendio medio è minore o uguale a 5,000

FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary > 3000
GROUP BY department_name
HAVING AVG(salary) > 5000;

Clausola SELECT

Nella clausola SELECT SQL determina le colonne o le espressioni da restituire dopo l'esecuzione dei passaggi precedenti. Puoi applicare operazioni aritmetiche, alias e funzioni di aggregazione nella clausola SELECT.

La query seguente usa la clausola SELECT per recuperare il name e il bonus calcolato come salary * 0.1 dalla tabella employees.

SELECT name, salary * 0.1 AS bonus
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY name
HAVING AVG(salary) > 5000;

Clausola DISTINCT

La clausola DISTINCT viene valutata dopo la clausola SELECT in una query. È importante per rimuovere i record duplicati da una tabella perché restituisce righe uniche. La query seguente restituisce ogni department_id univoco, filtrando i duplicati.

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;

Clausola ORDER BY

La clausola ORDER BY ordina il result set in base a specifiche colonne o espressioni. A differenza di WHERE, ORDER BY può usare alias di colonna definiti nell'istruzione SELECT.

La query seguente ordina la colonna bonus in ordine decrescente. Nota che bonus è stato definito nell'istruzione SELECT come alias di un'espressione.

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC;

Clausole LIMIT/OFFSET

Le clausole LIMIT e OFFSET sono di solito le ultime a essere eseguite in una query SQL per limitare il numero di righe da restituire. LIMIT specifica il numero massimo di righe da restituire e OFFSET indica quante righe saltare prima di iniziare a restituire risultati.

La query seguente recupera i nomi e gli stipendi dei dipendenti, li ordina per salary in ordine decrescente e limita l'output a 10 risultati saltando le prime 5 righe.

SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC
LIMIT 10 OFFSET 5;
-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY --SQL SERVER / ORACLE

Le clausole LIMIT e OFFSET sono supportate nei database MySQL e PostgreSQL. Per SQL Server e Oracle, si usano OFFSET, ROWS FETCH e ROWS ONLY per limitare il numero di righe restituite da una query.

Dai un'occhiata al nostro tutorial su Come usare SQL OFFSET per saperne di più sulla paginazione dei dati e sul supporto specifico per database delle clausole OFFSET e LIMIT.

Ordine di esecuzione SQL vs. ordine di scrittura

SQL è un linguaggio dichiarativo, il che significa che l'ordine di esecuzione della query differisce da quello di scrittura. Quindi, invece di specificare come eseguire un'attività, dichiari cosa vuoi e il motore del database decide il modo migliore per ottenerlo. Questo approccio è diverso dai linguaggi di programmazione imperativi come Python o Java, in cui scrivi esplicitamente istruzioni passo dopo passo per l'esecuzione. 

Capire l'ordine di esecuzione SQL cambia il modo in cui pensi alla costruzione delle query. Per esempio, immagina di scrivere una query per filtrare righe in base a un alias creato nella clausola SELECT:

SELECT price * 0.9 AS discounted_price
FROM products
WHERE discounted_price > 100;

A prima vista sembra logico, ma genererà un errore. Perché? Perché la clausola WHERE viene valutata prima della clausola SELECT nell'ordine di esecuzione di SQL. Per risolvere, dovresti usare una sottoquery o HAVING al suo posto:

SELECT price * 0.9 AS discounted_price
FROM products
HAVING discounted_price > 100;

Per approfondire specificamente WHERE e HAVING, leggi il nostro tutorial: La differenza tra WHERE e HAVING in SQL.

Errori comuni e best practice

Anche se l'ordine di esecuzione della query non è influenzato dall'ordine di scrittura, comprendere il flusso di esecuzione è fondamentale per evitare errori comuni e migliorare le prestazioni. I seguenti errori sono direttamente legati a una scarsa comprensione dell'ordine di esecuzione in SQL:

Errori comuni

Ecco gli errori più comuni che possono ostacolare le prestazioni delle tue query.

  • Uso di alias di colonna nella clausola WHERE: Poiché la clausola WHERE viene eseguita prima di SELECT, provare a usare un alias in WHERE produrrà un errore. Capire che SQL valuta WHERE prima di SELECT ti insegna che devi ripetere l'espressione completa invece di fare affidamento su un alias.

  • Uso di HAVING per filtrare righe invece di WHERE: La clausola HAVING viene eseguita dopo GROUP BY ed è pensata per filtrare dati aggregati. Se stai filtrando dati non aggregati, la condizione va nella clausola WHERE. Conoscere la differenza nell'ordine di esecuzione tra WHERE e HAVING ti aiuta a capire dove collocare ogni condizione.

  • Uso scorretto di aggregazioni in SELECT senza GROUP BY: Poiché GROUP BY viene eseguito prima di HAVING o SELECT, non raggruppare i dati prima di applicare una funzione di aggregazione porterà a risultati errati o a errori. Capire l'ordine di esecuzione chiarisce perché queste due clausole devono andare insieme.

  • Uso improprio degli alias nella clausola ORDER BY: A differenza della clausola WHERE, ORDER BY viene valutata dopo SELECT. Questo ti permette di usare gli alias creati in SELECT per l'ordinamento, evitando confusione sapendo quando gli alias sono disponibili.

Best practice

Considera le seguenti best practice per assicurarti che le tue query vengano eseguite come previsto.

  • Filtra presto con WHERE: Poiché la clausola WHERE viene eseguita prima di GROUP BY e JOIN, applicare i filtri prima riduce il numero di righe elaborate dalle clausole successive, migliorando le prestazioni. Filtrando i dati non aggregati il prima possibile, limiti i dati da raggruppare o unire, risparmiando tempo di elaborazione.

  • Pre-aggrega i dati prima dei join: Sapendo che FROM e JOIN sono le prime clausole eseguite, pre-aggregare i dati usando subquery o CTE (common table expressions) ti permette di ridurre il dataset prima del processo di join. Questo assicura che durante il join vengano elaborate meno righe.

  • Ottimizza ORDER BY con indici: Poiché ORDER BY è uno degli ultimi passaggi eseguiti, assicurarti che le colonne usate per l'ordinamento siano indicizzate velocizzerà la query aiutando il database a gestire le operazioni di sorting in modo più efficiente.

  • Evita SELECT * nelle query in produzione: La clausola SELECT viene eseguita dopo filtraggio, raggruppamento e aggregazione, quindi specificare solo le colonne necessarie minimizza la quantità di dati recuperati, riducendo overhead inutili.

Conclusione

Comprendere l'ordine di esecuzione SQL è importante per scrivere query efficienti, accurate e ottimizzate. Abbiamo discusso l'ordine logico di esecuzione delle query in SQL e lo abbiamo confrontato con l'ordine di scrittura. Ti incoraggio a esercitarti scrivendo diverse query per capire meglio l'ordine logico di esecuzione. Padroneggiare questo concetto migliorerà notevolmente la tua capacità di fare troubleshooting e ottimizzare le query SQL.

Se vuoi far avanzare le tue competenze SQL, ti consiglio di provare il percorso di carriera di DataCamp Associate Data Analyst in SQL per diventare un data analyst competente. Anche il corso Reporting in SQL ti aiuterà a diventare esperto nella creazione di report e dashboard complessi per una presentazione efficace dei dati. Infine, dovresti ottenere la SQL Associate Certification per dimostrare la tua padronanza nell'uso di SQL per risolvere problemi di business e distinguerti dagli altri professionisti.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Technical writer di Data Science con esperienza pratica in data analytics, business intelligence e data science. Scrivo contenuti pratici e orientati al settore su SQL, Python, Power BI, Databricks e data engineering, basati su lavoro di analytics reale. La mia scrittura unisce profondità tecnica e impatto sul business, aiutando i professionisti a trasformare i dati in decisioni sicure.

FAQ sull'ordine di esecuzione SQL

In cosa differisce l'esecuzione SQL dall'ordine di scrittura?

L'ordine di esecuzione SQL in genere inizia con la clausola FROM seguita da clausole come WHERE e GROUP BY, mentre l'ordine di scrittura parte dall'istruzione SELECT.

Come si inserisce JOIN nell'ordine di esecuzione?

Le operazioni di JOIN vengono eseguite come parte della clausola FROM.

Posso usare alias di colonna nella clausola WHERE?

No, gli alias di colonna sono definiti nella clausola SELECT, che viene eseguita dopo la clausola WHERE.

Qual è la differenza tra WHERE e HAVING?

WHERE filtra le righe prima del raggruppamento, mentre HAVING filtra dopo GROUP BY e opera su dati aggregati.

L'ordine di esecuzione SQL influisce sulle prestazioni della query?

Sì, capire l'ordine di esecuzione ti permette di ottimizzare le query applicando i filtri in anticipo e riducendo le operazioni non necessarie.

Argomenti

Impara SQL con DataCamp

Corso

Manipolazione dei dati in SQL

4 h
323.6K
Vedi dettagliRight Arrow
Inizia il corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

Mostra altroMostra altro