Structured Query Language
In informatica SQL (Structured Query Language) è un linguaggio di interrogazione per database progettato per leggere, modificare e gestire dati memorizzati in un sistema di gestione di basi di dati basato sul modello relazionale (RDBMS), per creare e modificare schemi di database, per creare e gestire strumenti di controllo ed accesso ai dati.
Storia
L'SQL nasce nel 1974 ad opera di Donald Chamberlin, nei laboratori dell'IBM. Nasce come strumento per lavorare con database che seguano il modello relazionale. A quel tempo però si chiamava SEQUEL (la corretta pronuncia IPA è [ˈɛsˈkjuˈɛl], quella informale [ˈsiːkwəl]). Nel 1975 viene sviluppato un prototipo chiamato SEQUEL-XRM; con esso si eseguirono sperimentazioni che portarono, nel 1977, a una nuova versione del linguaggio, che inizialmente avrebbe dovuto chiamarsi SEQUEL/2 ma che poi divenne, per motivi legali, SQL. Su di esso si sviluppò il prototipo System R, che venne utilizzato da IBM per usi interni e per alcuni suoi clienti. Ma, dato il suo successo, anche altre società iniziarono subito a sviluppare prodotti basati su SQL. Nel 1981 IBM iniziò a vendere alcuni prodotti relazionali e nel 1983 rilasciò DB2, il suo DBMS relazionale diffuso ancor oggi. SQL divenne subito lo standard industriale per i software che utilizzano il modello relazionale.
L'ANSI lo adottò come standard fin dal 1986, senza apportare modifiche sostanziali alla versione inizialmente sviluppata da IBM. Nel 1987 la ISO fece lo stesso. Questa prima versione standard è denominata SQL/86. Negli anni successivi si realizzarono altre versioni, che furono SQL/89, SQL/92 e SQL/2003. Tale processo di standardizzazione mirava alla creazione di un linguaggio che funzionasse su tutti i DBMS (Data Base Management Systems) relazionali, ma questo obiettivo non fu raggiunto. Infatti, i vari produttori implementarono il linguaggio con numerose variazioni e, in pratica, adottarono gli standard ad un livello non superiore al minimo, definito dall'Ansi come Entry Level.
Caratteristiche
SQL è un linguaggio per interrogare e gestire basi di dati mediante l'utilizzo di costrutti di programmazione denominati query. La prima versione fu sviluppata da IBM all'inizio degli anni settanta. Chiamata originariamente SEQUEL era progettata per manipolare dati memorizzati nel database relazionale ideato e brevettato da IBM. Nel 1986 l'ANSI lo standardizzò con la sigla SQL-86. Negli anni successivi sono state rilasciate altre versioni, riconosciute anche dall'ISO. La maggior parte dei sistemi per la gestione di database implementano questi standard ed aggiungono funzionalità aggiuntive proprietarie. Con SQL si leggono, modificano, cancellano dati e si esercitano funzioni gestionali ed amministrative sul sistema dei database. La maggior parte delle implementazioni dispongono di interfaccia alla riga di comando per l'esecuzione diretta di comandi, in alternativa alla sola interfaccia grafica GUI.
Originariamente progettato come linguaggio di tipo dichiarativo, si è successivamente evoluto con l'introduzione di costrutti procedurali, istruzioni per il controllo di flusso, tipi di dati definiti dall'utente e varie altre estensioni del linguaggio. A partire dalla definizione dello standard SQL:1999 molte di queste estensioni sono state formalmente adottate come parte integrante di SQL nella sezione SQL/PSM dello standard.
Alcune delle critiche più frequenti rivolte ad SQL riguardano la mancanza di portabilità del codice fra vendors diversi, il modo inappropriato con cui vengono trattati i dati mancanti (Null), e la semantica a volte inutilmente complicata.
Struttura
Essendo un linguaggio dichiarativo, SQL non richiede la stesura di sequenze di operazioni (come ad es. i Linguaggi imperativi), piuttosto di specificare le proprietà logiche delle informazioni ricercate. Esso si divide in tre sottoinsiemi:
- Data Definition Language (DDL) - permette di creare e cancellare database o di modificarne la struttura
- Data Manipulation Language (DML) - permette di inserire, cancellare, modificare i dati
- Data Control Language (DCL) - permette di gestire gli utenti e i permessi
- Query language (QL) - permette di interrogare il database, cioè di leggere i dati.
- Device Media Control Language (DMCL) - permette di controllare i supporti (memorie di massa) dove vengono memorizzati i dati.
Operatori
Gli operatori, messi a disposizione dal SQL standard si dividono in quattro categorie:
- Operatori di confronto
- Operatori aritmetici
- Operatori condizionali
- Operatori logici
Operatori di confronto
Gli operatori di confronto servono a determinare uguaglianze e disuguaglianze tra valori e ad effettuare ricerche all'interno dei dati. Di seguito uno schema tabellare:
- = Esprime uguaglianza tra due valori numerici o stringhe di caratteri
- LIKE Esprime somiglianza tra due valori letterali: con l'operatore LIKE è possibile usare, per i confronti, i caratteri speciali % (sostituisce un arbitrario numero di lettere) e _ (sostituisce una lettera arbitraria )
- < Stabilisce se un valore è minore di un altro
- > Stabilisce se un valore è maggiore di un altro
- <= Stabilisce se un valore è minore o uguale di un altro
- >= Stabilisce se un valore è maggiore o uguale di un altro
- <> Stabilisce se due valori sono diversi tra loro
- != equivale a <>
- BETWEEN Recupera un valore compreso tra due valori
- IN Stabilisce se un valore è contenuto in una lista di valori possibili
- EXISTS Stabilisce se una determinata condizione di query esiste
Operatore LIKE
L'operatore LIKE è alla base dei criteri di ricerca per parole chiave e delle query effettuate da un motore di ricerca.
Il carattere underscore ("_"), detto wildchart, esegue la ricerca su un singolo carattere arbitrario; il simbolo "%" è detto operatore jolly ed esegue la ricerca su una stringa arbitraria, ovvero su un intervallo di valori numerici.
La sintassi di Microsoft Access è leggermente diversa da questo standard internazionale, e più completa. Invece del simbolo underscore, si utilizza "?" per ricercare un singolo carattere (sia numero che lettera); invece del simbolo "%", l'operatore jolly è dato da "*".
Access permette di ricercare un singolo valore numerico tramite il tasto hash (o cancelletto) ("#") (da non confondere con l'analogo simbolo musicale sharp, che denota il diesis), e di ricercare un carattere (lettera e numero) all'interno o all'esterno di un insieme di valori, con la sintassi "[]" e "[!]". L'intervallo può essere puntuale o collettivo: ad esempio, [A-F] indica le lettere comprese fra A ed F, mentre [A, F] indica solo la ricerca di queste due lettere.
Ad esempio, un'istruzione come 'LIKE P[!A-F]C' ricerca le parole che iniziano per "P", finiscono per "C" e per seconda lettera non hanno i caratteri compresi fra le lettere A e F.
Operatori aritmetici
Gli operatori aritmetici effettuano calcoli all'interno di una ricerca. Di seguito uno schema tabellare :
Operatore Descrizione
- + Effettua un'addizione
- - Effettua una sottrazione
- * Effettua una moltiplicazione
- / Effettua una divisione
Operatori condizionali
L'unico operatore condizionale di SQL è WHERE (dove) e serve a definire criteri di ricerca mirati.
Operatori logici
Gli operatori logici di SQL sono AND (e), OR (o, oppure), NOT (non), XOR (detto anche "OR esclusivo"); possono essere ripetuti più volte all'interno dell'elenco delle condizioni di ricerca.
L'operatore logico AND, che lega due (o più) condizioni, serve ad indicare alla ricerca di restituire tutte le tuple per le quali le due (o più) condizioni espresse sono tutte vere contemporaneamente.
L'operatore logico OR, che lega due (o più) condizioni, serve ad indicare alla ricerca di restituire tutte le tuple per le quali anche soltanto una delle due (o più) condizioni espresse è vera.
L'operatore NOT inverte il valore ad esso associato: se è vero restituisce un valore falso, mentre se è falso restituisce un valore vero.
L'operatore XOR esegue un'esclusione logica tra due espressioni numeriche. Per il suo funzionamento l'operatore XOR gestisce le espressioni come valori booleani (0 equivale a false mente tutti gli altri valori equivalgono a true). Restituisce sempre un valore booleano: true se solo una delle espressioni restituisce true; restituisce false in caso contrario.
L'uso delle parentesi tonde ( ) all'interno dell'elenco delle condizioni di ricerca consente di combinare condizioni differenti utilizzando entrambi i tipi di operatori logici per creare condizioni complesse.
DDL: Definizione dei dati
DDL (data definition language – linguaggio di definizione dei dati) serve a creare, modificare o eliminare gli oggetti in un database. Sono i comandi DDL a definire la struttura del database e quindi dei dati ivi contenuti. Ma non fornisce gli strumenti per modificare i dati stessi: per tale scopo si usa il DML. L'utente deve avere i permessi necessari per agire sulla struttura del database e questi permessi vengono assegnati tramite il DCL.
Elenco di tutte le funzioni SQL che riguardano il DDL
Domini Elementari
SQL mette a disposizione sei famiglie di domini elementari a partire dai quali si possono definire i domini da associare agli attributi dello schema.
Tipo di dato
DML: manipolazione dei dati
DML (data manipulation language – linguaggio di manipolazione dei dati) fornisce i comandi per inserire, modificare, eliminare o leggere i dati all'interno delle tabelle di un database. La struttura di questi dati deve già essere stata definita tramite il DDL. Inoltre, il permesso di accedere a tali dati deve essere assegnato all'utente tramite il DCL.
Select
Col comando select abbiamo la possibilità di estrarre i dati, in modo mirato, dal database.
Sintassi del comando select
SELECT [ ALL | DISTINCT | TOP ] lista_elementi_selezione
FROM lista_riferimenti_tabella
[ WHERE espressione_condizionale ]
[ GROUP BY lista_colonne HAVING Condizione ]
[ ORDER BY lista_colonne ];
dove lista_elem_selezione è l'elenco dei campi da estrarre (separati tra loro con una virgola), lista_riferimenti_tabella è l'elenco delle tabelle da cui estrarre i dati, espressione_condizionale rappresenta l'elenco delle condizioni, ovvero dei requisiti che un campo deve rispettare per poter essere prelevato dall' interrogazione (le condizioni sono specificate mediante gli operatori di confronto, connettori logici e comparatori come between, in, like, is null); lista_colonne è la colonna o le colonne che devono essere prese come riferimento per l'ordinamento dei dati in uscita.
Di default il comando select agisce con il metodo all ma in qualcaso non si voglia ottenere come risultato della query una ripetizione di righe, si specifica il metodo distinct, top limita il numero delle righe fornite TOP 10 prende le prime 10 righe della mia tabella.
Un esempio è il seguente:
SELECT DISTINCT cognome, nome, citta_residenza
FROM utenti
WHERE anni > = 18
ORDER BY cognome
(La clausola ORDER BY serve per ordinare, l'ordinamento può essere basato anche su più di un campo). Questa query estrae l'elenco di tutti gli utenti maggiorenni ordinando l'output in base al cognome. La definizione di select è comunque molto più ampia, prevede molte altre opzioni ma in linea di massima con queste opzioni si compongono la maggior parte delle interrogazioni.
SELECT DISTINCT *
FROM utenti
l'asterisco permette di includere nella selezione tutte le colonne della tabella utenti
Con le select è possibile anche eseguire dei calcoli:
Select DISTINCT cod_art, prezzo_unit*giacenza AS Totale, giacenza*ingombro AS TotIngombro;
FROM articoli
questo produce dati estratti ma anche dati calcolati. Il metodo AS serve per dare un nome alla nuova colonna nella nuova tabella che creerà la select.
Insert
Il comando ha la funzione di inserire i dati nelle tabelle.
Le colonne (o campi) di destinazione dei valori possono essere o meno dichiarate nel comando. Se non vengono dichiarate, è necessario passare al comando un valore per ogni colonna della tabella, rispettando rigorosamente l'ordine delle colonne stesse. Se, invece, le colonne di destinazione vengono dichiarate, è possibile indicare le sole colonne per le quali vengono passati dei valori, purché vengano inseriti comunque i valori per tutte le colonne not null (che non possono essere nulle) della tabella.
Di per sé il comando insert opera inserendo in tabella una sola riga per volta. È possibile, però, inserire più di una riga "in modo automatico" passando all'insert una serie di righe (o tuple) risultanti da un comando di select, purché tali righe siano compatibili con le colonne della tabella su cui si inseriscono i dati.
Sintassi del comando insert
- Insert semplice:
begin readln nome_tabella writeln (elenco valori, tutti, rispettando l’ordine dei campi della tabella); </source> if
then nome_tabella (elenco dei campi interessati dall’inserimento)
VALUES (elenco valori, tutti, rispettando l’ordine dei campi dichiarati sopra);
else
repeat
<source lang="sql">
INSERT INTO nome_tabella (elenco dei campi interessati dall’inserimento) AS
until SELECT ...;
end.
=== Update ===
Il comando ''update'' ha la tripla funzione di modificare i dati delle tabelle.
Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave ''SET'' e deve essere seguito dal simbolo " = " (uguale) e dal nuovo valore che deve assumere.
È possibile modificare più campi della stessa riga in un unico comando update, separandoli l'uno dall'altro con il simbolo ", " (virgola).
Il comando generico aggiorna tutte le righe della tabella. È possibile restringerne il numero
applicando la parola chiave aggiuntiva ''WHERE'', che permette di effettuare una selezione qualitativa delle righe imponendo delle condizioni sui dati presenti nelle righe prima dell'aggiornamento.
==== Sintassi del comando update ====
* Update generico:
<source lang="sql">
UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
nome_campo2 = 'valore2_nuovo',
...
;
- Update con condizione:
UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
nome_campo2 = 'valore2_nuovo'
WHERE nome_campo3 = 'valore';
Delete
Il comando delete ha la funzione di cancellare i dati dalle tabelle.
Come il comando update anche delete può operare in modo generico cancellando tutte le righe della tabella oppure può identificare le righe da cancellare mediante la parola chiave aggiuntiva WHERE e la condizione (o le condizioni) ad essa associata.
Sintassi del comando delete
- Delete generico:
DELETE FROM nome_tabella;
- Delete con condizione:
DELETE FROM nome_tabella
WHERE nome_campo = 'valore';
Truncate Table
Come già detto, una Delete priva di clausola Where cancella tutte le righe dalla tabella specificata. Tuttavia, esiste un altro modo per svuotare completamente una tabella: il comando Truncate Table. Alcuni DBMS implementano questo comando (che non è presente nello standard SQL) in modo più veloce rispetto a una Delete, ad esempio cancellando il file dei dati senza leggerlo e ricreandolo vuoto. Generalmente però questo impedisce che vengano restituite alcune informazioni accessorie, come il numero di righe cancellate.
Sintassi del comando truncate table
TRUNCATE [TABLE] nome_tabella
La transazione
Le istruzioni di DML Insert, Update, Replace e Delete, se poste all'interno di una transazione, non sono irreversibili e possono essere annullate nel caso ci si renda conto che non sono state applicate in modo corretto.
Una transazione è un blocco di istruzioni che sono strettamente correlate tra loro. Nel caso si verifichi un errore (sia esso nel programma oppure dovuto ad un problema esterno, per esempio se il sistema si blocca) non verrà annullata solo l'ultima istruzione, ma l'intera transazione. In tal modo si è certi che l'integrità dei dati verrà garantita.
Begin Transaction
Per iniziare esplicitamente una transazione si utilizza il comando BEGIN TRANSACTION. La mancanza di questo comando fa sì che ogni istruzione funga da transazione a sé stante.
Sintassi del comando begin transaction
BEGIN TRANSACTION [transaction_name];
Commit
Per confermare la transazione si utilizza il comando COMMIT. Con esso tutte le modifiche effettuate sui dati in precedenza vengono memorizzate.
Sintassi del comando commit
COMMIT [TRANSACTION] [transaction_name];
Rollback
Per annullare la transazione si utilizza il comando ROLLBACK. Con esso tutte le modifiche effettuate sui dati in precedenza (a partire dall'inizio della transazione) vengono cancellate.
Sintassi del comando rollback
ROLLBACK [TRANSACTION] [transaction_name];
DCL: Controllo sui dati
DCL serve a fornire o revocare agli utenti i permessi necessari per poter utilizzare i comandi DML e DDL, oltre agli stessi comandi DCL (che gli servono per poter a sua volta modificare i permessi su alcuni oggetti).
Grant
Il comando Grant fornisce uno o più permessi a un determinato utente (es: il permesso di inserimento in una tabella, di modificarla o eliminarla) e di amministratore di valore.
Revoke
Il comando Revoke revoca uno o più permessi a un determinato utente (es: il permesso di cancellazione da una tabella).
Critiche a Sql
Sql è un linguaggio di interrogazione pensato per interagire con i database relazionali. I teorici fanno però notare come le caratteristiche originali dell'Sql, ispirate al calcolo delle tuple, in realtà lo violino. Le sue estensioni più recenti supportano pienamente il Modello relazionale, ma hanno peggiorato le suddette violazioni.
Inoltre, vi sono molte critiche sull'utilizzo pratico dell'Sql:
- non fornisce un modo standard per suddividere un lungo comando in comandi più brevi a cui ci si possa riferire tramite un nome (sebbene molte implementazioni in realtà forniscano questa funzionalità);
- le diverse implementazioni sono generalmente incompatibili tra loro;
- si fa troppo affidamento sui valori NULL (un metavalore che secondo alcuni accademici dovrebbe indicare l'assenza di un valore, secondo altri dovrebbe indicare un valore sconosciuto, mentre nella pratica finisce per essere usato in entrambi i modi, o in uno solo, ma in modo incoerente)..
Voci correlate
Collegamenti esterni
- SQL. Guida gratuita in italiano realizzata dal Dipartimento del Tesoro (in pdf).
- MySQL.it
- Tutorial de SQL
- (EN) PostgreSQL
- (EN) Oracle SQL tutorials
- (EN) wiscorp.com
- Manuale e tuorial SQL da Webmasterpoint.org