Lo Structured Query Language, in breve SQL (in italiano: “linguaggio di interrogazione strutturato”), è uno dei più noti linguaggi di programmazione. Si tratta di un’interfaccia universale per lavorare con database relazionali o sistemi di gestione di database relazionali (RDBMS). Questo linguaggio contiene un tale numero di comandi SQL da poter creare confusione. Vi presentiamo i più importanti illustrando i modelli che ne sono alla base.

Registra il tuo dominio
  • Certificato SSL Wildcard incluso
  • Registrazione di dominio sicura
  • Indirizzo e-mail professionale da 2 GB
Consiglio

Abbiamo preparato un altro articolo con un’introduzione a SQL e una serie di esempi, in cui spieghiamo come programmare con SQL.

Che cosa sono i comandi SQL?

I comandi SQL impartiscono al sistema di gestione dei database (DBMS) l’istruzione di eseguire determinate azioni. Ad esempio, la definizione delle tabelle e la loro struttura, l’inserimento, la modifica e l’eliminazione di dati nonché l’esecuzione di query.

Per definire l’ambito di applicazione dei comandi SQL sono disponibili vari standard ISO o ANSI. In più, esiste una serie di dialetti relativi a implementazioni specifiche. Ad esempio, le implementazioni dei principali produttori come PostgreSQL, MySQL, Oracle DBMS e Microsoft SQL Server sono dotate di varianti linguistiche proprie. Alcuni hanno comandi personalizzati; la maggior parte differisce almeno in termini di funzioni per l’elaborazione di stringhe e altri dati.

Di fatto, SQL comprende diversi sottolinguaggi, ognuno dei quali copre aree diverse e prevede dei propri comandi. Esaminiamo le tipologie più importanti di comandi SQL.

Quali tipologie di comandi SQL esistono?

I comandi SQL più importanti sono suddivisibili in cinque sottolinguaggi. Osserviamo i campi d’applicazione dei singoli sottolinguaggi e dei loro comandi:

Sottolinguaggio SQL Comandi Esempi
Data Definition Language (DDL) Comandi per la definizione dello schema di database: realizzare, modificare ed eliminare tabelle del database; definizione di chiavi primarie, chiavi esterne e constraint. CREATE TABLE, DROP TABLE
Data Manipulation Language (DML) Comandi per la manipolazione di dati: modificare, aggiungere ed eliminare set di dati. INSERT, UPDATE
Data Query Language (DQL) Comandi per l’interrogazione e la preparazione di dati. SELECT
Data Control Language (DCL) Comandi per la gestione dei permessi. GRANT, REVOKE
Transaction Control Language (TCL) Comandi per il controllo delle transazioni. COMMIT, ROLLBACK

Qual è la sintassi alla base dei comandi SQL?

Diversamente dai linguaggi di programmazione più diffusi, SQL è un linguaggio dichiarativo. Ciò significa che descrive qual è il risultato da ottenere senza specificare quali sono i passaggi necessari per raggiungerlo. Questa peculiarità del linguaggio si esprime in comandi tendenzialmente più lunghi; in compenso occorre una quantità minore di righe di codice rispetto ai linguaggi imperativi consueti.

Prendiamo ad esempio il comando SQL DROP TABLE IF EXISTS. Avete letto bene, si tratta di un comando singolo che serve a eliminare una tabella, se esistente:

DROP TABLE IF EXISTS SomeTable;

Un esempio di codice Python con una funzionalità simile comprende più richieste di funzioni e una ramificazione che si estende su due righe:

if db.has_table(some_table):
    db.drop_table(some_table)

Come avete visto, un singolo comando SQL può essere costituito da più parole chiave. Ciò porta i comandi ad assomigliarsi tra loro. Utilizzando un esempio: a un primo sguardo i due comandi SQL CREATE TABLE e CREATE OR REPLACE VIEW sembrano espressione di un comando CREATE alla base. Tuttavia non è così. Nonostante la somiglianza, infatti, si tratta di due comandi distinti.

Come noto già per altri linguaggi, alcuni comandi SQL accettano parametri, tra cui spesso i nomi di database, tabelle e colonne. A titolo di esempio, interroghiamo le colonne ‘Name’ e ‘Age’ della tabella ‘People’:

SELECT Name, Age FROM People;
N.B.

I comandi SQL come SELECT e CREATE TABLE in genere si scrivono tutti in maiuscolo. Infatti, SQL non fa distinzione tra caratteri maiuscoli e minuscoli. Non è altro che una convenzione largamente diffusa.

Per la precisione, i comandi SQL sono ordini, oltre ai quali esistono altri costrutti della sintassi che in parte agiscono come comandi. Nella seguente tabella vi spieghiamo gli elementi della sintassi SQL:

Termine Corrispondente inglese Spiegazione Esempio
Istruzione Statement Ordina al DBMS di eseguire un’azione; termina con un punto e virgola CREATE TABLE People;
Clausola Clause Modifica un’istruzione; può comparire solamente all’interno di istruzioni WHERE, HAVING
Espressione Expression Emette un valore durante la valutazione 6 * 7
Identificatore Identifier Nome di un oggetto del database, di una variabile o di una procedura; può essere qualificato o meno dbname.tablename / tablename
Predicato Predicate Espressione che valuta TRUE, FALSE o UNKNOWN Age < 42
Richiesta Query Istruzione speciale; emette un insieme di risultati di record SELECT Name FROM People WHERE Age < 42;
Funzione Function Elabora uno o più valori; di norma crea un nuovo valore UPPER('text') -- Restituisce 'TEXT'
Commento Comment Serve a commentare il codice SQL; viene ignorato dal RDBMS -- Commento fino alla fine della riga / /* Eventuale commento di più righe */

I comandi SQL più importanti

I database strutturano i dati secondo una gerarchia di livelli di memorizzazioni, a partire dai server di database scendendo fino al valore salvato in un campo. Dal momento che tutti gli aspetti di un sistema di gestione di database relazionale (RDBMS) possono essere controllati mediante SQL, esistono comandi SQL per ciascuno dei livelli. Di seguito un riepilogo della gerarchia degli oggetti RDBMS:

Oggetto RDBMS Contiene
Server Database
Database Tabelle
Tabelle Record
Record Campi
Campo Valore tipizzato

Accanto agli oggetti RDBMS primari presentati vengono utilizzati altri oggetti, come le viste (“views”) e le procedure memorizzate (“stored procedures”). Anche queste sono dotate di comandi SQL propri. Vediamo di seguito i comandi dei cinque principali sottolinguaggi di SQL:

  1. Data Definition Language (DDL): linguaggio di definizione dei dati
  2. Data Manipulation Language (DML): linguaggio di manipolazione dei dati
  3. Data Query Language (DQL): linguaggio di interrogazione dei dati
  4. Data Control Language (DCL): linguaggio di controllo dei dati
  5. Transaction Control Language (TCL): linguaggio di controllo di transazione

Comandi SQL per la definizione di dati

Questi comandi SQL si usano per definire strutture di dati. Di conseguenza, operano tutti su oggetti aggregati come database, tabelle e indici. Gli oggetti aggregati consentono di memorizzare più record; ogni record può contenere più campi, ciascuno dei quali è assegnato a una colonna. Questa colonna definisce il tipo di dati del campo, ovvero numero, stringa, valore booleano, ecc. In più, per ogni colonna si possono definire restrizioni quali “deve essere unica”, “non può essere zero”, ecc.

Comandi SQL per la definizione di database

Al livello più alto di un sistema di gestione di database relazionali (RDBMS) si collocano i database. È possibile crearli e cancellarli con un comando SQL:

Comando SQL Spiegazione Esempio
CREATE DATABASE Crea un nuovo database CREATE DATABASE Store;
DROP DATABASE Elimina un database del tutto DROP DATABASE Store;
USE Sceglie il database per i comandi a seguire USE Store;

Comandi SQL per la definizione di tabelle

La configurazione di un database parte dalla definizione dello schema del database. Lo schema costituisce la base per l’uso efficiente del database, pertanto presuppone un’accurata progettazione che mappi le singole tabelle e le rispettive relazioni reciproche. Di solito, lo schema del database si sviluppa sulla base di diagrammi di Entity Relation (ER) o di particolari diagrammi UML.

Qualora lo schema del database sia presente sotto forma di descrizione astratta, la struttura del database verrà creata utilizzando i relativi comandi SQL. A questo punto vengono definite le tabelle con le colonne e le rispettive tipologie; tutti gli eventuali collegamenti tra le tabelle saranno realizzati tramite “foreign keys” (o chiavi esterne). Successivamente, la struttura può essere modificata con l’esecuzione di altri comandi SQL. Riportiamo ora un riepilogo dei comandi più importanti:

Comando SQL Spiegazione Esempio
CREATE TABLE Crea una nuova tabella nel database; accanto al nome della tabella vengono definiti i nomi delle colonne insieme alle rispettive tipologie CREATE TABLE Customers ( CustomerID INT UNSIGNED NOT NULL AUTO_INCREMENT, CustomerName VARCHAR(255) NOT NULL, Country VARCHAR(60) NOT NULL, PRIMARY KEY (CustomerID) );
ALTER TABLE Modifica la tabella esistente: aggiunge/rimuove colonne; sostituisce il tipo o il nome di una colonna ALTER TABLE Customers ADD Email VARCHAR(50);
TRUNCATE TABLE Elimina tutte le voci di una tabella mantenendone la struttura TRUNCATE TABLE Customers;
DROP TABLE Elimina definitivamente la tabella; se la tabella non esiste, genera un errore durante l’esecuzione DROP TABLE Customers;
DROP TABLE IF EXISTS Elimina la tabella se esiste DROP TABLE IF EXISTS Customers;
ALTER COLUMN Modifica il tipo di dati di una colonna esistente ALTER TABLE Customers ALTER COLUMN Email VARCHAR(255);
DROP COLUMN Elimina definitivamente una colonna di una tabella ALTER TABLE customers DROP COLUMN Email;
CREATE INDEX Crea un indice con nome per la/e colonna/e di una tabella esistente CREATE INDEX IdxEmail ON Customers (Email);
DROP INDEX Rimuove l’indice esistente ALTER TABLE Customers DROP INDEX IdxEmail;

Una caratteristica fondamentale di un sistema di gestione di database (DBMS) è quella di garantire la consistenza dei dati. Ad esempio, per le singole colonne è possibile specificare che i campi in esse contenuti non possono essere vuoti o che i valori in esse contenuti devono rientrare nei limiti consentiti. Si parla in questo caso di constraint (vincoli). Le chiavi esterne, inoltre, possono essere utilizzate per garantire che i collegamenti tra le tabelle vengano eseguiti in maniera corretta.

Per impostare le restrizioni per le singole colonne, si ricorre a una serie di clausole all’interno delle dichiarazioni di definizione dei dati. Li mostriamo qui senza esempi:

Comando SQL Spiegazione
NOT NULL Definisce che il valore del campo non può essere NULL
UNIQUE Definisce che il valore del campo all’interno della colonna non può comparire più di una volta
DEFAULT Imposta un valore predefinito per il campo; se non viene specificato alcun valore per il campo al momento della creazione del record, verrà adottato il valore predefinito
CHECK Imposta una condizione che il valore del campo deve soddisfare
PRIMARY KEY Specifica che il campo contiene la chiave primaria; implica UNIQUE e NOT NULL
FOREIGN KEY Specifica che il valore del campo deve essere una chiave primaria di un’altra tabella

Comandi SQL per la manipolazione di dati

In presenza di tabelle di un database già definite, si procede con le operazioni sui singoli record di dati. I record di dati possono essere inseriti, modificati ed eliminati mediante opportuni comandi SQL. Si tratta delle operazioni CRUD di base “Create, Read, Update, Delete” (Crea, Leggi, Modifica ed Elimina), presenti anche nei database NoSQL:

Comando SQL Spiegazione Esempio
INSERT INTO Inserisce un record nella tabella INSERT INTO Customers (CustomerName) VALUES('Tester');
UPDATE Modifica i campi di uno o più record UPDATE Customers SET Email = 'test@example.com' WHERE CustomerName = 'Tester';
DELETE FROM Elimina i record da una tabella DELETE FROM Customers WHERE CustomerName = 'Tester';

Va notato che le clausole o, meglio, le funzioni ‘WHERE’, ‘SET’ e ‘VALUES’ che compaiono negli esempi sono presenti anche in altri contesti. Tuttavia, nonostante abbiano lo stesso nome, le regole per il loro utilizzo potrebbero differire leggermente. Prestate dunque attenzione durante l’utilizzo dei comandi SQL UPDATE e DELETE FROM senza una clausola WHERE. Ciò implica infatti la modifica o l’eliminazione di tutti i record della tabella.

Comandi SQL per l’interrogazione di dati

Il comando SQL SELECT è forse il comando più famoso del linguaggio. Serve a ricavare i dati dal database. Generalmente, lo stock di dati non subisce modifiche. Il comando SELECT è quindi frequentemente accessibile a chi ha il compito di analizzare. Esaminiamo i componenti di base del comando SQL SELECT:

Comando SQL Spiegazione Esempio
SELECT Interroga i dati del database SELECT CustomerName FROM Customers;
WHERE Limita la query ai record che soddisfano un determinato predicato SELECT Email FROM Customers WHERE CustomerName = 'Tester';
AS Definisce un alias per una tabella o una riga all’interno di una query SELECT CustomerID AS ID, CustomerName AS Customer FROM Customers;
HAVING Limita la query ai record corrispondenti con la funzione aggregata SELECT COUNT(CustomerID), Country FROM Customers HAVING COUNT(CustomerID) >= 1;

Sebbene SELECT sia un unico comando SQL per l’interrogazione dei dati, può essere impiegato in una varietà di modi. Sono presenti diverse clausole che servono a filtrare, ordinare e sintetizzare i dati forniti. Le analizziamo di seguito.

Comandi SQL per affinare le query

Il comando SQL SELECT fornisce un cosiddetto result set (insieme di risultati). Dal punto di vista concettuale, un result set può essere considerato come una tabella con colonne e relativi valori in esse contenuti. Nella pratica, occorre spesso filtrare o ordinare i risultati o limitare il numero di record ottenuti. Per tutti questi casi d’uso, esistono delle clausole corrispondenti che possono essere utilizzate all’interno di un comando SELECT SQL:

Comando SQL Spiegazione Esempio
DISTINCT Rimuove i duplicati dall’insieme di risultati SELECT DISTINCT Country FROM Customers;
LIMIT Limita il result set ai risultati più importanti SELECT * FROM Customers LIMIT 5;
GROUP BY Raggruppa il result set in base a una caratteristica comune SELECT CustomerName, Country FROM Customers GROUP BY Country;
ORDER BY Classifica il result set in base a una caratteristica SELECT CustomerName, Email FROM Customers SORT BY CustomerName;
ASC Utilizza l’ordine crescente (“ascending”) SELECT DISTINCT Country FROM Customers SORT BY Country ASC;
DESC Utilizza l’ordine decrescente (“descending”) SELECT DISTINCT Country FROM Customers SORT BY Country DESC;

Comandi SQL per il collegamento delle query

Oltre ad affinare l’insieme di risultati, è possibile collegare le query tra più tabelle. Tenete presente che un comando SQL SELECT restituisce un insieme di risultati. Di conseguenza, SQL contiene comandi tali da consentire l’unione di due result set secondo le regole della teoria degli insiemi relazionali.

Per poter spiegare in dettaglio i comandi SQL per il collegamento delle query sarebbero necessari esempi complessi con diverse tabelle definite. Pertanto, in questa sede faremo a meno di utilizzare un codice di esempio. Passiamo in rassegna le operazioni degli insiemi più importanti:

Comando SQL Spiegazione
UNION Unisce due insiemi di risultati; i result set devono avere colonne dello stesso tipo nello stesso ordine. Le loro righe vengono unite.
INNER JOIN Filtra due insiemi di risultati in base a un criterio comune.
LEFT JOIN Unisce l’insieme di risultati della query di sinistra con i risultati corrispondenti della query di destra; i campi non corrispondenti vengono impostati su NULL.
RIGHT JOIN Unisce l’insieme di risultati della query di destra con i risultati corrispondenti della query di sinistra; i campi non corrispondenti vengono impostati su NULL.
FULL OUTER JOIN Combinazione di un LEFT JOIN e un RIGHT JOIN.

Comandi SQL per la memorizzazione e la ripetizione delle query

Come si è visto, le query SQL possono essere piuttosto complesse. Nella pratica, in genere conviene eseguire le query più volte. In linea di principio, è possibile memorizzare i comandi SQL corrispondenti come codice e importarli quando necessario. Si tratta tuttavia di una soluzione poco efficiente. Per fortuna, esistono speciali comandi SQL che consentono di salvare query complesse come unità direttamente nel sistema di gestione dei database (DBMS).

Consideriamo prima di tutto le viste, chiamate “views” in inglese. Una vista del database corrisponde all’incirca a una query memorizzata. Non dimentichiamo che una query restituisce come risultato un insieme di tabelle. Anziché scartarlo, lo salveremo come vista. Le viste sono anche note come “tabelle virtuali”. Di regola, una vista può essere solo letta. Ci sono diversi comandi SQL per lavorare con le viste:

Comando SQL Spiegazione Esempio
CREATE VIEW Crea una nuova vista CREATE VIEW ItalianCustomers AS SELECT CustomerName, Email FROM Customers WHERE Country = "IT";
ALTER VIEW Modifica una vista esistente ALTER VIEW ItalianCustomers AS SELECT * FROM Customers WHERE Country = "IT";
CREATE OR REPLACE VIEW Crea una nuova vista o ne sostituisce una esistente, se necessario CREATE OR REPLACE VIEW ItalianCustomers AS SELECT * FROM Customers WHERE Country = "IT";
SHOW CREATE VIEW Mostra il comando SQL utilizzato per creare una vista SHOW CREATE VIEW ItalianCustomers;
DROP VIEW Elimina una vista esistente DROP VIEW ItalianCustomers;

Insieme alle viste del database, esistono anche le procedure memorizzate (“stored procedures”). Le procedure memorizzate sono utilizzate per eseguire ripetutamente le query e sono più complesse delle viste. Sono in grado di accettare parametri e servirsene per comporre le query in modo dinamico. In più, per mezzo di una procedura memorizzata è possibile accedere in scrittura ai dati sottostanti. Per motivi di spazio, forniamo un riepilogo dei comandi SQL pertinenti, senza esempi:

Comando SQL Spiegazione
CREATE PROCEDURE Crea una nuova procedura
ALTER PROCEDURE Modifica una procedura esistente
CREATE OR REPLACE PROCEDURE Crea una nuova procedura o eventualmente sostituisce una esistente
DROP PROCEDURE Elimina una procedura esistente
CALL Esegue una procedura memorizzata

L’uso di procedure memorizzate trasferisce il codice dal client al server. La separazione delle competenze ottenuta in questo modo porta a una maggiore sicurezza e a migliori prestazioni. Lo svantaggio può essere che la logica di business contenuta in una procedura memorizzata è al di fuori del sistema di controllo della versione. Dal momento che le procedure memorizzate dipendono strettamente dal DBMS circostante, un cambio di provider, nel peggiore dei casi, porta a una perdita di funzionalità.

N.B.

Le procedure memorizzate non sono da confondere con i prepared statement (in italiano: “dichiarazioni preparate”). Ambedue i meccanismi contribuiscono a migliorare la sicurezza. I prepared statement, tuttavia, sono definiti lato client, quindi da parte dell’applicazione.

Comandi SQL per il controllo degli accessi

Un singolo server di database può comprendere più database. Per riuscire a gestirli in modo indipendente l’uno dall’altro, si ricorre a meccanismi di controllo degli accessi. Ad esempio, per i singoli utenti è possibile definire i permessi con cui accedere ai database e alle tabelle in essi contenute. Si possono inoltre definire gruppi di utenti e assegnare loro utenti. A tali scopi sono utilizzati due comandi SQL principali:

Comando SQL Spiegazione Esempio
GRANT Assegna permessi GRANT ALL ON SomeDB.* TO 'sara'@'localhost';
REVOKE Revoca permessi REVOKE INSERT ON *.* FROM 'sara'@'localhost';

Comandi SQL per il controllo delle transazioni

Tra i vantaggi dell’utilizzo di sistemi di gestione di database relazionali (RDBMS) vi è la garanzia di proprietà “ACID”. In sintesi, ciò assicura che i dati siano sempre in uno stato pulito e ben definito. A livello tecnico, si usano le cosiddette transazioni, inscindibili in quanto atomic operation (operazioni atomiche). Una transazione viene completata interamente e senza errori, altrimenti significa che si è verificato un errore. In tal caso, quindi, verranno annullati i singoli passaggi. Diamo un’occhiata ai comandi SQL per il controllo delle transazioni:

Comando SQL Spiegazione Esempio
START TRANSACTION Segnala l’inizio di una transazione START TRANSACTION;
COMMIT Completa con successo una transazione avviata START TRANSACTION; TRUNCATE TABLE Customers; COMMIT;
ROLLBACK Annulla una transazione avviata e riporta lo stock di dati allo stato iniziale START TRANSACTION; TRUNCATE TABLE Customers; ROLLBACK;
SAVEPOINT Crea un punto di salvataggio con nome all’interno di una transazione START TRANSACTION; SAVEPOINT BeforeAddData;
ROLLBACK TO Torna indietro a un punto di salvataggio denominato ROLLBACK TO BeforeAddData;

Un riepilogo delle proprietà ACID menzionate:

Proprietà ACID Corrispondente in italiano Spiegazione
Atomicity Atomicità Le transazioni sono inscindibili. Esse vengono eseguite completamente o non vengono eseguite affatto. Se una transazione atomica viene annullata, il sistema si ritroverà allo stato precedente all’inizio della transazione.
Consistency Consistenza Dopo l’esecuzione di una transazione, lo stock di dati si trova di nuovo in una forma consistente.
Isolation Isolamento Le operazioni eseguite in contemporanea non devono influenzarsi a vicenda.
Durability Durabilità Gli effetti di una transazione devono rimanere in modo permanente nello stock di dati. Gli effetti di una transazione andata a buon fine non devono andare persi se, ad esempio, l’RDBMS si blocca.
Consiglio

Fissate la Digital Guide alla barra delle applicazioni di Windows. In questo modo i nostri articoli saranno sempre a portata di mouse e pronti per essere consultati. Qui vi spieghiamo come fare:

Hai trovato questo articolo utile?
Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.
Page top