Il linguaggio SQL: panoramica, server dei dati e DDL

// obiettivi di apprendimento
Distinguere i principali DBMS e comprendere l’architettura client-server di un sistema di gestione dati
Conoscere le cinque categorie del linguaggio SQL (DDL, DML, QL, DCL, TCL) e i loro comandi principali
Saper creare tabelle con tipi di dato e vincoli corretti tramite CREATE TABLE
Modificare e rimuovere strutture di tabella con ALTER TABLE, DROP e TRUNCATE
📄
Slides
Schemi DDL, tipi di dato, vincoli e comandi
Scarica →

1. 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.

// definizione formale
Un DBMS è un sistema software che fornisce un’interfaccia strutturata per la creazione, gestione e interrogazione di basi di dati, garantendo integrità, sicurezza e accesso concorrente ai dati.

Principali DBMS sul mercato

MySQL / MariaDB
→ Uso principale
Web (LAMP stack), applicazioni PHP/Python. Il più diffuso per siti e CMS (WordPress, Drupal).
Open Source · Porta 3306
PostgreSQL
→ Uso principale
Enterprise, sistemi complessi, GIS. Supporta JSON, array, tipi custom e query avanzate.
Open Source · Porta 5432
SQLite
→ Uso principale
Embedded, mobile (Android, iOS), script Python. Un file = un database. Nessun server necessario.
Open Source · File locale
Oracle Database
→ Uso principale
Banche, grandi corporation, sistemi ERP (SAP). Alta disponibilità, partizionamento avanzato.
Proprietario · Porta 1521
SQL Server
→ Uso principale
Ecosistema Microsoft, .NET, Azure. Business Intelligence, reporting con SSRS/SSIS.
Proprietario · Porta 1433
A Scuola: SQLite / MySQL
→ Questo corso
Useremo SQLite per i lab pratici (Python) e MySQL/MariaDB per i server web. La sintassi SQL è quasi identica.
Gratuiti · Multipiattaforma

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.

// flusso request → response
💻
CLIENT
App / Script
MySQL Workbench
Query SQL
Risultato
⚙️
DBMS
Parser · Optimizer
Transaction Mgr
legge/scrive
🗄️
STORAGE
Tabelle · Indici
Log · Backup
Il DBMS comunica sulla rete locale (o loopback 127.0.0.1) tramite un numero di porta — es. MySQL: 3306

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.

DDL
Data Definition
CREATE
ALTER
DROP
TRUNCATE
Struttura del DB
DML
Data Manipulation
INSERT
UPDATE
DELETE
Manipola i dati
QL / DQL
Query Language
SELECT
Interroga il DB
DCL
Data Control
GRANT
REVOKE
Permessi utenti
TCL
Transaction Control
COMMIT
ROLLBACK
BEGIN
Transazioni
// nota

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.

TipoCategoriaRange / NoteUso tipico
INTNumerico intero−2.1M → +2.1MID, contatori, età
BIGINTNumerico intero±9.2 × 10¹⁸ID grandi tabelle, timestamp Unix
DECIMAL(p,s)Numerico esattop cifre, s decimaliPrezzi, valute (es. 10.2 → 12345678.99)
FLOAT / DOUBLENumerico approxIEEE 754Misure scientifiche, coordinate GPS
VARCHAR(n)Testo variabilemax n caratteriNome, email, titolo (max 255–65535)
TEXTTesto lungofino a 65.535 byteDescrizioni, contenuti HTML, post
CHAR(n)Testo fissoesattamente n caratteriCodici fissi: codice fiscale, CAP
DATEData / OraYYYY-MM-DDData di nascita, data ordine
DATETIMEData / OraYYYY-MM-DD HH:MM:SSTimestamp evento, data/ora creazione
BOOLEANLogicoTRUE/FALSE (0/1)Flag attivo/inattivo, conferma email
⚠️ attenzione

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.

PRIMARY KEY
Identifica univocamente ogni riga. Implica NOT NULL + UNIQUE. Di solito un intero auto-incrementante.
Es: id_studente INT PRIMARY KEY
FOREIGN KEY
Collega una colonna alla PK di un’altra tabella. Garantisce integrità referenziale: nessun valore orfano.
Es: FOREIGN KEY (id_corso) REFERENCES CORSO(id)
NOT NULL
La colonna deve sempre avere un valore. Impossibile inserire NULL. Usato su dati obbligatori.
Es: nome VARCHAR(50) NOT NULL
UNIQUE
Nessun duplicato in quella colonna. Diverso da PK: può essere NULL, può esistere più di una colonna UNIQUE.
Es: email VARCHAR(100) UNIQUE
DEFAULT
Valore automatico se non specificato nell’INSERT. Utile per flag, date, stati iniziali.
Es: attivo BOOLEAN DEFAULT TRUE
CHECK
Verifica una condizione booleana prima dell’inserimento. Potente ma raramente usato per non appesantire il DB.
Es: voto INT CHECK (voto BETWEEN 18 AND 30)

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.

// schema entità — database scuola
STUDENTE
🔑 id_studenteINT PK AI
nomeVARCHAR(50) NN
cognomeVARCHAR(50) NN
emailVARCHAR(100) UQ
data_nascitaDATE
PK=Primary Key AI=AutoIncrement
NN=Not Null UQ=Unique
1
iscrive
N
ESAME (giunzione)
🔑 id_esameINT PK AI
🔗 id_studenteINT FK NN
🔗 id_corsoINT FK NN
votoINT CHECK 18-30
data_esameDATE NN
N
ha
1
CORSO
🔑 id_corsoINT PK AI
nome_corsoVARCHAR(100) NN
creditiINT DEF 6
docenteVARCHAR(80)
La relazione N:M tra STUDENTE e CORSO è risolta con la tabella ESAME (giunzione)

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
);
// perché ON DELETE CASCADE su STUDENTE?

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

CaratteristicaDELETETRUNCATEDROP
Rimuove i dati✓ (con WHERE)✓ (tutti)✓ (tutti)
Rimuove la struttura
Può fare ROLLBACK✓ (transazione)✗ (DDL)✗ (DDL)
Resetta AUTO_INCREMENTN/A
Rispetta FOREIGN KEY
Velocità su grandi tabelleLenta (row by row)VeloceVeloce
📌 Riepilogo — Punti chiave
  • 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.

Lascia un commento