Structured Query Language o in breve SQL ( ) è un linguaggio standardizzato per database basati sul modello relazionale (RDBMS), progettato per le seguenti operazioni:
creare e modificare schemi di database (DDL = Data Definition Language); inserire, modificare e gestire dati memorizzati (DML = Data Manipulation Language); interrogare i dati memorizzati (DQL = Data Query Language); creare e gestire strumenti di controllo e accesso ai dati (DCL = Data Control Language).
A dispetto del nome, non si tratta perciò di un semplice linguaggio di interrogazione: alcuni suoi sottoinsiemi, infatti, permettono di creare, gestire e amministrare database.
Storia Il 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 (per questo la corretta pronuncia IPA di SQL è e quella informale ). 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 (il nome SEQUEL era già stato usato, e soprattutto registrato, in un altro ambito per una compagnia aerea), 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 pubblicò DB2, il suo RDBMS (relational database management system) diffuso . 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 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. Con SQL si leggono, modificano, cancellano dati e si esercitano funzioni gestionali e amministrative sul sistema dei database. La maggior parte delle implementazioni dispone 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 vendor 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 esempio i linguaggi imperativi), piuttosto di specificare le proprietà logiche delle informazioni ricercate. Esso si divide in:
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 sette categorie: Operatori di assegnazione Operatori di confronto Operatori stringa Operatori aritmetici Operatori condizionali Operatori logici Operatori tra bit
Operatori di assegnazione Gli operatori di assegnazione assegnano un valore a una variabile o a un campo.
Esprime un'assegnazione e non restituisce alcun valore. Esprime un'assegnazione di un valore ad una variabile non ancora istanziata e non restituisce alcun valore.
Operatori di confronto Gli operatori di confronto servono a determinare uguaglianze e disuguaglianze tra valori e a effettuare ricerche all'interno dei dati. Di seguito uno schema tabellare:
Esprime uguaglianza tra due valori numerici o stringhe di caratteri (dove non è usato come operatore di assegnazione) Si usa per verificare se un valore è , oppure se corrisponde a un valore booleano (, , ). Esprime somiglianza tra due valori letterali: con l'operatore è 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 Recupera un valore compreso tra due valori Stabilisce se un valore è contenuto in una lista di valori possibili Stabilisce se una determinata subquery restituisce un valore o Stabilisce se una determinata subquery restituisce almeno uno dei valori specificati Stabilisce se una determinata subquery restituisce tutti i valori desiderati
Ad alcuni di questi operatori corrisponde un operatore contrario che fa uso del termine :
Operatori stringa Gli operatori stringa accettano come operandi due stringhe e restituiscono un valore booleano o stringa.
Operatore LIKE L'operatore (viene usato anche MATCHES), di solito, è alla base dei criteri di ricerca per parole chiave e delle query effettuate da un motore di ricerca.
Il carattere underscore (), detto wildchar, 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. Per ricercare il carattere underscore all'interno di un'espressione utilizzare la sintassi (leggi anche più avanti).
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) (), 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. Questa completezza nell'implementazione di LIKE è dovuta al fatto che Access non prevede operatori più complessi come SIMILAR TO e REGEXP.
Nonostante questa completezza, il driver OLE DB per Windows ha un bug noto: l'operatore jolly è utilizzabile solo all'interno dell'applicazione, mentre via OLE DB/ODBC deve essere utilizzato il classico simbolo .
Operatori SIMILAR TO e REGEXP L'operatore SIMILAR TO è parte dello standard SQL e consente di verificare se una stringa corrisponde a una data espressione regolare. La sintassi utilizzata è differente dagli standard de facto che sono stati stabiliti da Perl e da POSIX e per questo motivo l'adozione di tale operatore da parte dei produttori è piuttosto limitata.
L'operatore REGEXP è più diffuso e anch'esso consente di verificare se una stringa corrisponde a una data espressione regolare. La sintassi utilizzata varia a seconda dell'implementazione SQL, tuttavia in genere è piuttosto aderente agli standard de facto stabiliti dal Perl o da POSIX.
L'SQL prevede anche gli operatori complementari e .
BINARY Questo operatore serve a rendere case-sensitive l'applicazione delle espressioni regolari, cioè a far sì che le lettere maiuscole siano considerate differenti dalle minuscole.
COLLATE Questo operatore serve a specificare quale collazione (insieme di regole per l'ordinamento di un set di caratteri) deve essere utilizzata nell'espressione corrente.
Operatori aritmetici Gli operatori aritmetici accettano operatori di un tipo numerico (interi o decimali) e restituiscono il risultato dell'operazione aritmetica corrispondente. Di seguito uno schema tabellare:
Operatore Descrizione + Effettua un'addizione, o lascia immutato il segno di un numero - Effettua una sottrazione, o inverte il segno di un numero * Effettua una moltiplicazione / Effettua una divisione MOD Restituisce il resto di una divisione DIV Restituisce la parte intera di 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 appartengono agli operatori logici booleani e sono AND (e), OR (o, oppure), NOT (non), XOR (detto anche "OR esclusivo"). L'operatore logico , che lega due condizioni, restituisce il valore se e solo se entrambi gli operandi sono veri. L'operatore logico , che lega due condizioni, restituisce se e solo se almeno uno degli operandi è vero. L'operatore accetta un solo operando e restituisce il valore inverso: falso se questo è vero, vero se questo è falso. L'operatore XOR, che accetta due condizioni, restituisce se e solo se uno solo degli operandi è vero.
Operatori tra bit Lo standard SQL non prevede questa famiglia di operatori, tuttavia essa è presente in molte implementazioni. Questi operatori effettuano le operazioni AND, OR, NOT e XOR a livello di bit.
Regole generali per gli operatori Un'espressione è costituita da un valore o da un'operazione che restituisce un valore. Questa definizione è ricorsiva: le espressioni possono essere annidate. Poiché gli operatori restituiscono sempre un valore, è perfettamente lecito combinarli tra loro per formare condizioni via via più complesse.
L'uso delle parentesi tonde all'interno delle espressioni di ricerca consente di modificare o esplicitare la precedenza degli operatori, ossia l'ordine in cui essi vengono elaborati. Ove un'espressione composta sia scritta senza parentesi, vengono applicate le precedenze tra gli operatori previste dal linguaggio.
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 il quale si usa il DML (Data Manipulation Language). L'utente deve avere i permessi necessari per agire sulla struttura del database e questi permessi vengono assegnati tramite il DCL (Data Control Language).
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.
DML: Manipolazione dei dati