Structured Query Language: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
mNessun oggetto della modifica |
Funzionalità collegamenti suggeriti: 3 collegamenti inseriti. |
||
(61 versioni intermedie di 27 utenti non mostrate) | |||
Riga 3:
|nome = SQL
|immagine = SQL ANATOMY wiki.svg
|didascalia = Le parti di un'istruzione.
|autore = [[Donald Chamberlin]]
|data =
|utilizzo = creazione, interrogazione, gestione database
|paradigmi =
|tipizzazione = statica, forte
|estensione = .sql
}}
* creare e modificare [[Schema di database|schemi di database]] (DDL = ''[[Data Definition Language]]'');
Line 28 ⟶ 18:
* 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 [[
== Storia ==
L'[[ANSI]] lo adottò come standard fin dal
== 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
Originariamente progettato come linguaggio di tipo [[Programmazione dichiarativa|dichiarativo]], si è successivamente evoluto con l'introduzione di costrutti [[programmazione procedurale|procedurali]], istruzioni per il [[controllo di flusso]], [[tipo di dato|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 (
=== Struttura ===
Essendo un [[programmazione dichiarativa|linguaggio dichiarativo]], SQL non richiede la stesura di sequenze di operazioni (come ad
* [[Data Definition Language]] (DDL) - permette di creare e cancellare database o di modificarne la struttura
Line 53 ⟶ 43:
== Operatori ==
Gli operatori, messi a disposizione dal SQL standard si dividono in sette categorie:
* [[Operatore di assegnazione|Operatori di assegnazione]]
* Operatori di confronto
* Operatori stringa
* Operatori aritmetici
* Operatori condizionali
* [[Operatori logici]]
* Operatori tra bit
Line 64 ⟶ 54:
Gli operatori di assegnazione assegnano un valore a una variabile o a un campo.
*
*
=== Operatori di confronto ===
Gli operatori di confronto servono a determinare uguaglianze e disuguaglianze tra valori e
*
*
*
* <code>{{Codice|codice=<|linguaggio=SQL}}</code> Stabilisce se un valore è minore di un altro
* <code>{{Codice|codice=>|linguaggio=SQL}}</code> Stabilisce se un valore è maggiore di un altro
* <code>{{Codice|codice=<=|linguaggio=SQL}}</code> Stabilisce se un valore è minore o uguale di un altro
* <code>{{Codice|codice=>=|linguaggio=SQL}}</code> Stabilisce se un valore è maggiore o uguale di un altro
* <code>{{Codice|codice=<>|linguaggio=SQL}}</code> Stabilisce se due valori sono diversi tra loro
* <code>{{Codice|codice=!=|linguaggio=SQL}}</code> equivale a <code>{{Codice|codice=<>|linguaggio=SQL}}</code>
* <code>{{Codice|codice=BETWEEN ... AND ...|linguaggio=SQL}}</code> Recupera un valore compreso tra due valori
* <code>{{Codice|codice=IN|linguaggio=SQL}}</code> Stabilisce se un valore è contenuto in una lista di valori possibili
* <code>{{Codice|codice=EXISTS|linguaggio=SQL}}</code> Stabilisce se una determinata ''subquery'' restituisce un valore
* <code>{{Codice|codice=ANY|linguaggio=SQL}}</code> o <code>{{Codice|codice=SOME|linguaggio=SQL}}</code> Stabilisce se una determinata ''subquery'' restituisce almeno uno dei valori specificati
* <code>{{Codice|codice=ALL|linguaggio=SQL}}</code> Stabilisce se una determinata ''subquery'' restituisce tutti i valori desiderati
Ad alcuni di questi operatori corrisponde un operatore contrario che fa uso del termine <code>{{Codice|codice=NOT|linguaggio=SQL}}</code>:
* <code>{{Codice|codice=IS NOT|linguaggio=SQL}}</code>
* <code>{{Codice|codice=NOT LIKE|linguaggio=SQL}}</code>
* <code>{{Codice|codice=NOT BETWEEN|linguaggio=SQL}}</code>
* <code>{{Codice|codice=NOT IN|linguaggio=SQL}}</code>
* <code>{{Codice|codice=NOT EXISTS|linguaggio=SQL}}</code>
==== Operatori stringa ====
Gli operatori stringa accettano come operandi due stringhe e restituiscono un [[Booleano (informatica)|valore booleano]] o [[Stringa (informatica)|stringa]].
===== Operatore LIKE =====
L'operatore <code>{{Codice|codice=LIKE|linguaggio=SQL}}</code> (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'' ({{Codice|codice=_|linguaggio=SQL}}), detto ''wildchar'', esegue la ricerca su un singolo carattere arbitrario; il simbolo {{Codice|codice=%|linguaggio=SQL}} è 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 {{Codice|codice=[_]|linguaggio=SQL}} (leggi anche più avanti).
La [[sintassi]] di [[Microsoft Access]] è leggermente diversa da questo standard internazionale, e più completa. Invece del simbolo ''underscore'', si utilizza {{code|?}} per ricercare un singolo carattere (sia numero che lettera); invece del simbolo {{code|%}}, l'operatore jolly è dato da {{code|*}}. Access permette di ricercare un singolo valore numerico tramite il tasto ''hash'' (o ''[[cancelletto]]'') ({{code|#}}), e di ricercare un carattere (lettera e numero) all'interno o all'esterno di un insieme di valori, con la sintassi {{code|[]}} e {{code|[!]}}. 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 {{code|*|linguaggio=SQL}} è utilizzabile solo all'interno dell'applicazione, mentre via OLE DB/[[ODBC]] deve essere utilizzato il classico simbolo {{code|%}}.
===== 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|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
===== 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.
Line 138 ⟶ 123:
=== Operatori logici ===
Gli operatori logici di SQL appartengono agli operatori logici [[logica booleana|booleani]] e sono [[Congiunzione logica|AND]] (e), [[Disgiunzione logica|OR]] (o, oppure), [[Contraddizione|NOT]] (non), [[Disgiunzione esclusiva|XOR]] (detto anche "OR esclusivo").
* L'operatore logico
* L'operatore logico
* L'operatore
* L'operatore
=== 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
== 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 ==
{{Vedi anche|Linguaggio di manipolazione dei dati}}
DML ([[Data Manipulation Language]] – linguaggio di manipolazione dei dati) fornisce i comandi per inserire, modificare ed eliminare 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 precedentemente assegnato all'utente tramite il DCL.
Line 169 ⟶ 152:
Il comando ha la funzione di inserire i dati nelle [[tabella (basi di dati)|tabelle]].
Le [[colonna (basi di dati)|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
Di per sé il comando
==== Sintassi del comando insert ====
*
<
INSERT INTO nome_tabella
VALUES (elenco valori, tutti, rispettando
</syntaxhighlight>
oppure
<
INSERT INTO nome_tabella (elenco dei campi interessati
VALUES (elenco valori, tutti, rispettando
</syntaxhighlight>
* {{Codice|codice=INSERT|linguaggio=SQL}} mediante {{Codice|codice=SELECT|linguaggio=SQL}}:
<
INSERT INTO nome_tabella (elenco dei campi interessati
SELECT ...;
</syntaxhighlight>
=== Update ===
Il comando
Il nome di ogni campo che deve essere modificato va dichiarato dopo la parola chiave
È possibile modificare più campi della stessa riga in un unico comando update, separandoli l'uno dall'altro con il simbolo
Il comando generico aggiorna tutte le righe della tabella. È possibile restringerne il numero applicando la parola chiave aggiuntiva
==== Sintassi del comando update ====
*
<
SET nome_campo1 = 'valore1_nuovo',
nome_campo2 = 'valore2_nuovo',
...
;</syntaxhighlight>
*
<
UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
nome_campo2 = 'valore2_nuovo'
WHERE nome_campo3 = 'valore';
</syntaxhighlight>
=== Delete ===
Il comando
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
==== Sintassi del comando delete ====
*
<
*
<
DELETE FROM nome_tabella
WHERE nome_campo = 'valore';
</syntaxhighlight>
=== Truncate Table ===
Come già detto, una
==== Sintassi del comando
<
TRUNCATE [TABLE] nome_tabella
</syntaxhighlight>
=== La transazione ===
Una transazione è un blocco di istruzioni che sono strettamente correlate tra loro. Nel caso in cui per qualsiasi motivo (un errore interno al DBMS, un errore nelle istruzioni SQL, un errore di sistema) una delle istruzioni non arrivi a compimento, l'intera transazione verrà annullata. Si dice quindi che una transazione è un'operazione ''atomica'', ossia non è divisibile: se non viene eseguita interamente, non verrà eseguita affatto. Questo è uno degli strumenti più utilizzati per garantire l'integrità dei dati.
Line 250 ⟶ 230:
Alcuni DBMS inoltre consentono le transazioni annidate. Le modifiche effettuate da una transazione contenuta in un'altra non sono effettive finché la transazione più esterna non termina con successo.
Un'alternativa semanticamente molto simile è costituita dai ''savepoint''. Essi consentono di salvare una versione dei dati nel mezzo di una transazione. Sarà poi possibile annullare l'intera transazione oppure ripristinare uno dei savepoint precedentemente impostati. Questo salvataggio può essere effettuato in un blocco di codice condizionale, il che rende questa funzionalità molto più dinamica rispetto alle transazioni annidate.
==== Begin Transaction ====
Per iniziare esplicitamente una transazione si utilizza il comando
==== Commit ====
Per confermare la transazione si utilizza il comando
COMMIT [TRANSACTION] [transaction_name];
</syntaxhighlight>
==== Rollback ====
Per annullare la transazione si utilizza il comando
ROLLBACK [TRANSACTION] [transaction_name];
</syntaxhighlight>
== DQL: Interrogazione dei dati ==
{{Vedi anche|Linguaggio di interrogazione}}
{{U|verso=da|GROUP BY (SQL)|informatica|maggio 2024}}
DQL (data query language – linguaggio di interrogazione dei dati) comprende i comandi per leggere ed elaborare i dati presenti in un database. Questi dati devono essere stati inseriti attraverso il DML in strutture create con il DDL, mentre il DCL stabilisce se l'utente può accedervi.
=== Select ===
Col comando
==== Sintassi del comando select ====
<
SELECT [ ALL | DISTINCT | TOP ] lista_elementi_selezione
FROM lista_riferimenti_tabella
Line 289 ⟶ 261:
[ GROUP BY lista_colonne [HAVING Condizione] ]
[ ORDER BY lista_colonne ];
</syntaxhighlight>
dove:
*
*
*
*
Di default il comando
La clausola
<syntaxhighlight lang="sql" line="1">SELECT fornitore, sum(importo_fattura)
FROM fatture
GROUP BY fornitore
HAVING sum(importo_fattura)>10000</syntaxhighlight>
In questo caso vengono filtrati i fornitori che hanno un totale fatturato maggiore di
La clausola
L'SQL standard non prevede alcun ordinamento se non si specifica la clausola {{Codice|codice=ORDER BY|linguaggio=SQL}}, pertanto senza di essa anche {{Codice|codice=LIMIT|linguaggio=SQL}} ha un effetto imprevedibile.
Un esempio è il seguente:
<
</syntaxhighlight>
Questa ''query'' estrae l'elenco di tutti gli utenti maggiorenni ordinando l'output in base al cognome.
Nelle clausole
La definizione di
<
SELECT DISTINCT *
FROM utenti
</syntaxhighlight>
l'asterisco permette di includere nella selezione tutte le colonne della tabella ''utenti''
Con le ''select'' è possibile anche eseguire dei calcoli:
<
</syntaxhighlight>
questo produce dati estratti ma anche dati calcolati.
La clausola {{Codice|codice=AS|linguaggio=SQL}} serve per dare un nome alla nuova colonna che verrà mostrata nel risultato della
Molti DBMS supportano la clausola non standard {{Codice|codice=LIMIT|linguaggio=SQL}}, che deve essere posta per ultima e può avere tre forme:
<
LIMIT <numero_risultati>
</syntaxhighlight>
<
LIMIT <pos_primo_risultato>, <numero_risultati>
</syntaxhighlight>
<
LIMIT <numero_risultati> [OFFSET <pos_primo_risultato>]
</syntaxhighlight>
=== Join ===
{{
Una forma di select composto tra più tabelle con uno o più campi comuni si ottiene attraverso la clausola [[Join (SQL)|Join]].
=== Subquery ===
{{
Le ''subquery'' possono essere inserite ovunque il linguaggio SQL ammetta un'espressione che restituisce un singolo valore e nella clausola FROM. In questo secondo caso, le subquery sono chiamate anche ''tabelle derivate'' (derived table).
Le ''subquery'' propriamente dette possono restituire un singolo valore, oppure un insieme di risultati, a seconda dei casi. Un esempio piuttosto semplice è quello in cui si vogliono estrarre da una tabella i valori numerici superiori alla media. Una sola Select non può leggere la media e al contempo i valori che la superano. A questo scopo si avrà una select che legge la media:
<
SELECT AVG(campo1) FROM mia_tabella;
</syntaxhighlight>
Questa query verrà inserita nella clausola {{Codice|codice=WHERE|linguaggio=SQL}} della query più esterna; la ''subquery'' viene eseguita per prima:
<
SELECT * FROM mia_tabella WHERE campo1 > (SELECT AVG(campo1) FROM mia_tabella);
</syntaxhighlight>
Come si vede, da un punto di vista sintattico è necessario porre le ''subquery'' tra parentesi.
==== Tabelle derivate ====
Le tabelle derivate sono un caso particolare di ''subquery'': una Select interna estrae i dati che verranno poi interrogati dalla {{Codice|codice=SELECT|linguaggio=SQL}} esterna.
L'esempio seguente viene utilizzato a scopo didattico, ma non rappresenta un approccio ottimale. Si supponga comunque di voler estrarre i record per i quali il campo mail non è vuoto, scegliendoli tra gli utenti la cui registrazione è stata confermata. Ecco come ottenere questo risultato con una tabella derivata:
<
SELECT email FROM (SELECT email
FROM utenti WHERE conferma = TRUE); </syntaxhighlight>
In realtà le tabelle derivate sono utili laddove non vi sono altri approcci possibili, il che accade quando la query esterna contiene una {{Codice|codice=JOIN|linguaggio=SQL}}.
== DCL: Controllo sui dati ==
{{Vedi anche|Data Control Language}}
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).
=== Grant ===
Il comando
=== Revoke ===
Il comando
== Stored Programs ==
Con il termine ''Stored Programs'', o ''Business Logic'', si intendono quelle routine programmate in SQL, con le estensioni procedurali che permettono il controllo del flusso, i [[Loop (informatica)|cicli]], i [[Cursore (basi di dati)|cursori]] e la gestione degli errori. Nelle implementazioni più complete di SQL, gli Stored Program possono essere di diversi tipi:
* [[Stored procedure]]
* [[Stored
* [[Trigger (basi di dati)|Trigger]]
Inoltre alcuni DBMS, come [[MySQL]], permettono di creare procedure SQL che vengono eseguite a una data ora una sola volta, oppure ripetutamente a un certo intervallo temporale, come i ''Cron Job'' dei sistemi Unix.
== Critiche a SQL ==
Line 414 ⟶ 387:
* le diverse implementazioni sono generalmente incompatibili tra loro;
* {{citazione necessaria|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}}.
==Note==
<references/>
== Bibliografia ==
* {{en}} "SQL-99 Complete, Really", Peter Gulutzan e Trudy Pelzer, R&D Books, 1999, ISBN
* {{cita libro
|autore = Paolo Atzeni
|autore2 = Stefano Ceri
|autore3 = Piero Fraternali
|autore4 = Stefano Paraboschi
|autore5 = Riccardo Torlone
|titolo = Basi di dati
|editore = McGraw-Hill
|anno = 2018
|edizione = 5
|città = Milano
|ISBN = 978-88-386-9445-5
}}
== Voci correlate ==
{{Div col}}
* [[Algebra relazionale]]
* [[Calcolo relazionale]]
* [[Data Definition Language]]
* [[Data Manipulation Language]]
Line 429 ⟶ 421:
* [[Transact-SQL]]
* [[NoSQL]]
{{Div col end}}
== Altri progetti ==
{{interprogetto|wikt|preposizione=sull'}}
== Collegamenti esterni ==
* {{Collegamenti esterni}}
* {{FOLDOC|SQL|SQL}}
* [http://www.uniss.it/documenti/formazione/Guida_DataBase_SQL.pdf SQL] {{Webarchive|url=https://web.archive.org/web/20110124161826/http://www.uniss.it/documenti/formazione/Guida_DataBase_SQL.pdf |date=24 gennaio 2011 }}. Guida gratuita in italiano realizzata dal [[Dipartimento del Tesoro]] (in pdf).
* {{cita web|http://www.1keydata.com/it/sql/|Tutorial de SQL}}
* {{cita web | 1 = https://kb.askmonty.org/it/istruzioni-sql-di-base/ | 2 = Istruzioni SQL di base | urlmorto = sì }}
* {{cita web|1=http://savage.net.au/SQL/sql-2003-2.bnf.html|2=SQL::2003 BNF|lingua=en|accesso=7 novembre 2012|dataarchivio=6 giugno 2012|urlarchivio=https://web.archive.org/web/20120606193257/http://savage.net.au/SQL/sql-2003-2.bnf.html|urlmorto=sì}}
* {{cita web|1=http://savage.net.au/SQL/sql-99.bnf.html|2=SQL99 BNF|lingua=en|accesso=7 novembre 2012|dataarchivio=10 febbraio 2013|urlarchivio=https://web.archive.org/web/20130210145539/http://savage.net.au/SQL/sql-99.bnf.html|urlmorto=sì}}
* {{cita web|1=http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt|2=SQL93 Specification|lingua=en|accesso=7 novembre 2012|dataarchivio=6 aprile 2013|urlarchivio=https://web.archive.org/web/20130406062531/http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt|urlmorto=sì}}
* {{cita web|1=http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt|2=SQL93 BNF|lingua=en|accesso=7 novembre 2012|dataarchivio=6 aprile 2013|urlarchivio=https://web.archive.org/web/20130406062531/http://www.contrib.andrew.cmu.edu/~shadow/sql/sql3bnf.sep93.txt|urlmorto=sì}}
* {{cita web|1=http://savage.net.au/SQL/sql-92.bnf.html|2=SQL92 Specification|lingua=en|accesso=7 novembre 2012|dataarchivio=12 ottobre 2008|urlarchivio=https://web.archive.org/web/20081012131931/http://savage.net.au/SQL/sql-92.bnf.html|urlmorto=sì}}
* {{cita web|1=http://savage.net.au/SQL/sql-92.bnf.html|2=SQL92 BNF|lingua=en|accesso=7 novembre 2012|dataarchivio=12 ottobre 2008|urlarchivio=https://web.archive.org/web/20081012131931/http://savage.net.au/SQL/sql-92.bnf.html|urlmorto=sì}}
* {{cita web|https://www.postgresql.org/|PostgreSQL|lingua=en}}
* {{cita web|url=http://freeitsolutions.com/oracle-tutorials/?search=sql|titolo=Oracle SQL tutorials|lingua=en|accesso=23 settembre 2008|dataarchivio=6 dicembre 2008|urlarchivio=https://web.archive.org/web/20081206045041/http://freeitsolutions.com/oracle-tutorials/?search=sql|urlmorto=sì}}
* {{cita web|http://www.wiscorp.com/SQLStandards.html|wiscorp.com|lingua=en}}
* {{cita web|http://www.webmasterpoint.org/asp/sql/home.asp|Manuale e tutorial SQL da Webmasterpoint.org}}
{{Principali linguaggi di programmazione}}
{{Linguaggi di interrogazione}}
{{Controllo di autorità}}
{{portale|informatica}}
[[Categoria:
|