5th Sep 2022 Tempo di lettura: 7 minuti L'ordine delle operazioni SQL Ignacio L. Bisso sql imparare sql nozioni di base di sql Indice Sei operazioni da ordinare: SELECT, FROM, WHERE, GROUP BY, HAVING e ORDER BY Il database dei dipendenti Il cambio nell'ordine delle operazioni se si aggiunge ORDER BY L'aggiunta delle clausole GROUP BY e HAVING alla query L'aggiunta di una nuova operazione: La clausola JOIN Conclusioni 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 è: 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: 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: 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: 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: 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: 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!