Lo Structured Query Language (SQL) fu sviluppato per un prototipo di Relational Database Management System (RDBMS), System R, da IBM nella metà degli anni '70 e descritto da Codd nel 1976. Nel 1979 fu introdotto commercialmente da IBM DB2 e Oracle Corporation. L'American National Standards Institutes (ANSI) adotta il SQL come linguaggio standard per database relazionali nell'Ottobre 1986 (ANSI X3.132-1986). SQL è stato adottato dall'Iternational Standard Organization (ISO 9075). E' stato ridescritto come ANSI SQL89 (X3.132-1986 e 9075-1989) e recentemente come ANSI SQL92. I maggiori RDBMS supportano qualche forma di SQL e vi è una generale tendenza allo standard ANSI-SQL.
SQL è un linguaggio non procedurale, in quanto non richiede la descrizione dei passi elementari di elaborazione, viene richiesta unicamente la descrizione del risultato finale, questo comporta che il SQL può manipolare in una unica clausola un set di dati (la forma più comune di set di dati è la relazione). Le clausole SQL accettano set di dati in input e restituiscono set di dati, consentono quindi la nidificazione delle clausole in quanto una clausola può essere usata come input per un'altra clausola.
SQL non richiede che venga specificato il metodo di accesso ai dati, utilizza una porzione del RDBMS chiamata query optimizer per determinare la via più veloce di accesso ai dati, per l'utilizzo di eventuali indici e la determinazione dei loro tipi.
SQL è al tempo stesso un linguaggio per la definizione dei dati: Data Definition Language (DDL) e per la manipolazione dei dati: Data Manipulation Language (DML).
Viene utilizzato per definire lo schema di un database. Le definizioni vengono memorizzate nel Data Dictionary che è un database speciale (system database). Il DDL può operate sia a livello esterno (view definition), sia a livello interno (tables definition e Device Control Language).
Viene utilizzato sia per interrogare il database sia per inserire, modificare o cancellare i dati.
Ogni costante o variabile manipolata è definita da un tipo di dato che fissa un set di proprietà al valore. Queste proprietà permettono di trattare differentemente tipi di dato diversi. I principali tipi di dato implementati sono i seguenti:
CHAR (o VARCHAR) permette di manipolare testi in formato libero di lunghezza fissa o variabile. La massima lunghezza ammessa è di 255 caratteri. Questo è il tipo di dato con caratteristiche meno restrittive.
NUMBER permette di manipolare valori numerici con segno, interi o in virgola mobile, virtualmente fino ad una magnitudine di 38 cifre.
DATE permette di manipolare valori in formato data.
LONG per testi in formato libero virtualmente fino a 65535 caratteri, su cui si applicano però restrizioni di diversa natura relativamente alle clausole SQL.
RAW e LONGRAW per dati di tipo byte-oriented, come stringhe di caratteri esadecimali.
ROWID stringa esadecimale che rappresenta il codice di identificazione per ogni riga di tabella.
NULL rappresenta un valore assente ed è appropriato quando il valore è sconosciuto o privo di significato.
Tutti gli operatori accettano zero o più argomenti e restituiscono uno o più risultati. L'ordine di precedenza è quello riportato per ciascun dei gruppi e può comunque essere modificato mediante gli operatori ().
Aritmetici:
il loro risultato è sempre un valore numerico e sono:
+ o - denotano espressioni positive o negative.
* o / moltiplicazione, divisione.
+ o - addizione, sottrazione.
Su caratteri:
l'operatore di concatenazione di stringhe è l'unico operatore su carattere ed è denotato da ||
Comparativi:
sono usati per effettuare il confronto tra espressioni ed il risultato può essere "vero" o "falso".
= test di uguaglianza.
!= test di disuguaglianza.
> maggiore di.
< minore di.
>= maggiore o uguale.
<= minore o uguale.
IN presente in.
LIKE verifica la corrispondenza di pattern di caratteri.
EXIST verifica l'esistenza di una t-upla.
Logici:
sono usati per influire sul risultato di multiple condizioni e sono:
NOT inverte il risultato di una espressione logica.
AND verifica tutte le condizioni logiche.
OR verifica almeno una delle condizioni logiche.
Set:
sono definito come: UNION, MINUS, INTERSECT e corrispondono rispettivamente agli operatori di Unione, Differenza ed Intersezione dell'algebra relazionale.
Le clausole SQL sono in formato libero e basano la loro sintassi sull'uso di parole chiave.
La struttura tipica di una interrogazione SQL è la seguente:
SELECT <lista di attributi>
FROM <lista di relazioni>
WHERE <lista di condizioni>
La parola chiave SELECT descrive l'insieme degli attributi della relazione che vogliamo produrre come risultato dell'interrogazione, la parola chiave FROM descrive l'insieme delle relazioni che devono essere utilizzate per produrre la risposta, la parola chiave WHERE descrive le condizioni che devono essere verificate sulle n-uple delle relazioni coinvolte.
Il caso più semplice è quando la lista di relazioni è formata da una sola relazione, l'interrogazione assume la seguente forma:
SELECT <lista di attributi>
FROM r
WHERE <lista di condizioni>
La clausola SELECT svolge il ruolo dell'operatore di proiezione (p), la clausola WHERE svolge il ruolo dell'operatore di selezione (s); se viene omessa la clausola WHERE si effettua la selezione di tutte le n-uple della relazione. Gli argomenti della clausola SELECT non devono necessariamente essere attributi semplici ma possono essere espressioni su attributi e costanti.
Questi esempi mostrano la corrispondenza tra espressioni di algebra relazionale e clausole SQL. Il simbolo * indica che si richiede una proiezione di tutti gli attributi della relazione.
s(R1=x (r))
SELECT *
FROM r
WHERE R1=x
p(R1,R2,R3(s(R1=x AND R2=y (r)))
SELECT
R1,R2,R3
FROM r
WHERE R1=x
AND R2=y
|X|r.A=s.A (r,s)
SELECT *
FROM r,s
WHERE r.A = s.A
Una differenza tra i risultati delle espressioni dell'algebra relazionale e la clausola SELECT è che nel SQL non vengono eliminati i duplicati dai risultati prodotti, questa eliminazione deve essere esplicitamente richiesta per mezzo della parola chiave DISTINCT.
La clausola ORDER BY consente di ordinare il risultato di una interrogazione a particolari attributi, ed assume la forma:
SELECT <lista di attributi>
WHERE <lista di condizioni>
ORDER BY <lista di attributi>
Nel SQL sono presenti inoltre funzioni che permettono di ottenere risultati che siano funzione di un insieme di t-uple, tali funzioni definite funzioni aggregative, non sono presenti nell'algebra relazionale classica ed i risultati di queste funzioni non sono relazioni. Le più comuni sono: COUNT che calcola il numero di t-uple che soddisfano una determinata condizione, SUM, MAX, MIN, AVG che calcolano rispettivamente la somma, il massimo, il minimo, la media su un dominio di valori numerici di un insieme di t-uple.
La clausola GROUP BY rende possibile l'esecuzione di funzioni aggregative su gruppi di sottoinsiemi di t-uple di relazione, ed assume la forma:
SELECT
AVG(<attributo>)
FROM <lista di relazioni>
WHERE <lista di condizioni>
GROUP BY
<attributo>
Le clausole SQL per l'aggiornamento del database sono distinte per i tre tipi di aggiornamento: inserimento, cancellazione e modifica.
La clausola di inserimento (insert) ha due forme distinte, una nel caso di inserimento per valore ed una nel caso di inserimento da interrogazione, ed assumono le seguenti forme:
INSERT INTO <relazione> (<lista di attributi>)
VALUES <lista di valori>
oppure:
INSERT INTO <relazione> (<lista di attributi>)
SELECT ...
La clausola di cancellazione (delete) elimina tutte le n-uple che soddisfano la condizione ed ha la seguente forma:
DELETE FROM <relazione>
WHERE <lista di condizioni>
Omettendo la condizione si ottiene la cancellazione di tutte le n-uple della relazione.
La clausola di modifica (update) sostituisce i valori presenti nei domini della relazione citata con i nuovi valori per tutte le n-uple che soddisfano la condizione ed ha la seguente forma:
UPDATE <relazione>
SET <attributo> = <espressione>
<attributo> = <espressione>
...
WHERE <lista di condizioni>
Anche in questo caso omettendo la condizione si ottiene la modifica di tutte le n-uple della relazione.
Le clausole che permettono la definizione dello schema di database e la conseguente registrazione nel Data Dictionary sono anch'esse in formato libero e basano la loro sintassi sull'uso di parole chiave.
Le principali sono:
Per la creazione di una relazione:
CREATE TABLE <relazione>
Per modificare la definizione di una relazione, aggiungere domini, modificare la definizione dei domini, cancellare o modificarne le costrizioni:
ALTER TABLE <relazione> <parametri>
Per inserire commenti alle relazioni o domini:
COMMENT ON
TABLE <relazione> IS <testo>
COMMENT ON COLUMN <relazione>.<dominio> IS <testo>
Per modificare il nome di una relazione o di un oggetto:
RENAME <vecchio nome> TO <nuovo nome>
Una notevole proprietà del SQL è quella di poter definire viste d'utente (view) che si possono considerare delle relazioni virtuali, in quanto non effettivamente memorizzate nel database, ma interrogabili come effettive relazioni. Il database conserva unicamente la descrizione delle viste che viene definita per mezzo della seguente clausola:
CREATE VIEW <vista> <lista di attributi>
AS SELECT ...
Per la cancellazione di una relazione o di una vista:
DROP TABLE <relazione>
DROP VIEW
<vista>
Una transazione, o unità logica di lavoro, è una sequenza di clausole SQL, che un RDBMS tratta come singola unità.
Le proprietà della transazione sono:
Atomicità:
la transazione non può essere eseguita parzialmente, le azioni che la transazione esegue devono svolgersi tutte correttamente, in caso contrario la transazione deve lasciare inalterata la base dati.
Permanenza:
il risultato prodotto da una transazione deve essere permanente.
Serializzabilità:
nel caso di uso concorrente del database una transazione deve produrre gli stessi risultati che produrrebbe se fosse eseguita da sola.
Isolamento:
ogni transazione è indipendente da ogni altra.
Una transazione inizia con la prima clausola eseguibile SQL, dopo la connessione al database, o dopo una direttiva COMMIT o ROLLBACK, e termina con una COMMIT, una ROLLBACK o una sconnessione dal database.
Per rendere permanenti tutti i cambiamenti effettuati sul database, terminare la transazione, rilasciare i locks della transazione, la clausola SQL ha la seguente forma:
COMMIT WORK
Per annullare tutti i cambiamenti effettuati sul database dall'inizio della transazione, terminare la transazione, rilasciare i locks della transazione, la clausola SQL ha la seguente forma:
ROLLBACK WORK
Alcuni RDBMS prevedono una implicita clausola COMMIT prima e dopo l'esecuzione di una direttiva DDL.