Se lavori con i database relazionali, conoscere l’SQL (Structured Query Language) è indispensabile. Ecco una lista dei comandi SQL più importanti, divisi per categoria, con qualche esempio completo alla fine.
La sintassi qui sotto è SQL standard. Dove i database principali (PostgreSQL, MySQL, SQL Server, SQLite) si comportano in modo diverso, lo trovi segnalato.
1. DDL (Data Definition Language)#
CREATE DATABASE <nome> - crea un nuovo database
DROP DATABASE <nome> - elimina un database esistente
CREATE TABLE <tabella> (...) - crea una nuova tabella
DROP TABLE <tabella> - elimina una tabella e i suoi dati
ALTER TABLE <tabella> ADD <colonna> <tipo> - aggiunge una colonna a una tabella
TRUNCATE TABLE <tabella> - svuota una tabella mantenendone la struttura
CREATE INDEX <nome> ON <tabella> (colonna) - crea un indice per velocizzare le ricerche su una colonna
Esempio di tabelle con chiave primaria, chiave esterna e vincoli:
CREATE TABLE clienti (
id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE
);
CREATE TABLE ordini (
id INT PRIMARY KEY,
cliente_id INT NOT NULL,
totale DECIMAL(10, 2) CHECK (totale >= 0),
creato_il DATE,
FOREIGN KEY (cliente_id) REFERENCES clienti(id)
);2. DML (Data Manipulation Language)#
INSERT INTO <tabella> (col1, col2) VALUES (val1, val2) - inserisce un nuovo record
UPDATE <tabella> SET col1 = val1 WHERE condizione - aggiorna i record esistenti
DELETE FROM <tabella> WHERE condizione - elimina record da una tabella
Attenzione: un
UPDATEo unDELETEsenzaWHEREmodifica tutte le righe della tabella. Prima di eseguirlo, lancia unaSELECTcon la stessa condizione per vedere quali righe verranno toccate.
3. DQL (Data Query Language)#
SELECT * FROM <tabella> - seleziona tutte le colonne da una tabella
SELECT col1, col2 FROM <tabella> - seleziona colonne specifiche
SELECT DISTINCT colonna FROM <tabella> - seleziona valori univoci
SELECT * FROM <tabella> WHERE condizione - filtra i risultati (es. id = 1)
SELECT * FROM <tabella> ORDER BY colonna ASC|DESC - ordina i risultati
SELECT * FROM <tabella> LIMIT 10 - limita il numero di risultati (in SQL Server si usa SELECT TOP 10 * FROM <tabella>)
SELECT col AS alias FROM <tabella> - rinomina una colonna nel risultato
4. DCL (Data Control Language)#
GRANT <permessi> ON <tabella> TO <utente> - assegna privilegi a un utente
REVOKE <permessi> ON <tabella> FROM <utente> - rimuove i privilegi da un utente
5. TCL (Transaction Control Language)#
BEGIN (o START TRANSACTION) - inizia una nuova transazione
COMMIT - salva definitivamente i cambiamenti della transazione corrente
ROLLBACK - annulla i cambiamenti della transazione corrente
SAVEPOINT <nome> - imposta un punto di salvataggio all’interno di una transazione
Esempio classico: un bonifico deve aggiornare entrambi i conti, oppure nessuno dei due.
BEGIN;
UPDATE conti SET saldo = saldo - 100 WHERE id = 1;
UPDATE conti SET saldo = saldo + 100 WHERE id = 2;
COMMIT; -- in caso di errore: ROLLBACK;6. Join (unioni tra tabelle)#
INNER JOIN - record che hanno valori corrispondenti in entrambe le tabelle
LEFT JOIN - tutti i record della tabella di sinistra e i corrispondenti della tabella di destra
RIGHT JOIN - tutti i record della tabella di destra e i corrispondenti della tabella di sinistra
FULL JOIN - tutti i record di entrambe le tabelle, abbinati dove possibile (non supportato da MySQL)
-- Tutti i clienti con i loro ordini, compresi i clienti che non hanno ancora ordinato
SELECT c.nome, o.id AS ordine, o.totale
FROM clienti c
LEFT JOIN ordini o ON o.cliente_id = c.id
ORDER BY c.nome;7. Funzioni di aggregazione e raggruppamento#
COUNT(colonna) - conta le righe con un valore non NULL (COUNT(*) conta tutte le righe)
SUM(colonna) - calcola la somma dei valori
AVG(colonna) - calcola la media dei valori
MIN(colonna) / MAX(colonna) - trova il valore minimo / massimo
GROUP BY colonna - raggruppa le righe con lo stesso valore
HAVING condizione - filtra i gruppi creati (simile a WHERE, ma dopo il GROUP BY)
-- Clienti che hanno speso più di 500 €, dal migliore al peggiore
SELECT c.nome, COUNT(*) AS num_ordini, SUM(o.totale) AS speso
FROM clienti c
JOIN ordini o ON o.cliente_id = c.id
GROUP BY c.id, c.nome -- c.id evita di unire due clienti omonimi
HAVING SUM(o.totale) > 500
ORDER BY speso DESC;Ordine logico di esecuzione:
FROM→JOIN→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT. Ecco perché in molti database non puoi usare un alias delSELECTdentro ilWHERE.
8. Operatori logici e di confronto#
=, <>, !=, <, >, <=, >= - operatori di confronto (<> è lo standard, != è molto diffuso)
AND, OR, NOT - operatori logici per combinare condizioni
BETWEEN val1 AND val2 - verifica se un valore è compreso in un intervallo (estremi inclusi)
LIKE 'pattern' - cerca un pattern: % = qualsiasi sequenza di caratteri, _ = un solo carattere (es. '%test%')
IN (val1, val2, ...) - verifica se un valore è in una lista
IS NULL / IS NOT NULL - verifica se un valore è o non è NULL (= NULL non funziona mai!)
Saper padroneggiare questi comandi ti permetterà di interrogare e gestire in modo efficace qualsiasi database relazionale!




