Comandi SQL
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.
- Certificato SSL Wildcard incluso
- Registrazione di dominio sicura
- Indirizzo e-mail professionale da 2 GB
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;
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:
- Data Definition Language (DDL): linguaggio di definizione dei dati
- Data Manipulation Language (DML): linguaggio di manipolazione dei dati
- Data Query Language (DQL): linguaggio di interrogazione dei dati
- Data Control Language (DCL): linguaggio di controllo dei dati
- 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à.
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. |
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: