Le librerie e il web sono piene di manuali sul linguaggio SQL, molti dei quali estremamente precisi e approfonditi. Io voglio provare ad approcciarmi alla didattica in maniera diversa, non soffermandomi sulla sintassi, ma sul ragionamento necessario per tradurre del linguaggio naturale in una query SQL. Ritengo che la natura dichiarativa dell’SQL richieda un approccio didattico differente rispetto agli altri linguaggi di programmazione.
Negli anni ’70, prima di una disputa legale per ragioni di brevetto, il nome del nostro linguaggio preferito era SEQUEL. Purtroppo la caduta della “E” ha tolto evidenza ad un aspetto molto significativo del nome: la lettera “E” stava per “English” per sottolineare la stretta vicinanza tra l’SQL e la lingua inglese parlata nel quotidiano.
Come parliamo e come programmiamo?
Nel libro Training Kit (Exam 70-461) Querying Microsoft SQL Server 2012 (MCSA) troviamo un esempio chiarificatore: ad un essere umano ci rivolgiamo in modo naturale con una frase del tipo
“Prendi una mela dal frigorifero”.
Se parlassimo ad un robot (o programmassimo in un altro linguaggio) riformuleremmo la frase in questo modo più algoritmico
“Vai al frigorifero e prendi una mela”
in quanto sentiremmo l’esigenza di impartire le istruzioni con un ordine più rigido. Ebbene, la programmazione in Sql ricalca il primo modo di esprimersi, quello tra esseri umani. Quando scriviamo una query SQL dobbiamo specificare prima i nomi delle colonne (all’interno della clausola select) e solo in seguito il nome delle tabelle (nella clausola from). Con un po’ di fantasia, la query esatta sarà
SELECT mela FROM frigorifero
invece di una più algoritmica
FROM frigorifero SELECT mela
Come scrivere una query SQL
Partendo da queste premesse, ho creato una video lezione che accompagni il lettore nella scrittura delle prime query in SQL.
Sei passi per scrivere una query SQL
Un possibile paradigma per scrivere una query SQL consiste nel seguire, in sequenza, questi passi:
- iniziamo ponendoci questa domanda: quali tabelle del Database contengono i dati necessari per la mia query? Se ne abbiamo una sola, allora possiamo inserirla direttamente nella FROM; se invece i dati sono in più tabelle, allora dobbiamo collegarle con una JOIN;
- individuiamo il perimetro di analisi: dobbiamo analizzare tutti i dati delle tabelle individuate nel passo precedente? Se la risposta è sì allora posso andare al punto 3, altrimenti dovrò prima scrivere le condizioni che i dati devono soddisfare all’interno della clausola WHERE;
- individuiamo quello che sarà il soggetto nell’output della query. Mi spiego con degli esempi: se voglio calcolare il numero di clienti per ogni regione di residenza, allora dal punto 2) avrò un insieme di clienti, ma il soggetto o informazione chiave dell’ouput sarà la regione, non il cliente! Analogamente, per calcolare il fatturato annuo, dal punto 2) avrò un insieme di fatture, ma anche in questo caso il soggetto sarà diverso: dovrò riportare per prima cosa i vari anni di fatturazione. Per implementare questo cambio di granularità dei dati con l’SQL potrò utilizzare la GROUP BY;
- a questo punto riporterò nella SELECT le stesse colonne inserite nella GROUP BY e potrò aggiungere delle funzioni di aggregazione per calcolare medie, somme e conteggi;
- se volessi eseguire un ulteriore filtro dei dati tramite il risultati delle aggregazioni posso utilizzare l’HAVING;
- solo alla fine, potrò decidere se stabilire l’ordinamento dei dati in output con una clausola ORDER BY. A meno che non ci sia espressamente richiesto, inseriamo l’ordinamento solo quando l’output ha una dimensione contenuta. Altrimenti potremmo trovarci di fronte a pesanti rallentamenti nei tempi di esecuzione della query.
Continua a imparare
- Approfondisci l’utilizzo della clausola Where
- Creiamo tabelle su un Database relazionale
- Il mio manuale SQL