Il caso Beazley
Nel 1994, Napoleon Beazley ha sparato all’imprenditore sessantatreenne John Luttig all’interno del suo garage mentre cercava di rubargli la macchina di famiglia. Grazie al fatto che avesse poco meno di diciotto anni al momento dell’omicidio, il caso di Beazley ha scatenato un acceso dibattito sulla pena di morte per i minorenni. Tre anni dopo l’esecuzione di Beazley, la Corte Suprema ha proibito l’esecuzione di trasgressori che abbiamo meno di diciotto anni al momento del fatto. (Roper v Simmons, 2005).
Il caso ha fatto clamore anche perché la vittima era il padre del giudice federale John Michael Luttig. Durante gli appelli alla Corte Suprema, tre dei nove giudici si sono ritirati a causa dei loro legami personali con il giudice Luttig, lasciandone solo sei a rivedere il caso.
Napoleon Beazley fece un ultima appassionata dichiarazione sostenendo che un approccio “occhio per occhio” non è un fondamento di giustizia. Il nostro compito è quello di recuperare questa dichiarazione del database.
Una prima query SQL
La query SQL può apparire come una normale frase, ma dovresti vederla com tre mattoncini Lego:
SELECT *
FROM executions
LIMIT 3
.
Come per i Lego, ciascun mattoncino ha una una forma fissa e i diversi mattoncini devono essere posizionati in modi precisi per adattarsi.
Il blocco SELECT
Il blocco SELECT
specifica quali colonne desideri recevere come output della query. Il suo formato è SELECT <colonna>, <colonna>, ...
. Ogni colonna indicata deve essere separata da una virgola ma lo spazio dopo la virgola è opzionale. TL’asterisco (*
) è un carattere speciale che significa che vogliamo tutte le colonne contenute nella tabella.
Commenti SQL
Cliccando su "Show Solution" nell'editor viene visualizzata la soluzione preceduta dai caratteri /*
. Il contenuto fra /*
e */
è considerato un commento e non viene eseguito come codice. Questo è utile per nascondere temporaneamente il codice che non vogliamo eseguire. Per eseguire la soluzione, semplicemente cancella o commenta il tuo codice e togli il commento della soluzione.
I caratteri --
sono ancora un altro modo di identificare i commenti. Vengono usati per definire il resto di una singola riga come commento. Quando si desidera commentare più righe, i caratteri /* ... */
sono più convenienti da usare rispetto all'anteporre --
ad ogni riga.
Il blocco FROM
Il blocco FROM
specifica la tabella da cui estraiamo i dati. Il suo formato + FROM <tabella>
. Viene sempre scritto dopo il blocco SELECT
.
Nel prossimo esempio, osserva che non abbiamo bisogno del blocco FROM
se non utilizziamo nulla da una tabella.
Non è strano che 51 / 2
restituisce 25
piuttosto che 25.5
? Questo succede perché SQL esegue una divisione intera. Per eseguire una divisione decimale, almeno uno degli operandi deve essere un decimale, per esempio 51.0 / 2
. Un trucchetto comune è di moltiplicare uno dei numero per 1.0
in modo da convertirlo in numero decimale. Questa soluzione sarà utile nei capitoli successivi.
Maiuscole
Anche se abbiamo scritto in maiuscolo SELECT
, FROM
e LIMIT
, i comandi SQL non fanno distizione fra maiuscole e minuscole: non sono case-sensitive. Puoi notare che l'editor del codice li riconosce e li formatta come comandi a prescindere da lettere maiuscole e minuscole. Tuttavia, io consciglio di scriverli in maiuscolo in modo da differenziarli da nomi di colonne, tabelle e variabili.
Anche i nomi di colonne, tabelle e variabili non sono case-sensitive in questa versione di SQL, anche se lo sono in molte altre versioni. Per andare sul sicuro, raccomando sempre di considerarli case-sensitive.
Spazi bianchi
Il termine spazi bianchi si riferisce a spazi, tabulazioni, interruzioni di riga e altri caratteri che sono riprodotti come spazi vuoti sulla pagina. Come per le maiuscole, SQL non è molto attento agli spazi fintanto che non si possono confondere, unire, due parole in una. Questo significa che è necessario lasciare almeno un carattere di spazio attorno ad ogni comando — non importa quale o quanti ne utilizzi. A meno che non sia una query molto breve, io preferisco mettere ogni comando su una nuova riga per migliorarne la leggibilità.
Il blocco WHERE
Il blocco WHERE
ci permette di filtrare la tabella per cercare delle righe che rispettino certe condizioni. Il suo formato è WHERE <condizione>
e viene sempre scritto dopo il blocco FROM
. In questo caso, la condizione si riferisce a una dichiarazione Booleana che il computer può valutare per scoprire se è vera o falsa come ex_number = 145
. Puoi immaginare che il computer scorra ogni riga della tabella per controllare se la condizione è vera e, se lo è, restituisce la riga, o meglio le colonne selezionate con il blocco SELECT
, in output.
È chiaro come possiamo utulizzare gli operatori aritmetici come <
e <=
per costruire le condizioni. Esiste anche una collezione di operatori su stringhe per lavorare su di esse.
La più potente fra queste è probabilmente LIKE
. Permette di utilizzare caratteri jolly come %
e _
per combinare vari caratteri. Per esempio, first_name LIKE '%roy'
darà risposta vera per le righe in cui il nome è ‘roy’, ‘Troy’ e ‘Deroy’ ma non ‘royman’. Il carattere jolly _
corrisponderà ad un singolo carattere quindi first_name LIKE '_roy'
troverà solo ‘Troy’.
Virgolette
In SQL, le stringhe sono identificate da virgolette singole. L'apice inverso (backticks in inglese, `
) può essere utilizzato per dare i nome delle colonne e delle tabelle. Questo risulta comodo quando il nome di una colonna o di una tabella è lo stesso di una parola chiave in SQL keyword e quando vi è uno spazo al loro interno. È possibile avere un database con una tabella chiamata 'where' e una colonna 'from'. (Chi sarebbe così crudele da fare questo?!). Dovresti scrivere SELECT `from` FROM `where` WHERE ...
. Questo è un altro esempio che ci fa capire perché usare le maiuscole nei comandi SQL ci può aiutare.
Come hai visto nell’esercizio precedente, si possono realizzare condizioni complesse utilizzando operatori Booleani come NOT
, AND
e OR
. SQL dà precedenza a NOT
poi a AND
e finalmente a OR
. Ma se, come me, sei troppo pigro per ricordarti l’ordine delle precedenze, puoi sempre utilizzare le parentesi per chiarire l’ordine delle operazioni che desideri.
Facciamo un breve quiz per consolidare la tua comprensione.
Ora hai a disposizione gli strumenti che ti servono per completare il nostro progetto.
Non è sorprendente quanto sia profondo ed eloquente Beazley? Ricorda che aveva solo 25 anni quando rilasciò questa dichiarazione e si trovava in prigione da quando ne aveva 18.
Riassunto
Lo scopo di questo capitolo è quello di introdurre il semplice ma potente SELECT <colonna> FROM <tabella> WHERE <condizione>
. Ci permette di filtrare una tabella in modo che il computer controlli riga per riga e scelga quelle per le quali la condizione in WHERE
è vera. Abbiamo anche imparato anche come comporre condizioni abbastanza complesse che possono operare su colonne composte da stringhe, numeri e valori Booleani.
Fino ad ora abbiamo operato a livello di riga, cosa che ci limita aa esaminare i singoli dati puntuali. Nel prossimo capitoli ci focalizzaremo sulle aggregazioni che ci permetteranno di studiare i fenomeni a livello di sistema.