🗄️ 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:
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:
| Concetto | Definizione | Esempio |
|---|---|---|
| Dato | Valore grezzo, non interpretato | "Mario", "28", "Cuneo" |
| Informazione | Dato interpretato con un significato | "Mario ha 28 anni e vive a Cuneo" |
Proprietà fondamentali di un database
| Proprietà | Significato |
|---|---|
| Persistenza | I dati vengono salvati su disco e sopravvivono allo spegnimento |
| Condivisione | Più utenti possono accedere contemporaneamente |
| Affidabilità | Meccanismi di backup e ripristino in caso di guasti |
| Sicurezza | Controllo degli accessi e dei permessi per ogni utente |
| Integrità | Regole che garantiscono la correttezza e coerenza dei dati |
| Indipendenza | La struttura logica dei dati è separata dalla memorizzazione fisica |
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?
📁 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
| Elemento | Definizione | Esempio (Archivio Studenti) |
|---|---|---|
| Campo (field) | Singola informazione elementare | "Cognome", "Nome", "DataNascita" |
| Record | Insieme di campi che descrivono un'entità | Un'intera riga: "Rossi, Mario, 05/03/2008" |
| Archivio (file) | Insieme di record della stessa struttura | Tutti gli studenti della scuola |
| Chiave primaria | Campo (o insieme di campi) che identifica univocamente ogni record | Matricola studente: "2024001" |
| Matricola (PK) | Cognome | Nome | Classe | Media |
|---|---|---|---|---|
| 2024001 | Rossi | Mario | 3A | 7,5 |
| 2024002 | Bianchi | Laura | 3A | 8,2 |
| 2024003 | Verdi | Luca | 3B | 6,8 |
Operazioni fondamentali sugli archivi (CRUD)
Le quattro operazioni base formano l'acronimo CRUD:
| Operazione | Inglese | Azione | Esempio |
|---|---|---|---|
| Creazione | Create | Inserire un nuovo record | Iscrivere un nuovo studente |
| Lettura | Read | Recuperare dati esistenti | Cercare uno studente per matricola |
| Aggiornamento | Update | Modificare un record esistente | Aggiornare la media di uno studente |
| Cancellazione | Delete | Eliminare un record | Rimuovere uno studente trasferito |
Altre operazioni importanti
| Operazione | Descrizione |
|---|---|
| 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
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?
🔗 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 formale | Termine pratico | Significato |
|---|---|---|
| Relazione | Tabella | Struttura che contiene i dati di un'entità |
| Tupla | Riga / Record | Una singola occorrenza (es. uno studente) |
| Attributo | Colonna / Campo | Una proprietà dell'entità (es. Cognome) |
| Dominio | Tipo di dato | Insieme dei valori ammissibili (es. numeri interi) |
| Grado | N° colonne | Numero di attributi della relazione |
| Cardinalità | N° righe | Numero 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.
Tabella STUDENTI
| Matricola (PK) | Cognome | Nome | CodClasse (FK) |
|---|---|---|---|
| 2024001 | Rossi | Mario | 3A |
| 2024002 | Bianchi | Laura | 3A |
| 2024003 | Verdi | Luca | 3B |
Tabella CLASSI
| CodClasse (PK) | Aula | Coordinatore |
|---|---|---|
| 3A | Aula 12 | Prof. Neri |
| 3B | Aula 15 | Prof. 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
| Tipo | Simbolo | Significato | Esempio |
|---|---|---|---|
| Uno a uno | 1:1 | A ogni record della tabella A corrisponde esattamente uno della B | Studente → Tessera biblioteca |
| Uno a molti | 1:N | A un record della A corrispondono più record della B | Classe → Studenti |
| Molti a molti | N:M | Più record della A collegati a più della B | Studenti ↔ Materie |
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à
| Vincolo | Cosa garantisce |
|---|---|
| Integrità dell'entità | La chiave primaria non può essere NULL né duplicata |
| Integrità referenziale | Ogni valore di chiave esterna deve corrispondere a un valore esistente nella tabella riferita (o essere NULL) |
| Vincoli di dominio | Ogni attributo accetta solo valori del suo tipo (es. un'età non può essere negativa) |
| Vincoli di tupla | Condizioni che devono essere vere per ogni riga (es. DataFine > DataInizio) |
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)
| Livello | Nome | Chi lo usa | Cosa descrive |
|---|---|---|---|
| Esterno | Viste | Utenti finali | Come ogni utente "vede" i dati (sottoinsiemi personalizzati) |
| Logico | Schema concettuale | Progettista | La struttura completa di tutte le tabelle e relazioni |
| Interno | Schema fisico | Amministratore DB | Come 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
| Funzione | Descrizione |
|---|---|
| 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 transazioni | Garantire che le operazioni siano complete (ACID) |
| Backup e recovery | Copie di sicurezza e ripristino in caso di guasto |
DBMS più diffusi
| DBMS | Tipo | Uso principale |
|---|---|---|
| Microsoft Access | Desktop | Piccoli database locali, didattica, piccole imprese |
| MySQL / MariaDB | Server, open source | Siti web, applicazioni web (WordPress, ecc.) |
| PostgreSQL | Server, open source | Applicazioni professionali, GIS, analisi dati |
| Oracle Database | Server, enterprise | Grandi aziende, banche, sistemi mission-critical |
| SQL Server | Server, Microsoft | Ambienti aziendali Windows |
| SQLite | Embedded | App mobile, browser, dispositivi embedded |
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:
| Aspetto | Problema senza DBMS | Come lo risolve il DBMS |
|---|---|---|
| Integrità | Dati incoerenti: uno studente assegnato a una classe inesistente | Vincoli (PK, FK, CHECK, NOT NULL) verificati automaticamente a ogni operazione |
| Sicurezza | Chiunque può leggere o modificare qualsiasi file | Sistema di permessi: l'amministratore decide chi può vedere, inserire, modificare o eliminare dati (GRANT / REVOKE) |
| Concorrenza | Due utenti modificano lo stesso record → uno dei due aggiornamenti si perde | Meccanismi di lock (blocco): il DBMS serializza gli accessi o usa lock ottimistici per evitare conflitti |
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
| Oggetto | Funzione | Analogia |
|---|---|---|
| Tabelle | Contengono i dati (righe e colonne) | I "cassetti" dell'archivio |
| Query | Interrogano e filtrano i dati | Le "domande" che fai all'archivio |
| Maschere (Form) | Interfacce grafiche per inserire/visualizzare dati | Un "modulo" da compilare |
| Report | Presentano i dati per la stampa | Il "documento finale" stampabile |
| Macro | Automatizzano operazioni ripetitive | Un "robot" che esegue azioni |
Creare una tabella in Access
Quando crei una tabella, per ogni campo devi definire:
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 dato | Uso | Dimensione | Esempio |
|---|---|---|---|
| Testo breve | Stringhe fino a 255 caratteri | Max 255 car. | "Rossi", "3A" |
| Testo lungo (Memo) | Testi lunghi | Fino a 1 GB | Note, descrizioni |
| Numero | Valori numerici | 1, 2, 4, 8 byte | 25, 7.5, -3 |
| Numerazione automatica | Contatore auto-incrementante | 4 byte | 1, 2, 3, 4... |
| Data/Ora | Date e orari | 8 byte | 15/03/2024 |
| Valuta | Importi monetari | 8 byte | € 1.250,00 |
| Sì/No | Valori booleani | 1 bit | ✅ / ❌ |
| Collegamento ipertestuale | URL e link | Variabile | www.sito.it |
| Allegato | File allegati al record | Variabile | Foto, PDF |
| Ricerca (Lookup) | Lista di valori predefiniti o da altra tabella | Variabile | Elenco a tendina |
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à | Funzione | Esempio |
|---|---|---|
| Dimensione campo | Spazio massimo per il dato | Testo breve: 50 caratteri; Numero: Intero lungo |
| Formato | Come il dato viene visualizzato | Data: "gg/mm/aaaa"; Numero: "Fisso, 2 decimali" |
| Maschera di input | Modello per l'inserimento | CAP: "00000"; Telefono: "(000) 000-0000" |
| Etichetta | Nome visualizzato nei form e report | Campo "CodFiscale" → Etichetta "Codice Fiscale" |
| Valore predefinito | Valore inserito automaticamente | Data: =Date() (data odierna); Città: "Cuneo" |
| Regola di convalida | Condizione che il valore deve rispettare | Voto: >=1 And <=10; Età: >=14 |
| Messaggio di convalida | Messaggio se la regola è violata | "Il voto deve essere tra 1 e 10" |
| Obbligatorio | Il campo non può restare vuoto | Sì / No |
| Consenti lunghezza zero | Permette stringhe vuote ("") | Sì / No |
| Indicizzato | Crea un indice per velocizzare le ricerche | Sì (duplicati OK) / Sì (senza duplicati) / No |
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
🔗 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
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
| Opzione | Cosa fa | Esempio |
|---|---|---|
| Applica integrità referenziale | Impedisce di inserire una FK che non esiste nella tabella padre | Non puoi assegnare uno studente a una classe inesistente |
| Aggiorna campi correlati a cascata | Se la PK cambia, aggiorna automaticamente tutte le FK collegate | Se il codice classe cambia da "3A" a "3A-INF", tutti gli studenti vengono aggiornati |
| Elimina record correlati a cascata | Se elimini un record padre, elimina anche i figli collegati | Se elimini la classe "3A", vengono eliminati anche tutti gli studenti di 3A |
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 filtro | Come si usa | Esempio |
|---|---|---|
| Filtro per selezione | Clic destro su un valore → "Uguale a..." | Mostra solo studenti della classe "3A" |
| Filtro per modulo | Finestra con tutti i campi, scrivi i criteri | Classe = "3A" AND Media > 7 |
| Filtro avanzato | Griglia simile a una query | Criteri 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
| Tipo | Funzione | Esempio |
|---|---|---|
| Query di selezione | Estrae dati che soddisfano criteri | Tutti gli studenti con media > 8 |
| Query con parametri | Chiede all'utente un valore all'avvio | "Inserisci la classe:" → mostra studenti |
| Query di raggruppamento | Calcola aggregati (somma, media, conteggio) | Media voti per classe |
| Query a campi incrociati | Tabella pivot (righe × colonne) | Voti medi per materia × classe |
| Query di creazione tabella | Crea una nuova tabella dal risultato | Archiviare i diplomati in una tabella separata |
| Query di aggiornamento | Modifica i dati esistenti | Aumentare tutti i voti di 0,5 punti |
| Query di accodamento | Aggiunge record da una tabella a un'altra | Spostare studenti promossi nell'anno successivo |
| Query di eliminazione | Cancella record che soddisfano un criterio | Eliminare 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.
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 report | Contenuto |
|---|---|
| Intestazione report | Titolo, logo, data (appare una sola volta all'inizio) |
| Intestazione pagina | Titoli colonne (si ripete su ogni pagina) |
| Intestazione gruppo | Nome del gruppo (es. nome della classe) |
| Corpo | I dati veri e propri, record per record |
| Piè di pagina gruppo | Subtotali, medie per gruppo |
| Piè di pagina | Numero pagina, data stampa |
| Piè di pagina report | Totali 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 sorgente | Procedura | Note |
|---|---|---|
| Excel (.xlsx) | Dati esterni → Nuova origine dati → Da file → Excel | Il foglio deve avere una riga di intestazione |
| CSV / TXT | Dati esterni → File di testo | Specificare delimitatore (virgola, punto e virgola, tabulazione) |
| Altro database Access | Dati esterni → Access | Si possono importare tabelle, query e altri oggetti |
| ODBC (altri DBMS) | Dati esterni → Origine dati ODBC | Connessione a MySQL, SQL Server, Oracle... |
Esportazione (portare dati fuori da Access)
| Formato destinazione | Uso tipico |
|---|---|
| Excel (.xlsx) | Analisi dati, grafici, condivisione con colleghi |
| Report da stampare o inviare via email | |
| CSV / TXT | Interscambio universale con qualsiasi software |
| XML | Scambio strutturato con applicazioni web |
| HTML | Pubblicazione su pagine web |
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
| Caratteristica | Descrizione |
|---|---|
| Dichiarativo | Dici al database cosa vuoi, non come ottenerlo |
| Standard | Funziona (con piccole variazioni) su tutti i DBMS |
| Non procedurale | Non ci sono cicli o strutture di controllo (a differenza di C, Python, ecc.) |
| Set-oriented | Opera su insiemi di righe, non su singoli record |
Le tre componenti di SQL
| Componente | Nome | Funzione | Comandi principali |
|---|---|---|---|
| DDL | Data Definition Language | Definire e modificare la struttura | CREATE, ALTER, DROP |
| DML | Data Manipulation Language | Manipolare i dati | INSERT, UPDATE, DELETE |
| QL | Query Language | Interrogare i dati | SELECT |
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:
🏗️ 11. SQL: DDL — Definire la struttura
+Il DDL serve a creare, modificare ed eliminare gli oggetti del database (tabelle, indici, viste).
CREATE TABLE
Tipi di dato SQL più comuni
| Tipo SQL | Descrizione | Esempio valore |
|---|---|---|
INT / INTEGER | Numero intero | 42, -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" |
DATE | Data | '2024-03-15' |
BOOLEAN | Vero/Falso | TRUE, FALSE |
TEXT | Testo lungo | Note, descrizioni |
Vincoli (Constraints)
ALTER TABLE e DROP TABLE
⚡ Mini-quiz: hai capito?
Quale comando SQL aggiunge una nuova colonna a una tabella esistente?
✏️ 12. SQL: DML — Manipolare i dati
+Il DML serve a inserire, aggiornare e cancellare dati nelle tabelle.
INSERT INTO — Inserire dati
UPDATE — Modificare dati
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
🔎 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
Query di base
WHERE — Filtrare i risultati
ORDER BY — Ordinare i risultati
Funzioni di aggregazione
GROUP BY e 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
🔀 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
| Tipo | Risultato | Uso |
|---|---|---|
| INNER JOIN | Solo le righe con corrispondenza in entrambe le tabelle | Il più comune e usato |
| LEFT JOIN | Tutte le righe della tabella sinistra + corrispondenze dalla destra | Vuoi tutti i record della prima tabella anche senza corrispondenza |
| RIGHT JOIN | Tutte le righe della destra + corrispondenze dalla sinistra | Inverso della LEFT |
| FULL JOIN | Tutte le righe di entrambe, con NULL dove manca la corrispondenza | Vuoi l'unione completa |
INNER JOIN — Esempio pratico
LEFT JOIN — Tutti gli studenti, anche senza classe
Subquery (query annidate)
Query completa di esempio
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.
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.
Mostra tutti gli studenti ordinati per cognome.
Parole chiave necessarie: SELECT FROM ORDER BY
Trova tutti gli studenti della classe 3A con media superiore a 8.
Parole chiave: SELECT FROM WHERE AND
Conta quanti studenti ci sono in ogni classe.
Parole chiave: SELECT COUNT GROUP BY
Calcola la media voti per classe, mostrando solo le classi con media superiore a 7.
Parole chiave: SELECT AVG GROUP BY HAVING
Mostra cognome, nome e aula di ogni studente (usando una JOIN).
Parole chiave: SELECT INNER JOIN ON
Trova lo studente con la media più alta in assoluto.
Parole chiave: SELECT ORDER BY DESC LIMIT
🏆 Sfida finale: Trova gli studenti con media superiore alla media generale della scuola (subquery!).
Parole chiave: SELECT WHERE + subquery
La subquery (SELECT AVG(Media) FROM Studenti) calcola prima la media generale, poi la query esterna filtra solo chi la supera.
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!
Cosa succede: Modifichi o cancelli tutti i record della tabella invece di uno solo.
Prima di un UPDATE o DELETE, esegui sempre prima una SELECT con la stessa WHERE per verificare quali record verranno coinvolti!
Cosa succede: Il DBMS rifiuta l'inserimento con un errore di vincolo.
Soluzione: Usa Numerazione automatica (Access) o AUTO_INCREMENT (SQL) per generare chiavi uniche automaticamente.
Cosa succede: Inserisci un record figlio che punta a un record padre inesistente.
Soluzione: Prima crea il record nella tabella padre (Classi), poi nella tabella figlia (Studenti).
WHERE filtra le righe prima del raggruppamento. HAVING filtra i gruppi dopo GROUP BY.
In SQL, NULL non è un valore: è l'assenza di valore. Niente è mai "uguale" a NULL, nemmeno NULL stesso!
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.
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
| IDCliente (PK) | Cognome | Nome | Telefono | |
|---|---|---|---|---|
| 1 | Ferrero | Marco | 0171-123456 | m.ferrero@email.it |
| 2 | Dalmasso | Elena | 0171-654321 | e.dalmasso@email.it |
| Targa (PK) | Marca | Modello | Anno | IDCliente (FK) |
|---|---|---|---|---|
| CN 123 AB | Fiat | Panda | 2019 | 1 |
| CN 456 CD | Ford | Fiesta | 2021 | 2 |
| CN 789 EF | Fiat | 500 | 2020 | 1 |
Relazione 1:N — Un cliente può avere più veicoli.
| IDRip (PK) | Targa (FK) | Data | Descrizione | Costo |
|---|---|---|---|---|
| 1 | CN 123 AB | 2025-01-15 | Cambio olio e filtri | € 85,00 |
| 2 | CN 456 CD | 2025-01-20 | Sostituzione pastiglie freni | € 180,00 |
| 3 | CN 123 AB | 2025-02-10 | Tagliando completo | € 250,00 |
💻 Le query SQL per l'officina
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.
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).
🔍 Esercizio 3 — Trova l'errore
Ogni query contiene un errore. Trovalo e correggilo!
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!