SQL (Structured Query Language) è lo standard per l’interrogazione dei database relazionali

Guida introduttiva per districarsi tra le prime query e comprendere la logica del linguaggio

SQL (Structured Query Language), traducibile come “linguaggio strutturato per interrogazioni” è certamente il linguaggio informatico più noto per interagire con i DBMS (Data Base Management Systems) relazionali.

La sua ubiquità e popolarità è tale che può essere considerato lo standard de facto per questo tipo di operazioni e le sue declinazioni e applicazioni sono ormai consolidate e vastissime.

SQL: ma come si pronuncia?

Il tema è ampiamente dibattuto. In linea di principio gli appartenenti alla vecchia scuola utilizzano la dicitura estesa, pronunciandolo come “sequel”. Questo deriva dalla genesi del linguaggio, che inizialmente era conosciuto proprio con il nome SEQUEL:

We changed the original name “SEQUEL” to SQL because we got a letter from somebody’s lawyer that said the name “SEQUEL” belonged to them. We shortened it to SQL, for Structured Query Language, and the product was known as SQL/DS [citazione dai creatori di SQL estratta dalla University Digital Conservancy].

In via formale, la pronuncia è invece “S-Q-L”, e questa pronuncia sembra quella che sta prendendo comunemente piede.

Ci troviamo in un interregno dove entrambe sono ancora accettabili, anche se il dibattito è apertissimo.

SQL: cosa è?

  1. SQL è un linguaggio dichiarativo non procedurale. Come abbiamo già avuto modo di argomentare in passato:

    La programmazione dichiarativa si basa e focalizza sul risultato da ottenere, senza esplicitare direttamente la sequenza puntuale di operazioni necessarie per ottenerlo. […] Nella programmazione dichiarativa, la complessità viene nascosta agli occhi dell’utente, lasciando al programma computazionale l’onere di eseguire tale attività (Aziona – Paradigmi di programmazione).

  2. SQL è un linguaggio relazionalmente completo: ogni espressione dell’algebra relazionale può essere tradotta in una corrispondente espressione SQL.
  3. SQL permette di:
    • Manipolare dati secondo una logica CRUD (Create – Read – Update – Delete) (DML – Data Manipulation Language).
    • Definire i dati e tabelle (DDL – Data Definition Language).
    • Controllare accessi alle tabelle e alla base dati (DCL – Data Control Language).
  4. SQL è basato su tabelle invece che su relazioni, per garantire la massima efficienza computazionale su operazioni di grandi dimensioni.
  5. SQL è standardizzato secondo i parametri ANSI e ISO. Nuove versioni dello standard sono pubblicate con una certa costanza; dopo la versione 2016, che è perdurata per 7 anni, la più recente risale al 2023.

La storia di SQL

Gli albori

La genesi di SQL risale agli anni ’70. In quegli anni Edgar F. Codd, informatico laureato ad Oxford e insignito del prestigioso premio Turing, formulò i principi fondamentali del modello relazionale dei database.

Codd era già in pianta stabile residente presso gli IBM Research Laboratory, diviso tra New York e San Jose, California.

Nel suo articolo  “A Relational Model of Data for Large Shared Data Banks“, Codd introdusse concetti come tabelle, chiavi primarie e struttura relazionale dei dati, fornendo una base teorica per i moderni sistemi di gestione di database relazionali (RDBMS).

Il linguaggio SQL stesso fu sviluppato nei laboratori di ricerca IBM nel corso degli anni ’70 e ’80.

Lo sviluppo del linguaggio SQL a partire dalle ricerche di Codd fu portato avanti da Donald Chamberlin e Raymond Boyce.

La prima versione si chiamava SEQUEL – “Structured English QUEry Language“.

Nel 1974, IBM introdusse System R, uno dei primi sistemi di gestione di database relazionali, che includeva un linguaggio di interrogazione chiamato SQUARE. Durante gli anni successivi, diversi sotto linguaggi di interrogazione relazionale vennero sviluppati da altre aziende.

Nel 1979, Oracle Corporation rilasciò Oracle V2, che includeva un linguaggio di interrogazione chiamato Oracle SQL.

Verso la maturità

Successivamente, durante il 1986, l’American National Standards Institute (ANSI) riconobbe SQL come standard ufficiale, stabilendo la sua struttura sintattica e semantica. Da allora, SQL è stato continuamente sviluppato e migliorato attraverso varie versioni standardizzate.

Nel corso degli anni ’90, SQL divenne onnipresente nei sistemi di gestione di database, con molti fornitori di database che implementarono le proprie estensioni del linguaggio.

Nel 1999, l’ANSI e l’International Organization for Standardization (ISO) rilasciarono uno standard SQL aggiornato chiamato SQL:1999, che includeva molte nuove caratteristiche, come le procedure memorizzate e i trigger.

Successivamente, nuove versioni dello standard sono state rilasciate, aggiungendo funzionalità e migliorando la coerenza tra i diversi sistemi di gestione di database.

Gli sviluppi più recenti si concentrano sull’integrazione con tecnologie moderne come il cloud computing e l’analisi dei big data.

Database e DBMS: cosa sono?

L’utilizzo di SQL è strettamente connesso al significato di database.

Database

Il termine afferisce genericamente a una collezione organizzata di dati.

Dal punto di vista strettamente informatico un database può trovare espressione in più file system ai quali si accede mediante un sistema di gestione di database (DMBS), ma anche in un foglio di calcolo o altre tipologie di supporti meno canonici.

All’interno di un database i dati sono tra loro collegati mediante associazioni e relazioni.

Un esempio classico di database potrebbe essere l’elenco telefonico.

DBMS

É un software che fornisce un’interfaccia per gestire, organizzare, interagire con un database e i suoi componenti. Oltre che alle attività sui dati stessi, un DBMS gestisce anche gli accessi concorrenti ai dati, l’integrità dei dati stessi, la sicurezza del database.

Esistono molteplici tipologie di database (relazionali, a oggetti, gerarchici, a grafo), ma per le finalità esplorative del linguaggio SQL ci concentreremo sui database relazionali.

I database relazionali sono gestiti a loro volta con una tipologia specifica di DBMS relazionali, i RDBMS.

Un RDBMS è una forma specializzata di DBMS che segue il modello relazionale. I dati sono organizzati in tabelle con righe e colonne, e le relazioni tra le tabelle sono gestite attraverso chiavi primarie e chiavi esterne.

Componenti base di un database relazionale

  • Tabelle (TABLE): le tabelle sono la struttura di base di un database relazionale. Ogni tabella rappresenta un’entità o una relazione specifica e contiene colonne che definiscono gli attributi di quella entità.
  • Righe (ROWS): le righe della tabella, dove sono riportati i dati aventi valori di diverso tipo (numerici interi, numerici decimali, testuali, booleani, etc.). La definizione dei tipi è un punto determinante per il corretto popolamento di un database. Ciascuna riga rappresenta un oggetto del database, rappresentato da diverse tipologie di attributi (es. nome, cognome, indirizzo). Un buona panoramica sulle tipologie di data type e loro peculiarità è offerto dalla Facoltà di Ingegneria di Pisa in questa dispensa.
  • Colonne (COLUMNS): rappresentano le colonne di dati, tra loro omogenei (es. colonna nome, colonna data di nascita) e raggruppati sotto le rispettive intestazioni (HEADERS) della tabella, ossia i titoli delle singole colonne dati.
  • Chiave primaria (PRIMARY KEY): è un attributo o un insieme di attributi che serve a identificare univocamente ciascuna riga in una tabella. La chiave primaria è un concetto fondamentale nel modello relazionale dei database e svolge un ruolo cruciale nell’assicurare l’integrità dei dati e nel facilitare la gestione delle relazioni tra le tabelle.
  • Chiave esterna (FOREIGN KEY): è un attributo o un insieme di attributi in una tabella che stabilisce una relazione con la chiave primaria di un’altra tabella. Questo meccanismo di chiavi esterne crea collegamenti tra tabelle.
  • Viste (VIEWS): sono rappresentazioni virtuali di dati basate su query definite. Consentono di vedere solo una parte specifica dei dati, semplificando le operazioni di interrogazione.
  • Procedure memorizzate (STORED PROCEDURES): sono funzioni o blocchi di codice SQL che possono essere eseguiti iterativamente per ritornare agilmente operazioni di frequente utilizzo.

SQL: la sintassi base

In virtù del paradigma dichiarativo, la sintassi di SQL inizia tipicamente con una parola chiave che dichiara un’azione: SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, CREATE, USE, SHOW.

A dispetto dell’evidenza (e dei meme), SQL non è case-sensitive nei comandi. Quindi “SELECT” e “select” hanno lo stesso significato in una query.

La tradizione di scrivere i comandi e funzioni in caratteri maiuscoli è essenzialmente per ragioni di leggibilità.

Gli statement si chiudono con punto e virgola “;”. Il carattere jolly è “*”, mentre i commenti sono segnalati con “- -“.

Tipicamente invece i nomi delle tabelle e intestazioni seguono puntualmente la formattazione della fonte, quindi “Address” è diverso da “address” all’interno di una query.

Le consuetudini sulla formattazione potrebbero variare nelle diverse adozioni di SQL e declinazioni (MySQL, SQL Server, PostgreSQL, SQLite, MariaDB, etc.).

Proviamo ora a prendere confidenza con alcuni comandi base.

Anche se non si ha a disposizione un RDBMS su cui testare, esistono diversi IDE online, tra i quali segnaliamo:

SQL: le operazioni base

É ora il momento di sporcarci le mani e provare a sperimentare qualche comando base di SQL.

Creiamo la nostra prima tabella

Iniziamo con il creare la nostra tabella.

Nella tabella mettiamo alcuni dei nostri videogiochi preferiti con il loro anno di uscita e il voto relativo.

Vogliamo che:

  • La tabella si chiami “Videogiochi”.
  • Che la chiave primaria sia popolata automaticamente e si incrementi di conseguenza ogni nuovo inserimento.
  • Che il titolo del videogioco sia una stringa a lunghezza variabile, non nulla.
  • Che l’anno di uscita sia un valore intero non nullo.
  • Che il rating sia un valore numero tra 1 e 5.

CREATE TABLE Videogiochi (
ID INT PRIMARY KEY AUTO_INCREMENT,
Nome VARCHAR(100) NOT NULL,
AnnoUscita INT NOT NULL,
Rating INT CHECK (Rating >= 1 AND Rating <= 5)
);

Ora abbiamo la nostra scatola, che naturalmente sarà vuota.
Noteremo che lanciando questi comandi sul ns IDE non ritornerà alcun risultato visibile.

Inseriamo i primi dati

Ora popoliamo la tabella con qualche dato.

INSERT INTO Videogiochi (Nome, AnnoUscita, Rating) VALUES
('The Legend of Zelda: Breath of the Wild', 2017, 5),
('Red Dead Redemption 2', 2018, 4),
('Minecraft', 2011, 5),
('Fortnite', 2017, 3),
('Cyberpunk 2077', 2020, 2),
('Among Us', 2018, 4);

Abbiamo fatto un buon lavoro? Diamo un’occhiata selezionando tutto il contenuto della tabella appena popolata.

SELECT * FROM Videogiochi;

In alternativa, se non vogliamo ricorrere al SELECT *, possiamo procedere nominando le colonne di interesse.

SELECT ID, Nome, AnnoUscita, Rating FROM Videogiochi;

Se tutto è andato come da attese, dovremmo vedere qualcosa del genere:

aziona sql 1

Ricerchiamo dati puntuali

Proviamo ora a cercare dei dati specifici, lanciando le appropriate queries.

Dopo ogni blocco di istruzioni, eseguiamolo con il comando RUN. Sarà visibile a schermo il risultato di ciascuna ricerca.

Ricerchiamo tutti i videogiochi che hanno un rating superiore a 3.

SELECT Nome
FROM Videogiochi
WHERE Rating > 3;

Ora vogliamo trovare il videogioco con il rating più basso dell’intera tabella.

Di questo, vogliamo sapere nome, anno di uscita e rating (mi dispiace, Cyberpunk 2077! Ma i rating sono in realtà numeri assegnati casualmente solo per le finalità di questo tutorial).

SELECT Nome, AnnoUscita, Rating
FROM Videogiochi
ORDER BY Rating ASC
LIMIT 1;

Ora vogliamo estrarre tutti i videogiochi ordinati per anno di uscita, sia crescente che discendente.

SELECT Nome, AnnoUscita
FROM Videogiochi
ORDER BY AnnoUscita ASC;

SELECT Nome, AnnoUscita
FROM Videogiochi
ORDER BY AnnoUscita ASC;

In ultimo vogliamo focalizzarci sull’anno di uscita dei videogiochi e vedere la media delle votazioni di ciascun anno.

SELECT AnnoUscita AS AnnoDiRiferimento, AVG(Rating) AS MediaRating
FROM Videogiochi
GROUP BY AnnoUscita;

Arricchiamo i dati iniziali con JOIN

Abbiamo già fatto un discreto lavoro!

Anche se si tratta di queries molto semplici la potenza del linguaggio SQL e della struttura del database relazionale emerge decisamente. Con un minimo lavoro di astrazione è possibile comprendere anche come una interfaccia utente lavori dietro le quinte per eseguire comandi e operazioni su un set di dati grezzo sottostante.

Procediamo ora con un nuovo set di operazioni per arricchire il nostro database.

Il desiderata è ottenere una classificazione ulteriore per ciascun videogioco, aggiungendo anche il genere.

Per prima cosa quindi creiamo una nuova tabella atta a ospitare i generi di interesse.

CREATE TABLE Generi (
ID_Genere INT PRIMARY KEY,
NomeGenere VARCHAR(50) NOT NULL
);

Dopodiché, popoliamola.

INSERT INTO Generi (ID_Genere, NomeGenere) VALUES
(1, 'Azione'),
(2, 'Avventura'),
(3, 'RPG'),
(4, 'Simulazione');

Ora modifichiamo la tabella “Videogiochi” per aggiungere una colonna “ID_Genere”.

ALTER TABLE Videogiochi ADD COLUMN ID_Genere INT;

E infine aggiorniamo la tabella “Videogiochi” con ID_Genere.

UPDATE Videogiochi SET ID_Genere = 1 WHERE Nome = 'Red Dead Redemption 2';
UPDATE Videogiochi SET ID_Genere = 2 WHERE Nome = 'The Legend of Zelda: Breath of the Wild';
UPDATE Videogiochi SET ID_Genere = 3 WHERE Nome = 'Cyberpunk 2077';
UPDATE Videogiochi SET ID_Genere = 4 WHERE Nome = 'Minecraft';

Infine, andiamo a visualizzare il risultato ottenuto.

SELECT Videogiochi.Nome, Generi.NomeGenere
FROM Videogiochi
JOIN Generi ON Videogiochi.ID_Genere = Generi.ID_Genere;

Non dovremmo aver problemi a visualizzare a schermo il risultato desiderato.

SQL: il tutorial passo-passo

Ecco qui il codice per intero che può essere anche direttamente testato sull’IDE desiderato.

Un mondo di possibilità

Imparare almeno i rudimenti di SQL è un asset fondamentale per operare nel mondo dei dati.

Le possibilità di utilizzo sono pressoché illimitate e i casi d’uso sorprendenti.

SQL e le sue applicazioni trovano uso in ogni linguaggio di programmazione, oltre che in molti strumenti e applicativi insospettabili.

Looker Studio permette di creare queries per visualizzare i dati; Excel permette di sostituire le formule direttamente con queries SQL che ritornano il risultato dinamicamente.

Possiamo affermare che SQL sia un vero investimento per il professionista che opera nel mondo dei dati, forse più che inseguire l’ultimo framework o libreria.

Resta sempre sul pezzo con i nostri tutorial

e iscriviti alla newsletter per non perdere i prossimi contenuti!

aziona risorse ebook guida al debito tecnico

Scarica l’ebook “La guida definitiva alla comprensione del Debito Tecnico”

Iscriviti alla newsletter e scarica l’ebook.

Ricevi aggiornamenti, tips e approfondimenti su tecnologia, innovazione e imprenditoria.