Il DDL permette di creare, modificare ed eliminare oggetti del database (tabelle, indici, viste). Non tocca i dati, solo la struttura.
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
);
-- 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;
-- 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;
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;
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;