01 · Le fondamenta
Che cos’è un database relazionale?
Un database conserva informazioni in modo ordinato e permette di cercarle, aggiornarle e collegarle. Nei database relazionali i dati sono divisi in tabelle. Ogni riga rappresenta un elemento; ogni colonna descrive una sua caratteristica.
In una scuola potremmo usare una tabella studenti, una tabella classi e una tabella valutazioni. La separazione evita ripetizioni e rende i dati più coerenti.
insieme organizzato di dati gestito da un software chiamato DBMS
struttura composta da colonne e righe, dedicata a un tipo di oggetto
attributo con un nome e un tipo di dato, per esempio nome TEXT
singolo record, per esempio uno studente
valore univoco che identifica ogni riga
colonna che collega una tabella a un’altra
La chiave primaria
Due studenti possono chiamarsi allo stesso modo, perciò il nome non è un identificatore affidabile. Una colonna id con vincolo PRIMARY KEY assegna a ogni record un valore unico.
CREATE TABLE studenti (
id INTEGER PRIMARY KEY,
nome VARCHAR(60) NOT NULL,
classe VARCHAR(5) NOT NULL,
voto DECIMAL(4,2),
citta VARCHAR(60)
);02 · Leggere i dati
SELECT, FROM, alias e ordinamento.
Una query di lettura comincia con SELECT, che indica le colonne da mostrare, e prosegue con FROM, che indica la tabella. L’asterisco seleziona tutte le colonne, ma nei progetti reali è preferibile specificare ciò che serve.
SELECT nome, classe, voto
FROM studenti;Un alias rende più leggibile il risultato senza rinominare la colonna nel database.
SELECT nome AS studente, voto AS media
FROM studenti
ORDER BY voto DESC, nome ASC
LIMIT 5;03 · Scegliere le righe
WHERE e gli operatori di confronto.
WHERE mantiene soltanto le righe che soddisfano una condizione. Puoi usare =, <>, >, <, >= e <=. Le stringhe vanno tra apici singoli.
SELECT nome, classe, voto
FROM studenti
WHERE classe = '4B' AND voto >= 7
ORDER BY voto DESC;nome LIKE 'Mar%'inizia con Marclasse IN ('4A','4B')uno dei valorivoto BETWEEN 6 AND 8estremi inclusivoto IS NULLvalore mancante04 · Riassumere i dati
COUNT, AVG, GROUP BY e HAVING.
Le funzioni aggregate trasformano molte righe in un risultato sintetico: COUNT conta, SUM somma, AVG calcola la media, MIN e MAX trovano gli estremi.
SELECT classe,
COUNT(*) AS numero_studenti,
ROUND(AVG(voto), 2) AS media_classe
FROM studenti
GROUP BY classe
HAVING AVG(voto) >= 7
ORDER BY media_classe DESC;WHERE filtra le righe prima del raggruppamento; HAVING filtra i gruppi dopo il calcolo delle funzioni aggregate. Questa distinzione risolve molti errori tipici.
05 · Collegare le tabelle
Le JOIN senza confusione.
Una relazione nasce quando una chiave esterna contiene il valore della chiave primaria di un’altra tabella. Se studenti.classe_id punta a classi.id, una JOIN può mostrare nella stessa risposta il nome dello studente e l’aula della classe.
classe_idid PRIMARY KEYSELECT s.nome, c.nome AS classe, c.aula
FROM studenti AS s
INNER JOIN classi AS c
ON s.classe_id = c.id
ORDER BY c.nome, s.nome;Restituisce soltanto le righe che trovano una corrispondenza in entrambe le tabelle.
Restituisce tutte le righe della tabella a sinistra, anche quando a destra non c’è corrispondenza.
06 · Scrivere e modificare
INSERT, UPDATE e DELETE in sicurezza.
INSERT INTO studenti (id, nome, classe, voto, citta)
VALUES (7, 'Nadia', '4B', 8, 'Caltagirone');UPDATE studenti
SET voto = 9
WHERE id = 7;DELETE FROM studenti
WHERE id = 7;07 · Dalla richiesta alla query
Un metodo in cinque passaggi.
- 1Definisci la domanda
Che cosa deve mostrare esattamente il risultato?
- 2Individua le tabelle
Quali entità contengono i dati necessari?
- 3Stabilisci le relazioni
Quali chiavi collegano le tabelle?
- 4Scrivi la query a strati
Parti da SELECT e FROM, poi aggiungi filtri e ordinamento.
- 5Verifica il risultato
Controlla righe, duplicati, NULL e casi limite.
Mostrare gli studenti con almeno 8, indicando classe e aula.
SELECT s.nome, s.voto, c.nome AS classe, c.aula
FROM studenti AS s
JOIN classi AS c ON s.classe_id = c.id
WHERE s.voto >= 8
ORDER BY s.voto DESC, s.nome ASC;08 · Debug
Gli errori più frequenti.
- Dimenticare una virgola tra le colonne della SELECT.
- Scrivere il nome di una colonna che non esiste o è ambiguo.
- Usare doppi apici al posto degli apici singoli per i valori testuali.
- Confrontare NULL con il segno uguale.
- Usare una funzione aggregata senza il GROUP BY necessario.
- Creare una JOIN senza condizione ON e moltiplicare le righe.
- Eseguire UPDATE o DELETE senza verificare la WHERE.
09 · Allenamento
Esercizi progressivi con soluzione.
BaseMostra nome e città di tutti gli studenti, in ordine alfabetico.
SELECT nome, citta FROM studenti ORDER BY nome ASC;FiltriTrova gli studenti della 4B con voto compreso tra 7 e 9.
SELECT nome, voto FROM studenti WHERE classe = '4B' AND voto BETWEEN 7 AND 9;AggregazioniCalcola il voto medio per città mostrando soltanto le città con almeno due studenti.
SELECT citta, AVG(voto) AS media FROM studenti GROUP BY citta HAVING COUNT(*) >= 2;JOINMostra ogni studente con il nome della sua classe, anche se la classe non è stata assegnata.
SELECT s.nome, c.nome AS classe FROM studenti s LEFT JOIN classi c ON s.classe_id = c.id;ModificaAumenta di un punto i voti inferiori a 6, senza superare 10.
UPDATE studenti SET voto = voto + 1 WHERE voto < 6;Schema finale
Domanda → tabelle → relazioni → query → verifica.
SQL diventa più semplice quando traduci una richiesta in piccoli passaggi. Ora usa il laboratorio per allenarti sulle query di lettura.
Vai al laboratorio SQLFonti e approfondimenti
Documentazione ufficiale: PostgreSQL — The SQL Language, SQLite — SELECT e MySQL — SQL Statements.
