Il DDL permette di creare, modificare ed eliminare oggetti del database (tabelle, indici, viste). Non tocca i dati, solo la struttura.

CREATE TABLE — creare una tabella

CREATE TABLE NomeTabella (
    colonna1  TIPO  [vincoli di colonna],
    colonna2  TIPO  [vincoli di colonna],
    ...
    [vincoli di tabella]
);

Esempio completo:

CREATE TABLE Studenti (
    id_studente    INT           PRIMARY KEY AUTO_INCREMENT,
    codice_fiscale CHAR(16)      NOT NULL UNIQUE,
    nome           VARCHAR(50)   NOT NULL,
    cognome        VARCHAR(50)   NOT NULL,
    email          VARCHAR(100)  UNIQUE,
    data_nascita   DATE,
    voto_medio     DECIMAL(4,2)  DEFAULT 0.00,
    CHECK (voto_medio >= 0 AND voto_medio <= 10)
);

CREATE TABLE Corsi (
    id_corso    INT          PRIMARY KEY AUTO_INCREMENT,
    nome_corso  VARCHAR(100) NOT NULL,
    crediti     INT          NOT NULL CHECK (crediti > 0)
);

-- Tabella con chiave composta e foreign key
CREATE TABLE Iscrizioni (
    id_studente     INT  NOT NULL,
    id_corso        INT  NOT NULL,
    data_iscrizione DATE DEFAULT (CURRENT_DATE),
    voto            DECIMAL(4,2),
    PRIMARY KEY (id_studente, id_corso),
    FOREIGN KEY (id_studente) REFERENCES Studenti(id_studente) ON DELETE CASCADE,
    FOREIGN KEY (id_corso)    REFERENCES Corsi(id_corso)       ON DELETE RESTRICT
);

ALTER TABLE — modificare la struttura

-- Aggiungere una colonna
ALTER TABLE Studenti ADD COLUMN telefono VARCHAR(15);

-- Modificare il tipo di dato di una colonna
ALTER TABLE Studenti MODIFY COLUMN telefono VARCHAR(20) NOT NULL;

-- Rinominare una colonna
ALTER TABLE Studenti RENAME COLUMN telefono TO cellulare;

-- Eliminare una colonna
ALTER TABLE Studenti DROP COLUMN cellulare;

-- Aggiungere un vincolo
ALTER TABLE Studenti ADD CONSTRAINT chk_voto CHECK (voto_medio >= 0);

-- Aggiungere una foreign key
ALTER TABLE Studenti ADD COLUMN id_classe INT;
ALTER TABLE Studenti ADD CONSTRAINT fk_classe
    FOREIGN KEY (id_classe) REFERENCES Classi(id_classe);

-- Eliminare un vincolo
ALTER TABLE Studenti DROP CONSTRAINT chk_voto;

DROP e TRUNCATE — eliminare tabelle o dati

-- Elimina la tabella e tutta la sua struttura (irreversibile)
DROP TABLE IF EXISTS Iscrizioni;

-- Svuota la tabella mantenendo la struttura (più veloce di DELETE senza WHERE)
TRUNCATE TABLE Iscrizioni;

CREATE INDEX — velocizzare le query

Un indice è una struttura dati aggiuntiva che il DBMS usa per trovare i dati più velocemente, come l’indice di un libro. Rallenta leggermente le operazioni di scrittura ma accelera notevolmente le letture.

-- Indice semplice (per query frequenti su quella colonna)
CREATE INDEX idx_cognome ON Studenti(cognome);

-- Indice univoco (equivalente a UNIQUE)
CREATE UNIQUE INDEX idx_email ON Studenti(email);

-- Indice su più colonne (per query con WHERE su più campi)
CREATE INDEX idx_nome_cog ON Studenti(cognome, nome);

-- Eliminare un indice
DROP INDEX idx_cognome ON Studenti;

CREATE VIEW — viste (tabelle virtuali)

Una vista è una query memorizzata nel database che si comporta come una tabella. Non contiene dati fisici: viene eseguita ogni volta che la si interroga.

Vantaggi delle viste:

-- Creare una vista
CREATE VIEW studenti_con_corso AS
SELECT s.nome, s.cognome, s.voto_medio, c.nome_corso
FROM Studenti s
JOIN Iscrizioni i ON s.id_studente = i.id_studente
JOIN Corsi c      ON i.id_corso    = c.id_corso;

-- Interrogare la vista come una normale tabella
SELECT * FROM studenti_con_corso WHERE voto_medio >= 7;

-- Modificare la definizione
CREATE OR REPLACE VIEW studenti_con_corso AS ...;

-- Eliminare la vista (i dati reali non vengono toccati)
DROP VIEW studenti_con_corso;