Il linguaggio SQL (Structured Query Language) rappresenta di fatto lo standard internazionale per la gestione delle basi di dati relazionali. Standardizzato da comitati come l'ANSI e l'ISO, questo linguaggio è oggi adottato dalla maggior parte dei sistemi DBMS, sia commerciali che open-source. Nel corso del tempo sono state rilasciate diverse versioni che hanno introdotto nuovi costrutti mantenendo sempre la retrocompatibilità, sebbene ogni specifica implementazione possa includere delle funzioni personalizzate non compatibili con altri prodotti.
SQL è un linguaggio di tipo dichiarativo, ovvero non procedurale: ciò significa che il programmatore specifica semplicemente l'obiettivo dell'interrogazione, senza dover indicare al sistema la sequenza di operazioni necessarie per ottenerlo. Inoltre, SQL è "relazionalmente completo", poiché ogni espressione formulabile con l'algebra relazionale può essere tradotta in una corrispondente espressione SQL. Quando un utente formula una query, questa viene presa in carico da un componente del DBMS chiamato Query Optimizer. Il Query Optimizer analizza la richiesta e la traduce nel linguaggio procedurale interno del sistema, applicando tecniche standard per ottimizzarne l'esecuzione. In questo modo, l'utente può concentrarsi esclusivamente sulla leggibilità e sulla correttezza formale della query, senza doversi preoccupare dell'efficienza computazionale.
A livello sintattico, le parole chiave in SQL non fanno distinzione tra maiuscole e minuscole (non sono case-sensitive per i DBMS più diffusi); scrivere "SELECT", "select" o "sELeCt" è indifferente per la macchina, anche se è caldamente consigliato seguire uno standard coerente in tutto il codice. Le istruzioni terminano solitamente con un punto e virgola: sebbene non sia sempre strettamente obbligatorio affinché la query funzioni, è considerata una buona pratica di programmazione per aumentare la leggibilità, specialmente quando si scrivono script complessi. All'interno del codice è possibile inserire commenti utilizzando il doppio trattino (--) per i commenti su una singola riga, oppure racchiudendo il testo tra /* e */ per i commenti su più righe.
Il linguaggio SQL si articola in diverse componenti funzionali: il Data Definition Language (DDL) per la definizione di dati e tabelle, il Data Manipulation Language (DML) per la manipolazione dei record, e il Data Control Language (DCL) per la gestione degli accessi.
Il Data Control Language (DCL) e la Sicurezza
Questo sottoinsieme del linguaggio SQL è di importanza critica per la sicurezza del database, in quanto permette di fornire o revocare agli utenti i permessi necessari per poter utilizzare i comandi DML e DDL, oltre che gli stessi comandi DCL.
Nel momento in cui un database viene creato, l'utente che esegue l'operazione ne diventa automaticamente il proprietario. Di default, gli altri utenti del sistema potrebbero avere il permesso di leggere le informazioni, ma non possiedono i diritti per modificare il database. La gestione degli utenti parte dalla loro creazione: per inserire un nuovo utente nel sistema si utilizza il comando CREATE USER 'Nome'@'%' IDENTIFIED BY 'password';, mentre per eliminarlo si ricorre al comando DROP USER 'Nome'.
Per gestire attivamente i diritti di accesso si utilizzano due comandi principali: GRANT e REVOKE. Il comando GRANT fornisce uno o più permessi a un determinato utente su uno specifico oggetto del database. Ad esempio, l'istruzione GRANT ALL PRIVILEGES ON Impiegati TO User1 [WITH GRANT OPTION] concede all'utente "User1" tutti i privilegi possibili sulla tabella "Impiegati". La clausola opzionale WITH GRANT OPTION è particolarmente potente, in quanto autorizza l'utente che riceve il privilegio a trasmetterlo a sua volta ad altri utenti.
Al contrario, il comando REVOKE serve a rimuovere uno o più permessi precedentemente concessi. La sintassi REVOKE ALL PRIVILEGES ON Impiegati FROM User1 elimina i diritti dell'utente sulla specifica tabella. È fondamentale ricordare una regola di sicurezza essenziale: un utente può revocare esclusivamente i privilegi che lui stesso ha concesso in precedenza.
Modifica dello Schema e Data Manipulation Language (DML)
A livello strutturale, durante il ciclo di vita di un database può emergere la necessità di modificare la struttura di una tabella. Nello specifico, per rimuovere un vincolo precedentemente definito si utilizza l'istruzione di alterazione della tabella specificando la caduta dell'indice, con la sintassi ALTER TABLE nome_tabella DROP INDEX nome_vincolo;. È ovvio che se un vincolo non è mai stato definito, il sistema restituirà un errore impedendone la rimozione.
Una volta definita la struttura, interviene il Data Manipulation Language (DML), che costituisce l'insieme di istruzioni utilizzate per modificare l'effettivo contenuto della base di dati. Fanno parte del DML quattro istruzioni cardine:
Domini e Tipi di Dato
Alla base del modello relazionale vi sono le tabelle composte da attributi, e ogni attributo deve appartenere a un dominio ben definito. SQL definisce vari tipi di dato elementari (classificabili in predefiniti o definiti dall'utente) che costituiscono l'insieme di valori ammessi e l'insieme delle operazioni applicabili.
Per quanto riguarda i valori numerici esatti, che rappresentano numeri interi o decimali con una parte decimale prefissata (ideali per i valori monetari), SQL offre: