Torna all'elenco degli articoli Articoli
Tempo di lettura: 7 minuti

L'ordine delle operazioni SQL

SQL non è un linguaggio di programmazione tradizionale in cui si scrive una sequenza di istruzioni in un determinato ordine di esecuzione. SQL è invece un linguaggio "dichiarativo", il che significa che scrivendo una query SQL si dichiara quali dati ci si aspetta come risultato della query, ma non si indica come ottenerli.

Sei operazioni da ordinare: SELECT, FROM, WHERE, GROUP BY, HAVING e ORDER BY

Con l'aiuto di alcuni esempi, spiegheremo l'ordine di esecuzione delle sei operazioni o parti più comuni di una query SQL. Poiché il database esegue i componenti della query in un ordine specifico, è utile che il programmatore conosca questo ordine. È come seguire una ricetta: bisogna conoscere gli ingredienti e cosa fare con essi, ma bisogna anche sapere in quale ordine eseguire le operazioni. Se il database segue un ordine diverso di operazioni, le prestazioni della query possono diminuire drasticamente.

Il modo migliore per imparare l'ordine delle operazioni in SQL è la pratica. Vi consiglio il percorso SQL Practice sul sito LearnSQL.it. Contiene oltre 600 esercizi per mettere in pratica le vostre abilità SQL. In alternativa potete scegliere il corso più adatto a voi tra gli oltre 30 corsi SQL interattivi che offriamo con vari livelli di competenza.

Il database dei dipendenti

In questo articolo lavoreremo con il database di una tipica azienda i cui dipendenti sono distribuiti in diversi reparti. Ogni dipendente ha: un ID, un nome, uno stipendio e appartiene a un reparto; come si può vedere nelle tabelle seguenti.

Esempio di tabella EMPLOYEE:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

Esempio di tabella DEPARTMENT:

DEPT_NAMEMANAGERBUDGET
ACCOUNTING100300,000
IT 101250,000
SALES 104700,000

In questo articolo useremo anche query SQL utilizzate frequentemente in un'azienda come: "Ottenere i nomi dei dipendenti che lavorano per il reparto IT" o "Ottenere il numero di dipendenti di ogni reparto con uno stipendio superiore a 80.000". Per ciascuna di queste query, analizzeremo l'ordine di esecuzione dei suoi componenti.

Iniziamo con una semplice query per ottenere i nomi dei dipendenti del reparto IT:

SELECT LAST_NAME, FIRST_NAME
  FROM EMPLOYEE
 WHERE DEPARTMENT = 'IT'

Per prima cosa, si esegue FROM EMPLOYEE che fornisce questi dati:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

In secondo luogo, si esegue WHERE DEPARTMENT = 'IT', che restringe il campo a questi risultati:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
101Mary Sexton82,000IT
103AgnesMiller95,000IT

In ultimo, si applica SELECT FIRST_NAME, LAST_NAME, producendo il risultato finale della query:

FIRST_NAMELAST_NAME
Mary Sexton
AgnesMiller

Ottimo! Dopo aver completato l'esaminazione della nostra prima query, possiamo concludere che l'ordine di esecuzione per le query semplici con SELECT, FROM, e WHERE è:

SELECT, FROM e WHERE

Il cambio nell'ordine delle operazioni se si aggiunge ORDER BY

Supponiamo che il vostro capo riceva un report basato sulla query dell'esempio precedente e lo rifiuti perché i nomi dei dipendenti non sono in ordine alfabetico. Per risolvere il problema, è necessario aggiungere una clausola ORDER BY alla query precedente:

  SELECT LAST_NAME, FIRST_NAME
    FROM EMPLOYEE
   WHERE DEPARTMENT = 'IT'
ORDER BY FIRST_NAME

Il processo di esecuzione di questa query è quasi identico a quello dell'esempio precedente. L'unico cambiamento avviene alla fine, quando viene elaborata la clausola ORDER BY. Il risultato finale di questa query ordina le voci in base a FIRST_NAME, come mostrato di seguito:

FIRST_NAMELAST_NAME
AgnesMiller
Mary Sexton

Quindi, se abbiamo SELECT con FROM, WHERE, e ORDER BY, l'ordine di esecuzione è il seguente:

SELECT con FROM, WHERE e ORDER BY

L'aggiunta delle clausole GROUP BY e HAVING alla query

In questo esempio, utilizzeremo una query con GROUP BY. Supponiamo di voler sapere quanti dipendenti in ogni reparto hanno uno stipendio superiore a 80.000 e di voler ottenere il risultato in ordine decrescente in base al numero di persone in ogni reparto. La query per questa ricerca sarebbe la seguente:

  SELECT DEPARTMENT, COUNT(*)
    FROM EMPLOYEES
   WHERE SALARY > 80000
GROUP BY DEPARTMENT
ORDER BY COUNT(*) DESC

Si esegue nuovamente, prima FROM EMPLOYEE, che recupera questi dati:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

In secondo luogo, si esegue WHERE SALARY > 80000, che restringe il campo ai seguenti risultati:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

In terzo luogo, si applica GROUP BY, generando un risultato per ogni valore distinto nelle colonne GROUP BY. Nel nostro esempio, creiamo un risultato per ogni valore distinto in DEPARTMENT:

DEPARTMENT
ACCOUNTING
IT
SALES

In quarto luogo, si applica SELECT con COUNT(*), producendo questo risultato intermedio:

DEPARTMENTCOUNT(*)
ACCOUNTING1
IT 2
SALES 1

In ultimo, si applica la clausola ORDER BY, producendo il risultato finale della query:

DEPARTMENTCOUNT(*)
IT 2
ACCOUNTING1
SALES 1

L'ordine di esecuzione in questo esempio è il seguente:

1-DAL 2-DOVE 3-GRUPPO PER 4-SELEZIONE 5-ORDINE PER

Nel prossimo esempio, aggiungeremo la clausola HAVING. HAVING non è comunemente usata in SQL come altre clausole che abbiamo visto finora. Il modo migliore per descrivere HAVING è considerarla come la clausola WHERE di GROUP BY. In altre parole, è un modo per filtrare o scartare alcuni dei gruppi di risultati creati da GROUP BY.

Supponiamo di voler ottenere tutti i dipartimenti, tranne quello di SALES, con uno stipendio medio superiore a 80.000. La query per questa situazione sarebbe la seguente:

  SELECT DEPARTMENT
    FROM EMPLOYEES
   WHERE DEPARTMENT <> 'SALES'
GROUP BY DEPARTMENT
  HAVING AVG(SALARY) > 80000

Si esegue nuovamente, prima FROM EMPLOYEE, che recupera questi dati:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100 James Smith 78,000 ACCOUNTING
101 Mary Sexton 82,000 IT
102 Chun Yen 80,500 ACCOUNTING
103 Agnes Miller 95,000 IT
104 Dmitry Komer 120,000 SALES

In secondo luogo, viene elaborata la clausola WHERE, escludendo i risultati di SALES:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100 James Smith 78,000 ACCOUNTING
101 Mary Sexton 82,000 IT
102 Chun Yen 80,500 ACCOUNTING
103 Agnes Miller 95,000 IT

In terzo luogo, viene applicato GROUP BY, che genera i seguenti risultati:

DEPARTMENTAVG(SALARY)
ACCOUNTING 79,250
IT 88,500

In quarto luogo, viene applicata la clausola HAVING AVG(SALARY) > 80000 per filtrare il gruppo di risultati generati da GROUP BY:

DEPARTMENTAVG(SALARY)
IT 88,500

In ultimo, viene applicata la clausola SELECT, producendo il risultato finale della query:

DEPARTMENT
IT

L'ordine di esecuzione in questo esempio è il seguente:

1 - DA, 2 - DOVE, 3 - RAGGRUPPA PER, 4 - AVENDO, 5 - SELEZIONA

L'aggiunta di una nuova operazione: La clausola JOIN

Gli esempi precedenti riguardavano una sola tabella, aggiungiamo ora una seconda tabella utilizzando la clausola JOIN. Supponiamo di voler ottenere i cognomi e l'ID dei dipendenti che lavorano per i dipartimenti con un budget superiore a 275.000. La query per questa ricerca è la seguente:

SELECT EMPLOYEE_ID, LAST_NAME
  FROM EMPLOYEES
  JOIN DEPARTMENT
    ON DEPARTMENT = DEPT_NAME
 WHERE BUDGET > 275000

Si esegue nuovamente, prima FROM EMPLOYEE, che recupera questi dati:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENT
100James Smith 78,000 ACCOUNTING
101Mary Sexton82,000 IT
102Chun Yen 80,500 ACCOUNTING
103Agnes Miller95,000 IT
104DmitryKomer 120,000SALES

In secondo luogo, si applica la clausola JOIN che genera un nuovo risultato intermedio che combina entrambe le tabelle:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENTDEPT_NAMEMANAGERBUDGET
100James Smith 78,000 ACCOUNTINGACCOUNTING100300,000
101Mary Sexton82,000 IT IT 101250,000
102Chun Yen 80,500 ACCOUNTINGACCOUNTING100300,000
103Agnes Miller95,000 IT IT 101250,000
104DmitryKomer 120,000SALES SALES 104700,000

In terzo luogo, si applica WHERE BUDGET > 275000:

EMPLOYEE_IDFIRST_NAMELAST_NAMESALARYDEPARTMENTDEPT_NAMEMANAGERBUDGET
100James Smith78,000 ACCOUNTINGACCOUNTING100300,000
102Chun Yen 80,500 ACCOUNTINGACCOUNTING100300,000
104DmitryKomer120,000SALES SALES 104700,000

In ultimo, viene eseguito SELECT EMPLOYEE_ID, LAST_NAME, che produce il risultato finale della query:

EMPLOYEE_IDLAST_NAME
100Smith
102Yen
104Komer

L'ordine di esecuzione in questo esempio è il seguente:

1 - DA, 2 - UNISCI, 3 - DOVE, 4 - SELEZIONA

Conclusioni

In questo articolo abbiamo trattato l'ordine di esecuzione delle query SQL attraverso alcuni esempi. Da questi esempi si evince che esiste un ordine di esecuzione, ma questo può variare a seconda delle clausole presenti nella query. Come linea guida di carattere generale, l'ordine di esecuzione è il seguente:

1 - FROM, 2 - JOIN, 3 - WHERE, 4 - GROUP BY, 5 - HAVING, 6 - SELECT, 7 - ORDER BY

Tuttavia, se una di queste clausole non è presente, l'ordine di esecuzione sarà diverso. Il linguaggio SQL è piuttosto facile da usare, ma una volta che ci si è addentrati, ci sono molti concetti interessanti da esplorare. Date un'occhiata a questo corso online per entrare nell'affascinante mondo SQL e scoprire dove può portarvi!