SQL
Da Wikipedia, l'enciclopedia libera.
SQL (Structured Query Language) è un linguaggio creato per l'accesso a informazioni memorizzate nei database.
[modifica] Storia
Indice |
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], o 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 purtroppo 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.
[modifica] Il modello entità-associazioni
Il modello entità-relazioni (E/R) viene adoperato per analizzare le caratteristiche di una situazione indistintamente dagli eventi che andranno a verificarsi. Questo per costituire un modello concettuale di dati che venga visto in modo indipendente dalle applicazioni. Il modello entità associazione si distingue per la presenza di vari elementi che lo definiscono:
- Le entità che sono oggetti che avranno un particolare senso e vengono classificate secondo criteri particolari.
- Le associazioni , sono i legami che si andranno a formare tra due entità.
- Gli attributi , sono gli elementi che vanno a caratterizzare le entità.
[modifica] Esempio
FAMIGLIA <POSSIEDE> CASA
FAMIGLIA e CASA SONO LE ENTITA'
<POSSIEDE> è l'associazione che collega Famiglia a Casa
Gli Attributi possono essere
FAMIGLIA: (cogn_Famiglia (*) , Tipo_Famiglia , Numero_Famiglia, Città_Residenza, Telefono, Indirizzo)
CASA: (Cod_Casa(*) , Tipo_Casa, Numero_locali , Metri_quadri, Giardino, cogn_Famiglia(+))
con (*) si intende la chiave primaria mentre con (+) si intende la chiave esterna.
[modifica] 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 e leggere i dati
- Data Control Language (DCL) - permette di gestire gli utenti e i permessi
[modifica] Operatori
Gli operatori, messi a disposizione dal SQL standard si dividono in quattro categorie:
- Operatori di confronto
- Operatori aritmetici
- Operatori condizionali
- Operatori logici
[modifica] 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
- 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 un arbitraria lettera)
- < 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
- BETWEEN Recupera un valore compreso tra due valori
- IN Stabilisce se un valore è contenuto in una lista di valori possibili
- EXISTS Stabilisce se un determinato record esiste
[modifica] 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
[modifica] Operatori condizionali
L'unico operatore condizionale di SQL è WHERE (dove) e serve a definire criteri di ricerca mirati.
[modifica] 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.
[modifica] 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
[modifica] 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
[modifica] 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.
[modifica] Select
Col comando select abbiamo la possibilità di estrarre i dati, in modo mirato, dal database.
[modifica] 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_elementi_selezione è l'elenco dei campi da estrarre (separati tra loro con una virgola), lista_riferimenti_tabella è l'elenco delle tabella 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 viene sempre applicato al primo attributo inserito nella SELECT) 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.
[modifica] 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.
[modifica] Sintassi del comando insert
- Insert semplice:
INSERT INTO nome_tabella VALUES (elenco valori, tutti, rispettando l’ordine dei campi della tabella);
oppure
INSERT INTO nome_tabella (elenco dei campi interessati dall’inserimento) VALUES (elenco valori, tutti, rispettando l’ordine dei campi dichiarati sopra);
- Insert mediante select:
INSERT INTO nome_tabella (elenco dei campi interessati dall’inserimento) AS SELECT ...;
[modifica] Update
Il comando update ha la 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.
[modifica] Sintassi del comando update
- Update generico:
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';
[modifica] 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.
[modifica] Sintassi del comando delete
- Delete generico:
DELETE FROM nome_tabella;
- Delete con condizione:
DELETE FROM nome_tabella WHERE nome_campo = 'valore';
[modifica] 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.
[modifica] Sintassi del comando truncate table
TRUNCATE [TABLE] nome_tabella
[modifica] 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.
[modifica] 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.
[modifica] Sintassi del comando begin transaction
BEGIN TRAN[SACTION] [transaction_name];
[modifica] Commit
Per confermare la transazione si utilizza il comando COMMIT. Con esso tutte le modifiche effettuate sui dati in precedenza vengono memorizzate.
[modifica] Sintassi del comando commit
COMMIT [TRAN[SACTION] [transaction_name];
[modifica] 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.
[modifica] Sintassi del comando rollback
ROLLBACK [TRAN[SACTION] [transaction_name];
[modifica] 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).
[modifica] 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.
[modifica] Revoke
Il comando Revoke revoca uno o più permessi a un determinato utente (es: il permesso di cancellazione da una tabella).
[modifica] 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:
- il linguaggio è piuttosto complesso;
- 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)..
[modifica] Voci correlate
- Query language
- Data Definition Language
- Data Manipulation Language
- Data Control Language
- SQL injection
- SQLJ
[modifica] Collegamenti esterni
- (EN) [www.mysql.com http://www.wiscorp.com/SQLStandards.html http://www.wiscorp.com/SQLStandards.html]
Principali linguaggi di programmazione (tutti) |
Ada | ALGOL | APL | Awk | BASIC | C | C++ | C# | COBOL | Delphi | Eiffel | Fortran | Haskell | IDL | Java | JavaScript | J# | Lisp | LOGO | ML | Objective C | O'Caml | Pascal | Perl | PHP | PL/I | PLaSM | Prolog | Python | Ruby | SAS | Scheme | sh | Simula | Smalltalk | SQL | Transact-SQL | Visual Basic |
- Portale Informatica: accedi alle voci di Wikipedia che parlano di informatica