SQL

Indice dei contenuti

Introduzione

SQL (= Structured Query Language) è un linguaggio utile a lavorare con database relazionali.

Per esempio, esso consente di:

Noi ci foclizzeremo sulle funzionalità DQL del linguaggio, ovvero impareremo anzitutto come ottenere delle informazioni da basi di dati pre-esistenti, attraverso le cosiddette interrogazioni SQL.

Dialetti SQL

SQL è un linguaggio utilizzatissimo per interrogazioni di basi di dati. Esistono molti software per la gestione di dati, costruiti sulla base del linguaggio SQL: i DBMS (= Data Base Management System).

Da anni esiste uno standard, il quale definisce univocamente la sintassi del linguaggio SQL. Tuttavia, ciascun DBMS ha introdotto delle modifiche nel linguaggio SQL standard, portando alla formazione di molteplici dialetti SQL. Tra le decine, eccone alcune:

Di fatto, noi studieremo uno di questi dialetti SQL. Come sempre, l’importante sarà capire il funzionamento intrinseco del linguaggio: eventuali piccole variazioni sintattiche possono essere memorizzate all’occorrenza.

Per studiare e fare pratica di SQL, utilizzeremo l’IDE SQLite Online, cui si può accedere da qualsiasi browser.

Se vuoi una risorsa in italiano, ecco qui delle vecchie ma valide diapositive del corso “Basi di dati 1” del Politecnico di Milano.

Funzioni aggregate

Funzione aggregata Risultato
COUNT Cardinalità
SUM Sommatoria
MAX Massimo
MIN Minimo
AVG Media

Le funzioni aggregate possono essere utilizzate solo nelle clausole SELECT ed HAVING.

Alcune osservazioni:

Query su più tabelle

Quando si effettua una query che coinvolge più tabelle, bisogna prestare attenzione al legame esistente tra di esse.

Consideriamo un semplice database costituito dalle due seguenti tabelle:

patient_id province_id
1 QC
2 QC
3 ON
province_id province_name
QC Quebec
ON Ontario

Vogliamo ottenere il patient_id di coloro che vivono in Quebec.

Il primo tentativo di query potrebbe essere il seguente:

SELECT p.patient_id
FROM patients p, province_names pn
WHERE pn.province_name == "Quebec"

Il risultato di questa semplice interrogazione è:

patient_id
1
2
3

Il patient_id == 3, pur non corrispondendo a “Quebec”, è presente nei risultati! Come è potuto accadere questo errore?

Così: quando si effettua una query su più tabelle (oppure quando si utilizza la clausola JOIN su più tabelle), SQL si limita a calcolare il prodotto cartesiano tra quelle tabelle, ovvero produce tutte le possibili combinazioni che si possono ottenere scegliendo una riga qualsiasi della prima tabella e una riga qualsiasi della seconda tabella.

In questo prodotto cartesiano, saranno presenti numerose righe prive di senso, nelle quali, ad esempio, un paziente con province_id == ON sarà associato a una provincia con province_id == QC.

Come possiamo sbarazzarci di questi risultati privi di senso?

Semplicemente, dobbiamo ricordarci di esplicitare quali sono gli attributi che legano le tabelle, ovvero quegli attributi che devono essere uguali affinché il risultato ottenuto sia sensato.

La query precedente deve essere modificata in questo modo:

SELECT p.patient_id
FROM patients p, province_names pn
WHERE pn.province_name == "Quebec" AND p.province_id == pn.province_id

La seconda condizione, appena aggiunta nella clausola WHERE, indica il legame tra le tabelle patients e province_names, escludendo dal risultato tutte le possibili combinazioni prive di senso.

Il risultato di questa interrogazione è quello desiderato:

patient_id
1
2

Operatori usati nella clausola WHERE