🗄️ DBMS, Access e SQL

Guida interattiva completa alle basi di dati
Informatica · Classi 3ª-5ª Superiore
🤔

Secondo voi, Instagram usa un database?

Ogni volta che pubblichi una foto, metti un like o segui qualcuno, stai interagendo con un database. Instagram ne gestisce miliardi di record ogni giorno. Spotify, Amazon, la vostra scuola, il vostro medico: tutto si basa su basi di dati. Scopriamo come funzionano!

🎬 Video lezione

Ordine dal Caos: Capire i Database

📑 Presentazione PDF
📄

Dalla Teoria al Codice: Gestione Database Relazionali

👁️ Visualizza ⬇️ Scarica
📊 Infografica riassuntiva — DBMS e SQL

Tutti i concetti chiave su database, Access e SQL in un colpo d'occhio.

Infografica riassuntiva su DBMS e SQL - SparkStudio Educational
⬇️ Scarica infografica

🗄️ 1. Basi di dati: concetti fondamentali

+

Una base di dati (o database) è una raccolta organizzata di dati strutturati, gestita in modo da consentire l'accesso, la modifica e l'interrogazione efficiente delle informazioni. A differenza di un semplice file, un database garantisce coerenza, integrità e condivisione dei dati tra più utenti e applicazioni.

Perché servono le basi di dati?

Immagina una scuola che gestisce studenti, voti, insegnanti e classi. Senza un database, ogni ufficio avrebbe i propri file separati, con problemi di:

⚠️ Problemi dei dati non organizzati

Ridondanza: lo stesso dato (es. l'indirizzo di uno studente) copiato in più file diversi.

Incoerenza: se l'indirizzo cambia, potrebbe essere aggiornato in un file ma non in un altro.

Difficoltà di accesso: cercare informazioni incrociate (es. "tutti gli studenti con media > 8") diventa complicatissimo.

Problemi di sicurezza: nessun controllo su chi può vedere o modificare cosa.

Dato vs Informazione

È fondamentale distinguere questi due concetti:

ConcettoDefinizioneEsempio
DatoValore grezzo, non interpretato"Mario", "28", "Cuneo"
InformazioneDato interpretato con un significato"Mario ha 28 anni e vive a Cuneo"

Proprietà fondamentali di un database

ProprietàSignificato
PersistenzaI dati vengono salvati su disco e sopravvivono allo spegnimento
CondivisionePiù utenti possono accedere contemporaneamente
AffidabilitàMeccanismi di backup e ripristino in caso di guasti
SicurezzaControllo degli accessi e dei permessi per ogni utente
IntegritàRegole che garantiscono la correttezza e coerenza dei dati
IndipendenzaLa struttura logica dei dati è separata dalla memorizzazione fisica
💡 Analogia per ricordare

Un database è come una biblioteca ben organizzata: i libri (dati) sono catalogati per autore, genere e anno; il catalogo (indice) permette di trovare rapidamente qualsiasi libro; il bibliotecario (DBMS) gestisce i prestiti e controlla gli accessi.

⚡ Mini-quiz: hai capito?

Qual è la differenza principale tra un dato e un'informazione?

ASono sinonimi
BIl dato è digitale, l'informazione è cartacea
CIl dato è grezzo, l'informazione è il dato interpretato
DL'informazione è grezza, il dato è elaborato
Il dato è un valore grezzo ("28"), l'informazione è il dato con significato ("Mario ha 28 anni").

📁 2. Archivi e operazioni sugli archivi

+

Un archivio (o file) è un insieme di dati omogenei organizzati in record. Prima dell'avvento dei database relazionali, i dati venivano gestiti tramite archivi tradizionali (file sequenziali, indicizzati, ecc.).

Struttura di un archivio

ElementoDefinizioneEsempio (Archivio Studenti)
Campo (field)Singola informazione elementare"Cognome", "Nome", "DataNascita"
RecordInsieme di campi che descrivono un'entitàUn'intera riga: "Rossi, Mario, 05/03/2008"
Archivio (file)Insieme di record della stessa strutturaTutti gli studenti della scuola
Chiave primariaCampo (o insieme di campi) che identifica univocamente ogni recordMatricola studente: "2024001"
ESEMPIO VISIVO
Matricola (PK)CognomeNomeClasseMedia
2024001RossiMario3A7,5
2024002BianchiLaura3A8,2
2024003VerdiLuca3B6,8

Operazioni fondamentali sugli archivi (CRUD)

Le quattro operazioni base formano l'acronimo CRUD:

OperazioneIngleseAzioneEsempio
CreazioneCreateInserire un nuovo recordIscrivere un nuovo studente
LetturaReadRecuperare dati esistentiCercare uno studente per matricola
AggiornamentoUpdateModificare un record esistenteAggiornare la media di uno studente
CancellazioneDeleteEliminare un recordRimuovere uno studente trasferito

Altre operazioni importanti

OperazioneDescrizione
Ordinamento (sort)Riordinare i record secondo un criterio (es. alfabetico per cognome)
Ricerca (search)Trovare record che soddisfano una condizione
Filtro (filter)Mostrare solo i record che rispettano determinati criteri
Fusione (merge)Combinare dati da due archivi diversi

Limiti degli archivi tradizionali

❗ Perché gli archivi non bastano

Ridondanza incontrollata: lo stesso dato ripetuto in più file.

Dipendenza dati-programmi: se cambi la struttura del file, devi riscrivere il programma.

Nessun controllo di concorrenza: se due utenti modificano lo stesso dato contemporaneamente, uno dei due aggiornamenti si perde.

Nessun linguaggio standard: ogni programma accede ai dati in modo diverso.

Questi problemi hanno portato allo sviluppo dei DBMS e del modello relazionale.

⚡ Mini-quiz: hai capito?

L'operazione "Aggiornare la media di uno studente" corrisponde a quale lettera di CRUD?

AC (Create)
BU (Update)
CR (Read)
DD (Delete)
Aggiornare un dato esistente è un'operazione di Update. Create = inserire, Read = leggere, Delete = eliminare.

🔗 3. Il modello relazionale

+

Il modello relazionale è stato proposto dal matematico Edgar F. Codd nel 1970 ed è il modello di dati più diffuso al mondo. Si basa su un concetto matematico semplice e potente: la relazione, che nella pratica corrisponde a una tabella.

Terminologia fondamentale

Termine formaleTermine praticoSignificato
RelazioneTabellaStruttura che contiene i dati di un'entità
TuplaRiga / RecordUna singola occorrenza (es. uno studente)
AttributoColonna / CampoUna proprietà dell'entità (es. Cognome)
DominioTipo di datoInsieme dei valori ammissibili (es. numeri interi)
GradoN° colonneNumero di attributi della relazione
CardinalitàN° righeNumero di tuple della relazione

Le chiavi

Chiave primaria (Primary Key - PK)

È un attributo (o un insieme di attributi) che identifica univocamente ogni tupla della relazione. Non può essere NULL (vuoto) e non possono esistere due tuple con lo stesso valore di chiave primaria.

Chiave esterna (Foreign Key - FK)

È un attributo in una tabella che fa riferimento alla chiave primaria di un'altra tabella. Serve a creare i legami (relazioni) tra tabelle.

ESEMPIO: DUE TABELLE COLLEGATE

Tabella STUDENTI

Matricola (PK)CognomeNomeCodClasse (FK)
2024001RossiMario3A
2024002BianchiLaura3A
2024003VerdiLuca3B

Tabella CLASSI

CodClasse (PK)AulaCoordinatore
3AAula 12Prof. Neri
3BAula 15Prof. Gialli

CodClasse nella tabella STUDENTI è una chiave esterna che punta alla chiave primaria della tabella CLASSI. Questo crea il collegamento: ogni studente appartiene a una classe.

Tipi di relazione tra tabelle

TipoSimboloSignificatoEsempio
Uno a uno1:1A ogni record della tabella A corrisponde esattamente uno della BStudente → Tessera biblioteca
Uno a molti1:NA un record della A corrispondono più record della BClasse → Studenti
Molti a moltiN:MPiù record della A collegati a più della BStudenti ↔ Materie
📌 Come si gestisce la relazione N:M?

Una relazione molti a molti non si può implementare direttamente. Si crea una tabella ponte (o tabella di associazione) che contiene le chiavi esterne delle due tabelle. Esempio: la tabella ISCRIZIONI con CodStudente (FK) e CodMateria (FK) collega Studenti e Materie.

Vincoli di integrità

VincoloCosa garantisce
Integrità dell'entitàLa chiave primaria non può essere NULL né duplicata
Integrità referenzialeOgni valore di chiave esterna deve corrispondere a un valore esistente nella tabella riferita (o essere NULL)
Vincoli di dominioOgni attributo accetta solo valori del suo tipo (es. un'età non può essere negativa)
Vincoli di tuplaCondizioni che devono essere vere per ogni riga (es. DataFine > DataInizio)
💡 Normalizzazione in breve

La normalizzazione è un processo di progettazione che elimina la ridondanza nelle tabelle. Esistono diverse "forme normali" (1NF, 2NF, 3NF...). L'obiettivo è: ogni dato viene memorizzato una sola volta e in un unico posto.

⚙️ 4. Il software DBMS

+

Un DBMS (Database Management System) è il software che fa da intermediario tra gli utenti/applicazioni e i dati fisici sul disco. Gestisce tutte le operazioni: creazione, lettura, modifica, cancellazione, sicurezza e backup.

Architettura a tre livelli (ANSI/SPARC)

LivelloNomeChi lo usaCosa descrive
EsternoVisteUtenti finaliCome ogni utente "vede" i dati (sottoinsiemi personalizzati)
LogicoSchema concettualeProgettistaLa struttura completa di tutte le tabelle e relazioni
InternoSchema fisicoAmministratore DBCome i dati sono fisicamente memorizzati su disco

Questa separazione garantisce l'indipendenza dei dati: si può cambiare il modo in cui i dati sono salvati sul disco senza modificare le applicazioni, e viceversa.

Funzioni principali di un DBMS

FunzioneDescrizione
DDL (Data Definition Language)Definire la struttura: creare tabelle, modificare campi, eliminare strutture
DML (Data Manipulation Language)Manipolare i dati: inserire, aggiornare, cancellare record
QL (Query Language)Interrogare i dati: cercare, filtrare, aggregare informazioni
DCL (Data Control Language)Gestire la sicurezza: permessi, ruoli, accessi
Gestione transazioniGarantire che le operazioni siano complete (ACID)
Backup e recoveryCopie di sicurezza e ripristino in caso di guasto

DBMS più diffusi

DBMSTipoUso principale
Microsoft AccessDesktopPiccoli database locali, didattica, piccole imprese
MySQL / MariaDBServer, open sourceSiti web, applicazioni web (WordPress, ecc.)
PostgreSQLServer, open sourceApplicazioni professionali, GIS, analisi dati
Oracle DatabaseServer, enterpriseGrandi aziende, banche, sistemi mission-critical
SQL ServerServer, MicrosoftAmbienti aziendali Windows
SQLiteEmbeddedApp mobile, browser, dispositivi embedded
📌 Le proprietà ACID

Ogni transazione in un DBMS deve rispettare quattro proprietà:

Atomicità: la transazione è "tutto o niente" (o si completa interamente, o viene annullata).

Coerenza: il database passa da uno stato valido a un altro stato valido.

Isolamento: transazioni contemporanee non si influenzano a vicenda.

Durabilità: una volta completata, la transazione è permanente anche in caso di guasto.

🔒 Integrità, sicurezza e gestione della concorrenza

Tre aspetti fondamentali che rendono un DBMS superiore a un semplice file system:

AspettoProblema senza DBMSCome lo risolve il DBMS
IntegritàDati incoerenti: uno studente assegnato a una classe inesistenteVincoli (PK, FK, CHECK, NOT NULL) verificati automaticamente a ogni operazione
SicurezzaChiunque può leggere o modificare qualsiasi fileSistema di permessi: l'amministratore decide chi può vedere, inserire, modificare o eliminare dati (GRANT / REVOKE)
ConcorrenzaDue utenti modificano lo stesso record → uno dei due aggiornamenti si perdeMeccanismi di lock (blocco): il DBMS serializza gli accessi o usa lock ottimistici per evitare conflitti
💡 Il motore di Access: ACE (Access Connectivity Engine)

Access utilizza il motore ACE (successore del vecchio JET) per leggere e scrivere dati nel file .accdb. A differenza dei DBMS server (MySQL, PostgreSQL), Access salva tutto in un unico file locale. Questo lo rende facile da usare e trasportare, ma lo limita in termini di utenti simultanei (max ~10-15) e dimensioni (max 2 GB). Per progetti più grandi, si usa Access come front-end (interfaccia) collegato a un database server come back-end.

📊 5. Access: creare le tabelle

+

Microsoft Access è un DBMS desktop incluso nella suite Office. È ideale per la didattica e per piccoli database perché offre un'interfaccia grafica che permette di lavorare senza scrivere codice (ma supporta anche SQL e VBA).

Gli oggetti di Access

OggettoFunzioneAnalogia
TabelleContengono i dati (righe e colonne)I "cassetti" dell'archivio
QueryInterrogano e filtrano i datiLe "domande" che fai all'archivio
Maschere (Form)Interfacce grafiche per inserire/visualizzare datiUn "modulo" da compilare
ReportPresentano i dati per la stampaIl "documento finale" stampabile
MacroAutomatizzano operazioni ripetitiveUn "robot" che esegue azioni

Creare una tabella in Access

Quando crei una tabella, per ogni campo devi definire:

📌 I tre elementi di un campo

1. Nome del campo — identificativo (es. "Cognome", "DataNascita")

2. Tipo di dati — il genere di valori ammessi (testo, numero, data...)

3. Descrizione — commento opzionale per documentare lo scopo del campo

Tipi di dati in Access

Tipo di datoUsoDimensioneEsempio
Testo breveStringhe fino a 255 caratteriMax 255 car."Rossi", "3A"
Testo lungo (Memo)Testi lunghiFino a 1 GBNote, descrizioni
NumeroValori numerici1, 2, 4, 8 byte25, 7.5, -3
Numerazione automaticaContatore auto-incrementante4 byte1, 2, 3, 4...
Data/OraDate e orari8 byte15/03/2024
ValutaImporti monetari8 byte€ 1.250,00
Sì/NoValori booleani1 bit✅ / ❌
Collegamento ipertestualeURL e linkVariabilewww.sito.it
AllegatoFile allegati al recordVariabileFoto, PDF
Ricerca (Lookup)Lista di valori predefiniti o da altra tabellaVariabileElenco a tendina
💡 La chiave primaria in Access

Access crea automaticamente un campo "ID" di tipo Numerazione automatica come chiave primaria. Puoi anche scegliere un campo diverso: fai clic destro sulla riga del campo e seleziona "Chiave primaria". Viene indicata con un'icona a forma di 🔑.

🔧 6. Proprietà dei campi delle tabelle

+

Ogni campo in Access ha delle proprietà che ne definiscono il comportamento. Si impostano nella parte inferiore della visualizzazione Struttura della tabella.

Proprietà principali

ProprietàFunzioneEsempio
Dimensione campoSpazio massimo per il datoTesto breve: 50 caratteri; Numero: Intero lungo
FormatoCome il dato viene visualizzatoData: "gg/mm/aaaa"; Numero: "Fisso, 2 decimali"
Maschera di inputModello per l'inserimentoCAP: "00000"; Telefono: "(000) 000-0000"
EtichettaNome visualizzato nei form e reportCampo "CodFiscale" → Etichetta "Codice Fiscale"
Valore predefinitoValore inserito automaticamenteData: =Date() (data odierna); Città: "Cuneo"
Regola di convalidaCondizione che il valore deve rispettareVoto: >=1 And <=10; Età: >=14
Messaggio di convalidaMessaggio se la regola è violata"Il voto deve essere tra 1 e 10"
ObbligatorioIl campo non può restare vuotoSì / No
Consenti lunghezza zeroPermette stringhe vuote ("")Sì / No
IndicizzatoCrea un indice per velocizzare le ricercheSì (duplicati OK) / Sì (senza duplicati) / No
⚠️ Regola di convalida vs Tipo di dato

Il tipo di dato impedisce di inserire valori del tipo sbagliato (es. testo in un campo numerico). La regola di convalida aggiunge controlli più specifici all'interno del tipo (es. "il numero deve essere tra 1 e 10"). Sono controlli complementari.

Esempi pratici di regole di convalida

ACCESS -- Voto tra 1 e 10 >=1 And <=10 -- Data di nascita nel passato -- Solo valori "M" o "F" "M" Or "F" -- CAP di 5 cifre (maschera di input) 00000 -- Email che contiene @ Like "*@*.*"

🔗 7. Relazioni tra tabelle in Access

+

In Access le relazioni si creano visivamente dalla finestra Relazioni (scheda Strumenti database → Relazioni). Si trascinano i campi da una tabella all'altra per creare i collegamenti.

Procedura per creare una relazione

📌 Passo per passo

1. Vai alla scheda Strumenti database → clicca Relazioni.

2. Aggiungi le tabelle che vuoi collegare.

3. Trascina la chiave primaria dalla tabella "uno" sopra la chiave esterna nella tabella "molti".

4. Nella finestra di dialogo, attiva "Applica integrità referenziale".

5. Opzionalmente, attiva "Aggiorna a cascata" e "Elimina a cascata".

6. Clicca Crea.

Integrità referenziale in Access

OpzioneCosa faEsempio
Applica integrità referenzialeImpedisce di inserire una FK che non esiste nella tabella padreNon puoi assegnare uno studente a una classe inesistente
Aggiorna campi correlati a cascataSe la PK cambia, aggiorna automaticamente tutte le FK collegateSe il codice classe cambia da "3A" a "3A-INF", tutti gli studenti vengono aggiornati
Elimina record correlati a cascataSe elimini un record padre, elimina anche i figli collegatiSe elimini la classe "3A", vengono eliminati anche tutti gli studenti di 3A
❗ Attenzione all'eliminazione a cascata

L'eliminazione a cascata è potente ma pericolosa. Eliminando un record padre, potresti perdere centinaia di record figli senza possibilità di recupero. Usala solo quando è logicamente corretto (es. ordine → dettagli ordine) e con cautela.

🔍 8. Filtri, query, maschere e report

+

Filtri

I filtri permettono di visualizzare temporaneamente solo i record che soddisfano determinati criteri, senza creare un oggetto permanente.

Tipo di filtroCome si usaEsempio
Filtro per selezioneClic destro su un valore → "Uguale a..."Mostra solo studenti della classe "3A"
Filtro per moduloFinestra con tutti i campi, scrivi i criteriClasse = "3A" AND Media > 7
Filtro avanzatoGriglia simile a una queryCriteri complessi con OR e operatori

Query

Le query (interrogazioni) sono oggetti permanenti che permettono di estrarre, combinare, calcolare e manipolare dati da una o più tabelle. Sono lo strumento più potente di Access.

Tipi di query in Access

TipoFunzioneEsempio
Query di selezioneEstrae dati che soddisfano criteriTutti gli studenti con media > 8
Query con parametriChiede all'utente un valore all'avvio"Inserisci la classe:" → mostra studenti
Query di raggruppamentoCalcola aggregati (somma, media, conteggio)Media voti per classe
Query a campi incrociatiTabella pivot (righe × colonne)Voti medi per materia × classe
Query di creazione tabellaCrea una nuova tabella dal risultatoArchiviare i diplomati in una tabella separata
Query di aggiornamentoModifica i dati esistentiAumentare tutti i voti di 0,5 punti
Query di accodamentoAggiunge record da una tabella a un'altraSpostare studenti promossi nell'anno successivo
Query di eliminazioneCancella record che soddisfano un criterioEliminare record più vecchi di 5 anni

Maschere (Form)

Le maschere sono interfacce grafiche che facilitano l'inserimento e la visualizzazione dei dati, record per record. Sono utili perché l'utente non deve interagire direttamente con la tabella.

💡 Vantaggi delle maschere

Facilità d'uso: interfaccia user-friendly, con etichette chiare e pulsanti.

Controllo: puoi nascondere campi, impostare valori predefiniti, aggiungere validazioni.

Sicurezza: l'utente non vede la struttura della tabella e non può modificarla accidentalmente.

Sottomaschere: si possono annidare maschere dentro altre (es. maschera Ordine con sottomaschera Dettagli).

Report

I report formattano i dati per la stampa o l'esportazione in PDF. Possono includere intestazioni, piè di pagina, raggruppamenti, subtotali e totali generali.

Sezione del reportContenuto
Intestazione reportTitolo, logo, data (appare una sola volta all'inizio)
Intestazione paginaTitoli colonne (si ripete su ogni pagina)
Intestazione gruppoNome del gruppo (es. nome della classe)
CorpoI dati veri e propri, record per record
Piè di pagina gruppoSubtotali, medie per gruppo
Piè di paginaNumero pagina, data stampa
Piè di pagina reportTotali generali (appare una sola volta alla fine)

📤 9. Importazione ed esportazione di dati

+

Access può scambiare dati con molti formati esterni, rendendo facile l'integrazione con altri software.

Importazione (portare dati dentro Access)

Formato sorgenteProceduraNote
Excel (.xlsx)Dati esterni → Nuova origine dati → Da file → ExcelIl foglio deve avere una riga di intestazione
CSV / TXTDati esterni → File di testoSpecificare delimitatore (virgola, punto e virgola, tabulazione)
Altro database AccessDati esterni → AccessSi possono importare tabelle, query e altri oggetti
ODBC (altri DBMS)Dati esterni → Origine dati ODBCConnessione a MySQL, SQL Server, Oracle...

Esportazione (portare dati fuori da Access)

Formato destinazioneUso tipico
Excel (.xlsx)Analisi dati, grafici, condivisione con colleghi
PDFReport da stampare o inviare via email
CSV / TXTInterscambio universale con qualsiasi software
XMLScambio strutturato con applicazioni web
HTMLPubblicazione su pagine web
💡 Tabelle collegate vs importate

Importare copia i dati dentro Access: eventuali modifiche al file originale non si riflettono.

Collegare crea un link al file esterno: i dati restano nel file originale e vengono aggiornati in tempo reale. Utile per fogli Excel condivisi.

💻 10. Introduzione al linguaggio SQL

+

SQL (Structured Query Language) è il linguaggio standard per interagire con i database relazionali. Creato negli anni '70 da IBM e standardizzato dall'ISO, è usato da praticamente tutti i DBMS moderni.

Caratteristiche di SQL

CaratteristicaDescrizione
DichiarativoDici al database cosa vuoi, non come ottenerlo
StandardFunziona (con piccole variazioni) su tutti i DBMS
Non proceduraleNon ci sono cicli o strutture di controllo (a differenza di C, Python, ecc.)
Set-orientedOpera su insiemi di righe, non su singoli record

Le tre componenti di SQL

ComponenteNomeFunzioneComandi principali
DDLData Definition LanguageDefinire e modificare la strutturaCREATE, ALTER, DROP
DMLData Manipulation LanguageManipolare i datiINSERT, UPDATE, DELETE
QLQuery LanguageInterrogare i datiSELECT
📌 Convenzioni di scrittura SQL

Le parole chiave SQL (SELECT, FROM, WHERE...) si scrivono in MAIUSCOLO per convenzione (ma SQL non è case-sensitive). I nomi di tabelle e campi si scrivono come sono stati definiti.

Ogni istruzione termina con il punto e virgola ;

🎨 Legenda colori delle parole chiave

In questa guida le parole chiave SQL sono evidenziate con colori diversi per aiutarti a riconoscerle:

SELECT FROM WHERE JOIN GROUP BY ORDER BY HAVING = comandi e clausole
COUNT AVG SUM MAX MIN = funzioni di aggregazione
DROP DELETE UPDATE senza WHERE = operazioni pericolose ⚠️

🏗️ 11. SQL: DDL — Definire la struttura

+

Il DDL serve a creare, modificare ed eliminare gli oggetti del database (tabelle, indici, viste).

CREATE TABLE

SQL CREATE TABLE Studenti ( Matricola INT PRIMARY KEY, Cognome VARCHAR(50) NOT NULL, Nome VARCHAR(50) NOT NULL, DataNascita DATE, Classe VARCHAR(5), Media DECIMAL(4,2), Attivo BOOLEAN DEFAULT TRUE );

Tipi di dato SQL più comuni

Tipo SQLDescrizioneEsempio valore
INT / INTEGERNumero intero42, -7, 1000
DECIMAL(p,s)Numero decimale (p cifre, s decimali)7.50, 99.99
VARCHAR(n)Stringa variabile fino a n caratteri"Mario", "3A-INF"
CHAR(n)Stringa fissa di n caratteri"M", "IT"
DATEData'2024-03-15'
BOOLEANVero/FalsoTRUE, FALSE
TEXTTesto lungoNote, descrizioni

Vincoli (Constraints)

SQL CREATE TABLE Voti ( ID INT PRIMARY KEY, Matricola INT NOT NULL, Materia VARCHAR(30) NOT NULL, Voto DECIMAL(4,2) CHECK (Voto >= 1 AND Voto <= 10), Data DATE DEFAULT CURRENT_DATE, FOREIGN KEY (Matricola) REFERENCES Studenti(Matricola) );

ALTER TABLE e DROP TABLE

SQL -- Aggiungere una colonna ALTER TABLE Studenti ADD Email VARCHAR(100); -- Modificare il tipo di una colonna ALTER TABLE Studenti MODIFY Cognome VARCHAR(100); -- Eliminare una colonna ALTER TABLE Studenti DROP COLUMN Email; -- Eliminare l'intera tabella (ATTENZIONE: irreversibile!) DROP TABLE Voti;

⚡ Mini-quiz: hai capito?

Quale comando SQL aggiunge una nuova colonna a una tabella esistente?

AALTER TABLE ... ADD
BINSERT INTO ... ADD
CCREATE COLUMN
DUPDATE TABLE ... ADD
ALTER TABLE modifica la struttura: ADD aggiunge colonne, MODIFY le cambia, DROP COLUMN le rimuove.

✏️ 12. SQL: DML — Manipolare i dati

+

Il DML serve a inserire, aggiornare e cancellare dati nelle tabelle.

INSERT INTO — Inserire dati

SQL -- Inserire un record specificando tutti i campi INSERT INTO Studenti (Matricola, Cognome, Nome, DataNascita, Classe, Media) VALUES (2024004, 'Neri', 'Anna', '2008-07-22', '3A', 8.5); -- Inserire più record in un'unica istruzione INSERT INTO Studenti (Matricola, Cognome, Nome, Classe) VALUES (2024005, 'Gialli', 'Marco', '3B'), (2024006, 'Blu', 'Sara', '3A');

UPDATE — Modificare dati

SQL -- Aggiornare la media di uno studente specifico UPDATE Studenti SET Media = 8.0 WHERE Matricola = 2024001; -- Aumentare la media di tutti gli studenti di 3A di 0.5 UPDATE Studenti SET Media = Media + 0.5 WHERE Classe = '3A';
❗ Mai dimenticare la WHERE!

Un UPDATE o DELETE senza WHERE si applica a TUTTI i record della tabella. È uno degli errori più pericolosi e comuni. Verifica sempre la clausola WHERE prima di eseguire!

DELETE — Cancellare dati

SQL -- Eliminare uno studente specifico DELETE FROM Studenti WHERE Matricola = 2024003; -- Eliminare tutti gli studenti con media sotto il 6 DELETE FROM Studenti WHERE Media < 6; -- ⚠️ ELIMINA TUTTO (senza WHERE)! DELETE FROM Studenti;

🔎 13. SQL: QL — Interrogare i dati con SELECT

+

Il comando SELECT è il cuore di SQL. Permette di interrogare il database per estrarre esattamente i dati che servono.

Sintassi completa

SQL SELECT colonne FROM tabella WHERE condizione GROUP BY colonna_raggruppamento HAVING condizione_su_aggregati ORDER BY colonna ASC|DESC LIMIT numero;

Query di base

SQL -- Tutti i dati di tutti gli studenti SELECT * FROM Studenti; -- Solo cognome e nome SELECT Cognome, Nome FROM Studenti; -- Valori unici (senza duplicati) SELECT DISTINCT Classe FROM Studenti;

WHERE — Filtrare i risultati

SQL -- Studenti della 3A SELECT * FROM Studenti WHERE Classe = '3A'; -- Studenti con media superiore a 7 SELECT * FROM Studenti WHERE Media > 7; -- Condizioni multiple con AND / OR SELECT * FROM Studenti WHERE Classe = '3A' AND Media >= 8; -- Ricerca parziale con LIKE SELECT * FROM Studenti WHERE Cognome LIKE 'R%'; -- inizia per R SELECT * FROM Studenti WHERE Nome LIKE '%a'; -- finisce per a SELECT * FROM Studenti WHERE Cognome LIKE '%oss%'; -- contiene "oss" -- Valori in un elenco SELECT * FROM Studenti WHERE Classe IN ('3A', '3B', '4A'); -- Valori in un intervallo SELECT * FROM Studenti WHERE Media BETWEEN 6 AND 8; -- Valori nulli SELECT * FROM Studenti WHERE Media IS NULL;

ORDER BY — Ordinare i risultati

SQL -- Ordinamento alfabetico per cognome SELECT * FROM Studenti ORDER BY Cognome ASC; -- Per media decrescente SELECT * FROM Studenti ORDER BY Media DESC; -- Ordinamento multiplo SELECT * FROM Studenti ORDER BY Classe ASC, Media DESC;

Funzioni di aggregazione

SQL SELECT COUNT(*) AS TotaleStudenti FROM Studenti; SELECT AVG(Media) AS MediaGenerale FROM Studenti; SELECT MAX(Media) AS MediaPiuAlta FROM Studenti; SELECT MIN(Media) AS MediaPiuBassa FROM Studenti; SELECT SUM(Media) AS SommaVoti FROM Studenti;

GROUP BY e HAVING

SQL -- Media per ogni classe SELECT Classe, AVG(Media) AS MediaClasse, COUNT(*) AS NumStudenti FROM Studenti GROUP BY Classe; -- Solo le classi con media superiore a 7 SELECT Classe, AVG(Media) AS MediaClasse FROM Studenti GROUP BY Classe HAVING AVG(Media) > 7;
📌 WHERE vs HAVING

WHERE filtra le righe singole prima del raggruppamento.

HAVING filtra i gruppi dopo il raggruppamento, e può usare funzioni di aggregazione.

Alias con AS

SQL -- Rinominare colonne nel risultato SELECT Cognome AS "Cognome Studente", Media AS "Media Voti" FROM Studenti; -- Alias per le tabelle (utile nelle JOIN) SELECT s.Cognome, c.Aula FROM Studenti AS s, Classi AS c;

🔀 14. SQL: JOIN e query avanzate

+

Le JOIN permettono di combinare dati da più tabelle in un'unica query, sfruttando le relazioni tra chiavi primarie e chiavi esterne.

Tipi di JOIN

TipoRisultatoUso
INNER JOINSolo le righe con corrispondenza in entrambe le tabelleIl più comune e usato
LEFT JOINTutte le righe della tabella sinistra + corrispondenze dalla destraVuoi tutti i record della prima tabella anche senza corrispondenza
RIGHT JOINTutte le righe della destra + corrispondenze dalla sinistraInverso della LEFT
FULL JOINTutte le righe di entrambe, con NULL dove manca la corrispondenzaVuoi l'unione completa

INNER JOIN — Esempio pratico

SQL -- Elenco studenti con il nome dell'aula e del coordinatore SELECT s.Cognome, s.Nome, s.Classe, c.Aula, c.Coordinatore FROM Studenti AS s INNER JOIN Classi AS c ON s.Classe = c.CodClasse;

LEFT JOIN — Tutti gli studenti, anche senza classe

SQL SELECT s.Cognome, s.Nome, c.Aula FROM Studenti AS s LEFT JOIN Classi AS c ON s.Classe = c.CodClasse; -- Studenti senza classe avranno NULL nei campi di Classi

Subquery (query annidate)

SQL -- Studenti con media sopra la media generale SELECT Cognome, Nome, Media FROM Studenti WHERE Media > (SELECT AVG(Media) FROM Studenti); -- Classi che hanno almeno uno studente con media > 9 SELECT DISTINCT Classe FROM Studenti WHERE Classe IN ( SELECT Classe FROM Studenti WHERE Media > 9 );

Query completa di esempio

SQL -- Report: per ogni classe, numero studenti e media, -- solo classi con più di 5 studenti, ordinate per media decrescente SELECT c.CodClasse, c.Coordinatore, COUNT(s.Matricola) AS NumStudenti, ROUND(AVG(s.Media), 2) AS MediaClasse FROM Studenti AS s INNER JOIN Classi AS c ON s.Classe = c.CodClasse WHERE s.Attivo = TRUE GROUP BY c.CodClasse, c.Coordinatore HAVING COUNT(s.Matricola) > 5 ORDER BY MediaClasse DESC;
💡 Ordine di esecuzione SQL

SQL non esegue le clausole nell'ordine in cui le scrivi! L'ordine reale è:

1. FROM (+ JOIN) → 2. WHERE → 3. GROUP BY → 4. HAVING → 5. SELECT → 6. ORDER BY → 7. LIMIT

Ecco perché non puoi usare un alias definito in SELECT dentro una WHERE.

💻 15. Simulatore SQL live

+

Prova a scrivere le tue query SQL! Il simulatore usa un piccolo database di esempio con le tabelle Studenti e Classi.

📝 Scrivi la tua query SQL
RISULTATO:
💡 Query da provare

SELECT * FROM Studenti;

SELECT * FROM Classi;

SELECT Classe, COUNT(*) AS N, AVG(Media) AS MediaClasse FROM Studenti GROUP BY Classe;

SELECT s.Cognome, s.Nome, c.Aula FROM Studenti AS s INNER JOIN Classi AS c ON s.Classe = c.CodClasse;

SELECT * FROM Studenti WHERE Cognome LIKE 'B%';

✍️ Esercizio guidato: costruisci le query passo dopo passo

+

Segui ogni passo e prova a scrivere la query prima di rivelare la soluzione. Usa il simulatore SQL nella sezione precedente per testarle!

📌 Scenario: database scolastico

Lavoriamo con le tabelle Studenti (Matricola, Cognome, Nome, Classe, Media) e Classi (CodClasse, Aula, Coordinatore) già caricate nel simulatore.

1

Mostra tutti gli studenti ordinati per cognome.

Parole chiave necessarie: SELECT FROM ORDER BY

SQL SELECT * FROM Studenti ORDER BY Cognome ASC;
2

Trova tutti gli studenti della classe 3A con media superiore a 8.

Parole chiave: SELECT FROM WHERE AND

SQL SELECT Cognome, Nome, Media FROM Studenti WHERE Classe = '3A' AND Media > 8;
3

Conta quanti studenti ci sono in ogni classe.

Parole chiave: SELECT COUNT GROUP BY

SQL SELECT Classe, COUNT(*) AS NumStudenti FROM Studenti GROUP BY Classe;
4

Calcola la media voti per classe, mostrando solo le classi con media superiore a 7.

Parole chiave: SELECT AVG GROUP BY HAVING

SQL SELECT Classe, AVG(Media) AS MediaClasse FROM Studenti GROUP BY Classe HAVING AVG(Media) > 7;
5

Mostra cognome, nome e aula di ogni studente (usando una JOIN).

Parole chiave: SELECT INNER JOIN ON

SQL SELECT s.Cognome, s.Nome, c.Aula FROM Studenti AS s INNER JOIN Classi AS c ON s.Classe = c.CodClasse;
6

Trova lo studente con la media più alta in assoluto.

Parole chiave: SELECT ORDER BY DESC LIMIT

SQL SELECT Cognome, Nome, Media FROM Studenti ORDER BY Media DESC LIMIT 1;
7

🏆 Sfida finale: Trova gli studenti con media superiore alla media generale della scuola (subquery!).

Parole chiave: SELECT WHERE + subquery

SQL SELECT Cognome, Nome, Media FROM Studenti WHERE Media > (SELECT AVG(Media) FROM Studenti) ORDER BY Media DESC;

La subquery (SELECT AVG(Media) FROM Studenti) calcola prima la media generale, poi la query esterna filtra solo chi la supera.

💡 Consiglio

Copia ogni query nel simulatore SQL della sezione precedente per verificare i risultati! Prova anche a modificarle per esplorare.

⚠️ Errori comuni da evitare

+

Ecco gli errori che vengono commessi più spesso quando si lavora con database e SQL. Impararli ti farà risparmiare ore di debug!

ERRORE #1 — UPDATE / DELETE senza WHERE

Cosa succede: Modifichi o cancelli tutti i record della tabella invece di uno solo.

❌ SBAGLIATO DELETE FROM Studenti; -- Cancella TUTTI gli studenti! UPDATE Studenti SET Media = 10; -- Tutti a 10!
✅ CORRETTO DELETE FROM Studenti WHERE Matricola = 2024003; UPDATE Studenti SET Media = 10 WHERE Matricola = 2024001;
💡 Regola d'oro

Prima di un UPDATE o DELETE, esegui sempre prima una SELECT con la stessa WHERE per verificare quali record verranno coinvolti!

ERRORE #2 — Chiave primaria duplicata o NULL

Cosa succede: Il DBMS rifiuta l'inserimento con un errore di vincolo.

❌ SBAGLIATO -- Se Matricola 2024001 esiste già: INSERT INTO Studenti (Matricola, Cognome) VALUES (2024001, 'Duplicato'); -- Errore: Duplicate entry for key 'PRIMARY'

Soluzione: Usa Numerazione automatica (Access) o AUTO_INCREMENT (SQL) per generare chiavi uniche automaticamente.

ERRORE #3 — Violazione integrità referenziale

Cosa succede: Inserisci un record figlio che punta a un record padre inesistente.

❌ SBAGLIATO -- La classe "5Z" non esiste nella tabella Classi: INSERT INTO Studenti (Matricola, Cognome, Classe) VALUES (9999, 'Rossi', '5Z'); -- Errore: Cannot add or update a child row: foreign key constraint fails

Soluzione: Prima crea il record nella tabella padre (Classi), poi nella tabella figlia (Studenti).

ERRORE #4 — Confondere WHERE e HAVING

WHERE filtra le righe prima del raggruppamento. HAVING filtra i gruppi dopo GROUP BY.

❌ SBAGLIATO SELECT Classe, AVG(Media) FROM Studenti WHERE AVG(Media) > 7 GROUP BY Classe; -- Errore: non puoi usare AVG in WHERE!
✅ CORRETTO SELECT Classe, AVG(Media) FROM Studenti GROUP BY Classe HAVING AVG(Media) > 7;
ERRORE #5 — Usare = NULL invece di IS NULL
❌ SBAGLIATO SELECT * FROM Studenti WHERE Media = NULL; -- Non funziona mai!
✅ CORRETTO SELECT * FROM Studenti WHERE Media IS NULL;

In SQL, NULL non è un valore: è l'assenza di valore. Niente è mai "uguale" a NULL, nemmeno NULL stesso!

ERRORE #6 — DROP TABLE invece di DELETE FROM

DELETE FROM Tabella cancella i dati ma mantiene la struttura. DROP TABLE Tabella elimina tutto: struttura, dati, indici, relazioni. Irreversibile!

🔧 Caso reale: il database dell'officina

+

Mettiamo in pratica tutto ciò che abbiamo imparato con un caso reale. Immagina di essere il titolare di un'officina meccanica e di voler gestire clienti, veicoli e riparazioni con un database.

🤔 Mini-simulazione: se fossi il titolare, cosa vorresti memorizzare?

Pensa prima di leggere: quali informazioni ti servirebbero per gestire l'officina? Quali tabelle creeresti? Provaci, poi confronta con la soluzione sotto!

📋 Progettazione: le tabelle

TABELLA CLIENTI
IDCliente (PK)CognomeNomeTelefonoEmail
1FerreroMarco0171-123456m.ferrero@email.it
2DalmassoElena0171-654321e.dalmasso@email.it
TABELLA VEICOLI
Targa (PK)MarcaModelloAnnoIDCliente (FK)
CN 123 ABFiatPanda20191
CN 456 CDFordFiesta20212
CN 789 EFFiat50020201

Relazione 1:N — Un cliente può avere più veicoli.

TABELLA RIPARAZIONI
IDRip (PK)Targa (FK)DataDescrizioneCosto
1CN 123 AB2025-01-15Cambio olio e filtri€ 85,00
2CN 456 CD2025-01-20Sostituzione pastiglie freni€ 180,00
3CN 123 AB2025-02-10Tagliando completo€ 250,00

💻 Le query SQL per l'officina

SQL -- 1. Tutte le riparazioni della Fiat Panda di Ferrero SELECT r.Data, r.Descrizione, r.Costo FROM Riparazioni AS r INNER JOIN Veicoli AS v ON r.Targa = v.Targa WHERE v.Targa = 'CN 123 AB' ORDER BY r.Data DESC; -- 2. Quanto ha speso ogni cliente in totale? SELECT c.Cognome, c.Nome, SUM(r.Costo) AS TotaleSpeso FROM Clienti AS c INNER JOIN Veicoli AS v ON c.IDCliente = v.IDCliente INNER JOIN Riparazioni AS r ON v.Targa = r.Targa GROUP BY c.Cognome, c.Nome ORDER BY TotaleSpeso DESC; -- 3. Clienti che hanno speso più di 200€ SELECT c.Cognome, SUM(r.Costo) AS Totale FROM Clienti AS c INNER JOIN Veicoli AS v ON c.IDCliente = v.IDCliente INNER JOIN Riparazioni AS r ON v.Targa = r.Targa GROUP BY c.Cognome HAVING SUM(r.Costo) > 200;
💡 Collega al tuo indirizzo!

Lo stesso schema si adatta a qualsiasi attività:

🍕 Ristorante: Clienti → Prenotazioni → Ordini → Piatti

🏪 Negozio: Clienti → Vendite → DettagliVendita → Prodotti

📦 Magazzino: Fornitori → Ordini → Prodotti → Movimenti

Nel mondo del lavoro, qualsiasi azienda usa un database per gestire le proprie attività!

✅ Verifica finale: 3 esercizi di progettazione

+

Questi esercizi simulano compiti reali. Prova a risolverli su carta o nel simulatore, poi confronta con la soluzione.

📋 Esercizio 1 — Progettazione tabelle

Un negozio di abbigliamento vuole gestire: clienti (nome, cognome, telefono, email), prodotti (codice, descrizione, taglia, prezzo, quantità in magazzino) e vendite (data, cliente, prodotto, quantità venduta).

Consegna: Progetta le tabelle con i campi, i tipi di dato SQL, le chiavi primarie e le chiavi esterne. Indica i tipi di relazione.

SQL CREATE TABLE Clienti ( IDCliente INT PRIMARY KEY, Cognome VARCHAR(50) NOT NULL, Nome VARCHAR(50) NOT NULL, Telefono VARCHAR(20), Email VARCHAR(100) ); CREATE TABLE Prodotti ( CodProdotto INT PRIMARY KEY, Descrizione VARCHAR(100) NOT NULL, Taglia VARCHAR(5), Prezzo DECIMAL(8,2) NOT NULL, Quantita INT DEFAULT 0 ); CREATE TABLE Vendite ( IDVendita INT PRIMARY KEY, DataVendita DATE DEFAULT CURRENT_DATE, IDCliente INT NOT NULL, CodProdotto INT NOT NULL, QtaVenduta INT NOT NULL CHECK (QtaVenduta > 0), FOREIGN KEY (IDCliente) REFERENCES Clienti(IDCliente), FOREIGN KEY (CodProdotto) REFERENCES Prodotti(CodProdotto) );

Relazioni: Clienti → Vendite = 1:N | Prodotti → Vendite = 1:N | Clienti ↔ Prodotti = N:M (tramite la tabella Vendite che funge da tabella ponte).

💻 Esercizio 2 — Scrivere query SQL

Usando le tabelle dell'Esercizio 1, scrivi le query per:

a) Tutti i prodotti con prezzo superiore a €50, ordinati dal più caro.

b) Il totale speso da ogni cliente (JOIN + GROUP BY).

c) I clienti che hanno speso più di €200 in totale (HAVING).

SQL — a) SELECT Descrizione, Taglia, Prezzo FROM Prodotti WHERE Prezzo > 50 ORDER BY Prezzo DESC;
SQL — b) SELECT c.Cognome, c.Nome, SUM(v.QtaVenduta * p.Prezzo) AS TotaleSpeso FROM Clienti AS c INNER JOIN Vendite AS v ON c.IDCliente = v.IDCliente INNER JOIN Prodotti AS p ON v.CodProdotto = p.CodProdotto GROUP BY c.Cognome, c.Nome;
SQL — c) SELECT c.Cognome, SUM(v.QtaVenduta * p.Prezzo) AS Totale FROM Clienti AS c INNER JOIN Vendite AS v ON c.IDCliente = v.IDCliente INNER JOIN Prodotti AS p ON v.CodProdotto = p.CodProdotto GROUP BY c.Cognome HAVING SUM(v.QtaVenduta * p.Prezzo) > 200;

🔍 Esercizio 3 — Trova l'errore

Ogni query contiene un errore. Trovalo e correggilo!

QUERY A — Errore? SELECT Cognome, AVG(Media) AS MediaClasse FROM Studenti WHERE AVG(Media) > 7 GROUP BY Classe;
QUERY B — Errore? SELECT * FROM Studenti WHERE Media = NULL;
QUERY C — Errore? DELETE Studenti WHERE Matricola = 2024003;

Query A: Non si può usare AVG() nella clausola WHERE! Le funzioni aggregate vanno nella HAVING. Inoltre, nella SELECT c'è Cognome ma nel GROUP BY c'è Classe: il campo non aggregato deve essere quello del GROUP BY.

Query B: Non si usa = NULL ma IS NULL. NULL non è un valore, è l'assenza di valore.

Query C: Manca la parola FROM! La sintassi corretta è DELETE FROM Studenti WHERE ...

🃏 16. Flashcard di ripasso

+

Clicca su ogni card per scoprire la risposta!

📝 Quiz: DBMS e Access

+

Verifica le tue conoscenze su database e Access

📝 Quiz: SQL

+

Verifica le tue conoscenze su SQL

📝 Quiz avanzato misto

+

Metti alla prova tutte le tue competenze!

💭

Dove incontrate i database nella vostra vita?

Il registro elettronico della scuola, Spotify che ricorda le vostre playlist, Amazon che suggerisce prodotti, il medico che consulta la vostra cartella clinica, il comune che gestisce l'anagrafe...

Ogni app che usate ogni giorno è alimentata da un database.

Ora che sapete come funzionano, guardate il mondo digitale con occhi diversi: dietro ogni schermata c'è una SELECT che lavora per voi. 🚀