INSERT INTO, sia in forma completa che abbreviata, anche con valori multipliUPDATE … SET … WHERE e comprendere il rischio di omettere la clausola WHEREDELETE FROM … WHERE gestendo correttamente le Foreign KeyBEGIN, COMMIT, ROLLBACK) per garantire l’atomicità delle operazioni1. I Comandi DML
Il Data Manipulation Language (DML) comprende i comandi per agire sui dati all’interno delle tabelle già esistenti. Non cambia la struttura (quello è DDL), ma inserisce, modifica e cancella righe.
2. INSERT INTO
Sintassi base e varianti
-- ① FORMA COMPLETA (consigliata): elenchi le colonne esplicitamente -- Vantaggi: sicura rispetto ad ALTER TABLE, leggibile, indipendente dall'ordine INSERT INTO STUDENTE (nome, cognome, email, data_nascita) VALUES ('Marco', 'Rossi', 'marco.rossi@scuola.it', '2007-03-15'); -- ② FORMA ABBREVIATA: nessun elenco colonne → ordine uguale a CREATE TABLE -- Rischiosa: se cambia la struttura, si rompe tutto INSERT INTO STUDENTE VALUES (NULL, 'Laura', 'Bianchi', 'laura.b@scuola.it', '2006-11-22', TRUE); -- ③ INSERT MULTIPLO: più righe in un'unica istruzione — molto più efficiente INSERT INTO CORSO (nome_corso, crediti, docente) VALUES ('Programmazione', 6, 'Prof. Giagnotti'), ('Matematica', 5, 'Prof. Verdi'), ('Inglese Tecnico', 3, 'Prof. Smith'), ('Sistemi e Reti', 6, 'Prof. Giagnotti');
Popolazione completa del database scuola
-- Inserimento studenti INSERT INTO STUDENTE (nome, cognome, email, data_nascita) VALUES ('Marco', 'Rossi', 'marco.rossi@scuola.it', '2007-03-15'), ('Laura', 'Bianchi', 'laura.b@scuola.it', '2006-11-22'), ('Ahmed', 'Karim', 'ahmed.k@scuola.it', '2007-07-08'), ('Sofia', 'Ferrari', 'sofia.f@scuola.it', '2006-05-30'), ('Luca', 'Conti', 'luca.c@scuola.it', '2007-01-14'); -- Inserimento esami (tabella giunzione con attributi) INSERT INTO ESAME (id_studente, id_corso, voto, data_esame) VALUES (1, 1, 28, '2026-02-10'), -- Marco → Programmazione (1, 2, 25, '2026-02-14'), -- Marco → Matematica (2, 1, 30, '2026-02-10'), -- Laura → Programmazione (3, 3, 22, '2026-02-18'), -- Ahmed → Inglese (4, 4, 27, '2026-02-20'); -- Sofia → Sistemi
3. UPDATE — Modificare i Dati
-- Sintassi completa UPDATE nome_tabella SET colonna1 = valore1, colonna2 = valore2, ... WHERE condizione; -- ① Correzione di un voto: lo studente 1 ha sostenuto una revisione UPDATE ESAME SET voto = 29 WHERE id_esame = 1; -- ② Aggiornare più colonne insieme UPDATE STUDENTE SET nome = 'Alessandro', email = 'alex.rossi@scuola.it' WHERE id_studente = 1; -- ③ Espressioni aritmetiche: aumenta i crediti di Programmazione UPDATE CORSO SET crediti = crediti + 1 WHERE nome_corso = 'Programmazione';
UPDATE ESAME SET voto = 18; -- Risultato: 2000 studenti -- tutti con voto 18... 😱
UPDATE ESAME SET voto = 18 WHERE id_esame = 42; -- Solo Marco, solo -- quell'esame. ✓
💡 Trucco professionale: prima di fare un UPDATE controverso, esegui una SELECT con la stessa WHERE per vedere quante righe verranno modificate.
4. DELETE FROM — Eliminare Righe
-- Sintassi DELETE FROM nome_tabella WHERE condizione; -- ① Eliminare un singolo esame DELETE FROM ESAME WHERE id_esame = 4; -- ② Eliminare tutti gli esami di uno studente DELETE FROM ESAME WHERE id_studente = 3; -- ③ Eliminare uno studente -- Se la FK ha ON DELETE CASCADE → elimina automaticamente anche i suoi esami -- Se la FK ha ON DELETE RESTRICT → ERRORE se ha esami associati (protegge da perdita dati) DELETE FROM STUDENTE WHERE id_studente = 3;
5. Transazioni — Atomicità e Sicurezza
Una transazione è un insieme di operazioni SQL che vengono eseguite come un blocco atomico: o vengono completate tutte, oppure non viene applicata nessuna. Questo garantisce la consistenza del database anche in caso di errori o crash.
Esempio pratico: trasferimento voto con transazione
-- Scenario: vogliamo correggere il voto e aggiornare una nota nello stesso momento -- Se una delle due operazioni fallisce, NON vogliamo che l'altra venga applicata START TRANSACTION; -- Operazione 1: correggi il voto UPDATE ESAME SET voto = 27, data_esame = '2026-03-01' WHERE id_esame = 2; -- Operazione 2: inserisci una nota di revisione (in una tabella NOTE ipotetica) INSERT INTO NOTE_ESAME (id_esame, testo, data) VALUES (2, 'Revisione del 2026-03-01 — accettata', NOW()); -- Se arriviamo qui senza errori: conferma entrambe le operazioni COMMIT; -- ------ -- Se invece c'è stato un errore (es. in un programma Python col try/except): ROLLBACK; -- annulla TUTTO — il DB torna com'era prima dello START TRANSACTION
SAVEPOINT — Punti intermedi nella transazione
START TRANSACTION; INSERT INTO STUDENTE (nome, cognome) VALUES ('Test', 'Utente'); SAVEPOINT dopo_insert; -- punto di ripristino parziale UPDATE ESAME SET voto = 0; -- ops! senza WHERE ROLLBACK TO SAVEPOINT dopo_insert; -- torna al savepoint: INSERT ok, UPDATE annullato COMMIT; -- salva solo l'INSERT
- INSERT INTO: usa sempre la forma con colonne esplicite — più robusta a future modifiche della struttura.
- UPDATE senza WHERE: aggiorna tutte le righe. Prima di eseguire un UPDATE, verifica con una SELECT quante righe coinvolge.
- DELETE: è transazionale (può fare ROLLBACK). Rispetta i vincoli FK: usa CASCADE se vuoi eliminare a cascata, RESTRICT se vuoi protezione.
- Le transazioni garantiscono atomicità (ACID): usa
START TRANSACTION→ operazioni →COMMIToROLLBACK. - I SAVEPOINT permettono rollback parziali all’interno di una transazione lunga.