SQL è il linguaggio di riferimento per le basi di dati relazionali. Il nome SQL nasce come acronimo di Structured Query Language. SQL nasce come linguaggio di interrogazione del DBMS relazionale System R, sviluppato nella seconda metà degli anni Settanta presso il laboratorio di ricerca IBM di S. José in California.
Il linguaggio è stato poi adottato da molti altri sistemi ed è stato oggetto di un'intensa attività di standardizzazione .
Oggi SQL è molto più di un linguaggio per scrivere interrogazioni. SQL infatti racchiude al proprio interno sia le funzionalità di un DDL che quelle di un DML: il DDL (Data Definition Language) è il linguaggio necessario per realizzare lo schema di una base di dati relazionale, invece il DML (Data Manipulation Language) è l'insieme di comandi necessari per la modifica e l'interrogazione della base di dati.
Il linguaggio SQL, in base al diverso software utilizzato, è declinato in diversi dialetti.Ad esempio, la maggior parte dei DBMS non tollera la presenza di spazi.Access, invece, consente di inserire gli spazi e, per rendere chiaro dove inizia e dove finisce una stringa, utilizza dei delimitatori: [].In Oracle i delimitatori sono le virgolette.I dialetti intaccano anche questioni di vera e propria sintassi: si pensi al caso della join.La join tra tabelle serve a tirar fuori dati da tabelle diverse (ma legate attraverso degli identificatori o chiavi).Generalmente una join si scrive così:Select Lista dei Campi from Lista delle tabellewhere identificativo1=identificativo2Microsoft però, in Access, ha introdotto una variante, sostituendo il termine "where" con inner join.Per cui:Select Lista dei Campifrom tabella 1 inner join tabella 2on identificativo1=identificativo2
Le operazioni di interrogazione in SQL vengono specificate per mezzo dell'istruzione select. Questa è la struttura essenziale di una select:select ListaAttributifrom Lista Tabelle[where Condizione]Le 3 parti di cui si compone un'istruzione select vengono chiamate clausola select (o target list), clausola from e clausola where.L'interrogazione SQL seleziona, tra le righe che appartengono al prodotto cartesiano delle tabelle elencate nella clausola from, quelle che soddisfano le condizioni espresse nell'argomento della clausola where.La clausola group by permette di specificare come dividere le tabelle in sottoinsiemi.Facciamo un esempio:select Dipartimento, sum (Stipendio)from Impiegatogroup by DipartimentoCioè estrarre la somma degli stipendi di tutti gli impiegati dello stesso dipartimento.Per prima cosa l'interrogazione viene di fatto eseguita come se la clausola "group by" non esistesse, selezionando gli attributi che appaiono come argomento della clausola "group by" o che compaiono all'interno dell'operatore aggregato.La tabella così ottenuta viene poi analizzata, dividendo le righe in insiemi caratterizzati dallo stesso valore degli attributi che compaiono come argomento della clausola "group by".Dopo che le righe sono state raggruppate in sottoinsiemi, l'operatore aggregato viene applicato separatamente su ogni sottoinsieme: il risultato è una tabella con righe che contengono l'esito della valutazione dell'operatore aggregato affiancato al valore dell'attributo che è stato usato per l'aggregazione.La clausola having invece descrive le condizioni che si devono applicare al termine dell'esecuzione di una interrogazione che fa uso della clausola group by.Ogni sottoinsieme di righe costruito dalla group by fa parte del risultato della interrogazione solo se il predicato argomento della having risulta soddisfatto.
La funzione principale del linguaggio SQL è certamente quella che riguarda la definizione delle interrogazioni. La struttura-tipo di una interrogazione è la seguente:
SELECT C1,…,
CnFROM T1,…,
TmWHERE P
Questo costrutto (tecnicamente chiamato “blocco SQL”) parte dalle tabelle T1,…, Tm generando, come risultato della sua esecuzione, una nuova tabella il cui schema è definito dai campi C1,…, Cn estratti dalla tabella di partenza. La tabella finale comprende i record che si generano combinando i record compresi nelle tabelle di partenza, con il vincolo che la condizione P venga soddisfatta.
Ad esempio:
SELECT Matr, Cognome, Nome
FROM Studenti
WHERE Nato_a = 'Milano'Genera una nuova tabella (a partire dalla tabella “Studenti” di un ipotetico DB) il cui schema è (Matr, Cognome, Nome) e che comprende l’elenco degli studenti nati a Milano.
SQL, come detto, consente anche la manipolazione e la definizione dei dati. I costrutti di manipolazione consentono di inserire, eliminare e modificare il contenuto di record selezionati di una tabella.
Ecco degli esempi:
INSERT INTO Studenti
[4322, 'Rossi', 'Paolo', 12.12.1980, 'Milano']
[4324, 'Bianchi', 'Luca', 21.08.1980, 'Roma']
(inserisce nella tabella Studenti due nuovi record, con il contenuto specificato, campo per campo).
DELETE FROM Studenti
WHERE Matr <>
(cancella dalla tabella Studenti tutti record che soddisfano la condizione specificata).
UPDATE Corsi
SET Crediti = 6
WHERE Titolo = 'Elettromagnetismo'
(modifica come specificato il contenuto del campo Crediti della tabella Corsi per tutti i record che soddisfano la condizione specificata).
SQL, inlotre, mette a disposizione dei costrutti per creare e eliminare tabelle del DB. Per generare una tabella è necessario specificarne lo schema, elencando i campi e precisando il dominio di ogni campo:
CREATE TABLE Studenti
( [Matr] integer,[Cognome] text: 50,
[Nome] text: 50,[Nato il] data,
[Nato a] text: 50)
DROP TABLE Studenti
(elimina la tabella Studenti, con tutto il suo contenuto, dal DB).