⚡ SQL — Schema Completo

Tutti i comandi SQL essenziali in un colpo d'occhio

🗂️ SQL — I 5 Sottolinguaggi

SQL è composto da 5 sotto-linguaggi, ognuno con un ruolo preciso:

SQL — Structured Query Language
▼ ▼ ▼ ▼ ▼
🏗️
DDL
Definizione
Struttura
📝
DML
Manipolazione
Dati
🔐
DCL
Controllo
Accessi
🔄
TCL
Controllo
Transazioni
⚙️
QL
Interrogazione
Dati
CREATE · ALTER
DROP · TRUNCATE
RENAME
INSERT · UPDATE
DELETE
GRANT
REVOKE
CREATE ROLE
COMMIT
ROLLBACK
SAVEPOINT
SELECT FROM WHERE GROUP BY HAVING ORDER BY LIMIT N

🧠 Ricorda i 5: « DDL → DCL → TCL → QL »

"DDL Costruisce, DML Modifica, DCL Protegge, TCL Conferma, QL interroga"

🔴 DDL — Data Definition Language Costruisce

Definiscono e modificano la struttura del database .

📋 CREATE

Crea una nuova tabella / database
CREATE TABLE Studenti (
  id    INT          PRIMARY KEY AUTO_INCREMENT,
  nome  VARCHAR(50) NOT NULL,
  eta   INT          CHECK (eta > 0),
  classe VARCHAR(10) DEFAULT '1A'
);

✏️ ALTER

Modifica la struttura di una tabella esistente
-- Aggiungere colonna
ALTER TABLE Studenti
  ADD email VARCHAR(100);

-- Rinominare colonna
ALTER TABLE Studenti
  RENAME COLUMN nome TO nome_completo;

-- Modificare colonna
ALTER TABLE Studenti
  MODIFY nome VARCHAR(80);

-- Aggiungere vincolo (es. FK)
ALTER TABLE Esami
  ADD CONSTRAINT fk_studente
    FOREIGN KEY (studente_id)
    REFERENCES Studenti(id);

-- Eliminare colonna
ALTER TABLE Studenti
  DROP COLUMN email;

🗑️ DROP

Elimina completamente una tabella (struttura + dati)
DROP TABLE Studenti;

-- Elimina solo se esiste
DROP TABLE IF EXISTS Studenti;

🧹 TRUNCATE

Svuota la tabella (mantiene la struttura)
TRUNCATE TABLE Studenti;
-- Più veloce di DELETE senza WHERE
-- Resetta AUTO_INCREMENT

📝 RENAME

Rinomina una tabella
RENAME TABLE Studenti TO Alunni;

-- Alternativa
ALTER TABLE Studenti
  RENAME TO Alunni;

🧠 Mnemonico DDL

Create · Alter · Drop → "CAD la struttura del DB"
Truncate = "taglia tutto" · RENAME = "rinomina"

🔵 DML — Data Manipulation Language Dati

Manipolano i dati contenuti nelle tabelle.

INSERT

Inserisce nuove righe in una tabella
INSERT INTO Studenti (nome, eta)
VALUES ('Mario', 20);

-- Più righe
INSERT INTO Studenti (nome, eta) VALUES
  ('Luca',  19),
  ('Anna',  21);

🔄 UPDATE

Modifica righe esistenti
UPDATE Studenti
SET eta = 21, classe = '3B'
WHERE nome = 'Mario';
⚠️ SENZA WHERE modifica TUTTE le righe!

DELETE

Elimina righe da una tabella
DELETE FROM Studenti
WHERE eta < 18;
⚠️ SENZA WHERE cancella TUTTE le righe!

INSERT  |  UPDATE  |  DELETE
Ricorda: IUD = INSERT, UPDATE, DELETE

🟢 DCL — Data Control Language Sicurezza

Gestiscono i permessi di accesso ai dati.

🔓 GRANT

Concede permessi a un utente
-- Permessi su tabella specifica
GRANT SELECT, INSERT
ON db_scuola.Studenti
TO 'utente1'@'localhost';

-- Più tabelle, permessi diversi
GRANT SELECT ON db_scuola.Esami TO 'utente1'@'localhost';
GRANT UPDATE ON db_scuola.Studenti TO 'utente1'@'localhost';

-- Tutti i permessi su tutto il database
GRANT ALL PRIVILEGES
ON db_scuola.*
TO 'admin'@'%';

🔒 REVOKE

Rimuove permessi da un utente
-- Rimuovi da tabella specifica
REVOKE INSERT
ON db_scuola.Studenti
FROM 'utente1'@'localhost';

-- Rimuovi da più tabelle
REVOKE SELECT ON db_scuola.Esami FROM 'utente1'@'localhost';

-- Rimuovi tutto
REVOKE ALL PRIVILEGES
ON db_scuola.*
FROM 'utente1'@'localhost';

👥 CREATE / DROP ROLE

Crea ruoli per raggruppare i permessi
-- Creare un ruolo
CREATE ROLE 'lettore';
CREATE ROLE 'editor';

-- Assegnare permessi al ruolo
GRANT SELECT
  ON db_scuola.*
  TO 'lettore';

GRANT SELECT, INSERT, UPDATE
  ON db_scuola.Studenti
  TO 'editor';

-- Assegnare ruolo a un utente
GRANT 'lettore'
  TO 'utente1'@'localhost';

-- Attivare il ruolo
SET DEFAULT ROLE 'lettore'
  TO 'utente1'@'localhost';

-- Eliminare un ruolo
DROP ROLE 'lettore';

🧠 Mnemonico DCL

Grant = Dai  |  Revoke = Togli  |  Role = Gruppo permessi
"GRant & Revoke = i Guardiani dei Ruoli"

🟡 TCL — Transaction Control Language Transazioni

Gestiscono le transazioni (gruppi di operazioni atomiche).

COMMIT

Conferma permanentemente le modifiche
START TRANSACTION;
UPDATE Conti SET saldo = saldo - 100
  WHERE id = 1;
UPDATE Conti SET saldo = saldo + 100
  WHERE id = 2;
COMMIT;

↩️ ROLLBACK

Annulla tutte le modifiche dalla transazione
START TRANSACTION;
DELETE FROM Studenti WHERE id = 5;
-- Ops! Errore!
ROLLBACK;
-- La riga è ancora lì ✓

📌 SAVEPOINT

Crea un punto di ripristino parziale
START TRANSACTION;
INSERT INTO Ordini VALUES (1, 'A');
SAVEPOINT sp1;
INSERT INTO Ordini VALUES (2, 'B');
ROLLBACK TO sp1;  -- annulla solo il 2°
COMMIT;

🧠 Mnemonico TCL

Commit = Conferma  |  Rollback = Annulla  |  Savepoint = Segnalibro
"CRS: Conferma, Ripristina, Segna"

📐 Tipi di Dato & Tips Riferimento

📦 Tipi di Dato Principali

INT interi
FLOAT / DOUBLE decimali
DECIMAL(n,d) preciso (moneta)
VARCHAR(n) stringa var. lunghezza
CHAR(n) stringa fissa
TEXT testo lungo
DATE YYYY-MM-DD
DATETIME data + ora
BOOLEAN TRUE / FALSE
BLOB dati binari
ENUM('a','b') valori predefiniti
NULL valore assente

⚡ Vincoli (Constraints)

VincoloSignificato
PRIMARY KEYIdentifica univocamente ogni riga (NOT NULL + UNIQUE)
FOREIGN KEYCollega a una PRIMARY KEY di un'altra tabella
NOT NULLIl campo non può essere vuoto
UNIQUETutti i valori devono essere diversi
CHECK (cond)Valore deve soddisfare la condizione
DEFAULT valValore predefinito se omesso
AUTO_INCREMENTIncrementa automaticamente (MySQL)
🔗 FOREIGN KEY — Schema Semplificato Riferimento Rapido

Come aggiungere una chiave esterna: durante la creazione o dopo.

🏗️ Durante CREATE TABLE

Definisci la FK direttamente nella creazione
CREATE TABLE Esami (
  id           INT PRIMARY KEY,
  voto         INT,
  studente_id  INT,
  ─── FK inline (colonna) ───
  FOREIGN KEY (studente_id)
    REFERENCES Studenti(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE
);

🔧 Dopo con ALTER TABLE

Aggiungi la FK a una tabella esistente
ALTER TABLE Esami
  ADD CONSTRAINT fk_studente
    FOREIGN KEY (studente_id)
    REFERENCES Studenti(id)
      ON DELETE CASCADE
      ON UPDATE CASCADE;

Accanto ad ON DELETE ed ON UPDATE ci possono essere una tra le seguenti 4 azioni: CASCADE, SET NULL, SET DEFAULT, RESTRICT, NO ACTION

⚡ Azioni ON DELETE / ON UPDATE

AzioneCosa fa (quando elimino/aggiorno valori entità padre)
CASCADEElimina/aggiorna automaticamente le righe figlie
SET NULLImposta la FK a NULL nelle righe figlie
SET DEFAULTImposta la FK al valore DEFAULT
RESTRICTBlocca l'operazione se ci sono righe figlie
NO ACTIONSimile a RESTRICT (comportamento di default)

🧠 Regola Semplice per la FK

1. La colonna figlia (studente_id) deve essere dello stesso tipo della PK padre (id)
2. La tabella padre (Studenti) deve essere creata PRIMA della figlia (Esami)
3. CASCADE = propagazione automatica · RESTRICT = blocco