CREATE TABLEALTER TABLE, DROP e TRUNCATE1. Cos’è un Server dei Dati (DBMS)
Un Database Management System (DBMS) è il software che si occupa di memorizzare, organizzare e recuperare i dati in modo efficiente e sicuro. Non è solo un file: è un vero e proprio sistema che gestisce accessi concorrenti, transazioni, permessi e molto altro.
Principali DBMS sul mercato
Architettura Client-Server
Nella maggior parte dei casi reali, il DBMS funziona come un server che risponde alle richieste dei client. Il client può essere un’applicazione web, uno script Python, oppure uno strumento grafico come MySQL Workbench.
MySQL Workbench
Transaction Mgr
Log · Backup
2. Le Categorie del Linguaggio SQL
SQL non è un unico linguaggio monolitico: è suddiviso in cinque categorie, ciascuna con uno scopo preciso. Conoscere questa suddivisione è fondamentale per orientarsi quando studi la documentazione o fai un esame.
In questo modulo ci concentreremo principalmente su DDL (questa lezione), DML (L07), QL (L09–L11). DCL e TCL sono trattati in L07 e nei corsi avanzati.
3. Tipi di Dato in SQL
Quando si crea una tabella, ogni colonna deve avere un tipo di dato che definisce quali valori può contenere. Scegliere il tipo corretto è importante: influisce su storage, performance e integrità dei dati.
| Tipo | Categoria | Range / Note | Uso tipico |
|---|---|---|---|
| INT | Numerico intero | −2.1M → +2.1M | ID, contatori, età |
| BIGINT | Numerico intero | ±9.2 × 10¹⁸ | ID grandi tabelle, timestamp Unix |
| DECIMAL(p,s) | Numerico esatto | p cifre, s decimali | Prezzi, valute (es. 10.2 → 12345678.99) |
| FLOAT / DOUBLE | Numerico approx | IEEE 754 | Misure scientifiche, coordinate GPS |
| VARCHAR(n) | Testo variabile | max n caratteri | Nome, email, titolo (max 255–65535) |
| TEXT | Testo lungo | fino a 65.535 byte | Descrizioni, contenuti HTML, post |
| CHAR(n) | Testo fisso | esattamente n caratteri | Codici fissi: codice fiscale, CAP |
| DATE | Data / Ora | YYYY-MM-DD | Data di nascita, data ordine |
| DATETIME | Data / Ora | YYYY-MM-DD HH:MM:SS | Timestamp evento, data/ora creazione |
| BOOLEAN | Logico | TRUE/FALSE (0/1) | Flag attivo/inattivo, conferma email |
Per i valori monetari usa sempre DECIMAL, mai FLOAT o DOUBLE! I tipi floating-point hanno errori di arrotondamento: 0.1 + 0.2 = 0.30000000000000004 in IEEE 754. Con i soldi questo è inaccettabile.
4. Vincoli (Constraints)
I vincoli sono regole che il DBMS fa rispettare automaticamente: garantiscono l’integrità dei dati senza che l’applicazione debba verificare tutto manualmente.
NULL. Usato su dati obbligatori.5. CREATE TABLE — Il Nostro Database Scuola
Progettiamo e implementiamo il nostro database di riferimento: tre tabelle che userai in tutte le lezioni successive. Prima vediamo il diagramma delle entità, poi il codice SQL.
NN=Not Null UQ=Unique
Il Codice DDL — CREATE TABLE
-- ============================================ -- DATABASE SCUOLA — DDL Completo -- ============================================ -- 1. Creare il database CREATE DATABASE scuola; USE scuola; -- 2. Tabella STUDENTE CREATE TABLE STUDENTE ( id_studente INT PRIMARY KEY AUTO_INCREMENT, nome VARCHAR(50) NOT NULL, cognome VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, data_nascita DATE, attivo BOOLEAN DEFAULT TRUE ); -- 3. Tabella CORSO CREATE TABLE CORSO ( id_corso INT PRIMARY KEY AUTO_INCREMENT, nome_corso VARCHAR(100) NOT NULL, crediti INT DEFAULT 6, docente VARCHAR(80) ); -- 4. Tabella ESAME (tabella di giunzione N:M) CREATE TABLE ESAME ( id_esame INT PRIMARY KEY AUTO_INCREMENT, id_studente INT NOT NULL, id_corso INT NOT NULL, voto INT CHECK (voto BETWEEN 18 AND 30), data_esame DATE NOT NULL, FOREIGN KEY (id_studente) REFERENCES STUDENTE(id_studente) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (id_corso) REFERENCES CORSO(id_corso) ON DELETE RESTRICT ON UPDATE CASCADE );
Se eliminiamo uno studente, ha senso eliminare anche tutti i suoi esami (non esistono esami senza studente). Al contrario, usiamo RESTRICT sul corso: non vogliamo eliminare accidentalmente un corso se ha ancora esami associati — sarebbe una perdita di dati storica.
6. ALTER TABLE e DROP
-- Aggiungere una colonna ALTER TABLE STUDENTE ADD COLUMN telefono VARCHAR(20); -- Modificare il tipo di una colonna esistente ALTER TABLE STUDENTE MODIFY COLUMN telefono VARCHAR(30) NOT NULL; -- Rinominare una colonna (MySQL 8.0+) ALTER TABLE STUDENTE RENAME COLUMN telefono TO cellulare; -- Eliminare una colonna ALTER TABLE STUDENTE DROP COLUMN cellulare; -- Aggiungere un indice per velocizzare le ricerche per cognome ALTER TABLE STUDENTE ADD INDEX idx_cognome (cognome); -- TRUNCATE: svuota la tabella MANTENENDO la struttura -- Più veloce di DELETE, non può fare rollback TRUNCATE TABLE ESAME; -- DROP: elimina la tabella completamente (struttura + dati) -- ATTENZIONE: operazione irreversibile! DROP TABLE IF EXISTS ESAME;
Confronto: DELETE vs TRUNCATE vs DROP
| Caratteristica | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| Rimuove i dati | ✓ (con WHERE) | ✓ (tutti) | ✓ (tutti) |
| Rimuove la struttura | ✗ | ✗ | ✓ |
| Può fare ROLLBACK | ✓ (transazione) | ✗ (DDL) | ✗ (DDL) |
| Resetta AUTO_INCREMENT | ✗ | ✓ | N/A |
| Rispetta FOREIGN KEY | ✓ | ✗ | ✗ |
| Velocità su grandi tabelle | Lenta (row by row) | Veloce | Veloce |
- I DBMS principali sono MySQL, PostgreSQL, SQLite, Oracle, SQL Server — differiscono per performance, licensing e caso d’uso.
- SQL si divide in 5 categorie: DDL (struttura), DML (dati), QL (query), DCL (permessi), TCL (transazioni).
- Scegliere il tipo di dato corretto è fondamentale: usa DECIMAL per i valori monetari, mai FLOAT.
- I vincoli (PRIMARY KEY, FOREIGN KEY, NOT NULL, UNIQUE, DEFAULT, CHECK) garantiscono l’integrità senza codice applicativo.
- La relazione N:M tra tabelle si risolve sempre con una tabella di giunzione (es. ESAME tra STUDENTE e CORSO).
- TRUNCATE è più veloce di DELETE ma non transazionale; DROP elimina struttura e dati — irreversibile.