Lab Informatica · Modulo 02

SQL: dai dati alle risposte.

Impara a progettare tabelle e interrogare un database relazionale. Parti da una semplice SELECT, poi costruisci filtri, raggruppamenti e collegamenti tra tabelle con un metodo chiaro e verificabile.

Guida completa

Imparare SQL con un metodo.

Gli esempi usano un piccolo database scolastico. Copia le query, leggile nell’ordine corretto e prova a prevedere il risultato prima di eseguirle.

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.

Database

insieme organizzato di dati gestito da un software chiamato DBMS

Tabella

struttura composta da colonne e righe, dedicata a un tipo di oggetto

Colonna

attributo con un nome e un tipo di dato, per esempio nome TEXT

Riga

singolo record, per esempio uno studente

Chiave primaria

valore univoco che identifica ogni riga

Chiave esterna

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.

Tabella studenti
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.

Selezionare colonne
SELECT nome, classe, voto
FROM studenti;

Un alias rende più leggibile il risultato senza rinominare la colonna nel database.

Alias, ordinamento e limite
SELECT nome AS studente, voto AS media
FROM studenti
ORDER BY voto DESC, nome ASC
LIMIT 5;
Ordine di scritturaSELECTFROMWHEREGROUP BYHAVINGORDER BYLIMIT

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.

Confronti e operatori logici
SELECT nome, classe, voto
FROM studenti
WHERE classe = '4B' AND voto >= 7
ORDER BY voto DESC;
LIKEnome LIKE 'Mar%'inizia con Mar
INclasse IN ('4A','4B')uno dei valori
BETWEENvoto BETWEEN 6 AND 8estremi inclusi
NULLvoto IS NULLvalore mancante

04 · 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.

Media e numero di studenti per classe
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.

studenticlasse_id
→
classiid PRIMARY KEY
INNER JOIN
SELECT 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;
INNER JOIN

Restituisce soltanto le righe che trovano una corrispondenza in entrambe le tabelle.

LEFT JOIN

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.

Inserire una riga
INSERT INTO studenti (id, nome, classe, voto, citta)
VALUES (7, 'Nadia', '4B', 8, 'Caltagirone');
Aggiornare una riga
UPDATE studenti
SET voto = 9
WHERE id = 7;
Eliminare una riga
DELETE FROM studenti
WHERE id = 7;

07 · Dalla richiesta alla query

Un metodo in cinque passaggi.

  1. 1
    Definisci la domanda

    Che cosa deve mostrare esattamente il risultato?

  2. 2
    Individua le tabelle

    Quali entità contengono i dati necessari?

  3. 3
    Stabilisci le relazioni

    Quali chiavi collegano le tabelle?

  4. 4
    Scrivi la query a strati

    Parti da SELECT e FROM, poi aggiungi filtri e ordinamento.

  5. 5
    Verifica il risultato

    Controlla righe, duplicati, NULL e casi limite.

Consegna

Mostrare gli studenti con almeno 8, indicando classe e aula.

Soluzione ragionata
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 SQL

Fonti e approfondimenti

Documentazione ufficiale: PostgreSQL — The SQL Language, SQLite — SELECT e MySQL — SQL Statements.

Laboratorio interattivo

Adesso scrivi tu la query.

Il simulatore introduttivo usa la tabella studenti e supporta SELECT, WHERE, ORDER BY e LIMIT. Le query avanzate della guida sono pensate per un DBMS completo.

Console SQLScrivi ed esegui una query
Supporta SELECT, WHERE, ORDER BY e LIMIT
nomevoto
Giulia8
Luca6
Sara9
Ahmed7
Elena10
Marco5
Allenamento guidato0 di 4 attività completate