Structured Query Language: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Xqbot (discussione | contributi)
m Bot: sostituisce il tag <source> obsoleto e il parametro "enclose" [https://lists.wikimedia.org/pipermail/wikitech-ambassadors/2020-April/002284.html]; modifiche estetiche
Riga 35:
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 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.
 
== 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 ed amministrative sul sistema dei database. La maggior parte delle implementazioni dispongono di [[interfaccia (informatica)|interfaccia]] alla [[riga di comando]] per l'esecuzione diretta di comandi, in alternativa alla sola interfaccia grafica [[GUI]].
 
Riga 65:
 
* <code>=</code> Esprime un'assegnazione e non restituisce alcun valore.
* <code>:=</code> Esprime un'assegnazione di un valore ad una variabile non ancora istanziata e non restituisce alcun valore.
 
=== Operatori di confronto ===
Riga 175:
==== Sintassi del comando insert ====
* Insert semplice:
<sourcesyntaxhighlight lang="sql">
INSERT INTO nome_tabella
VALUES (elenco valori, tutti, rispettando l’ordine dei campi della tabella, ad es "donato");
</syntaxhighlight>
</source>
oppure
<sourcesyntaxhighlight lang="sql">
INSERT INTO nome_tabella (elenco dei campi interessati dall’inserimento)
VALUES (elenco valori, tutti, rispettando l’ordine dei campi dichiarati sopra, esempio "donato");
</syntaxhighlight>
</source>
* Insert mediante select:
<sourcesyntaxhighlight lang="sql">
INSERT INTO nome_tabella (elenco dei campi interessati dall’inserimento, ad es "donato") AS
SELECT ...;
</syntaxhighlight>
</source>
 
=== Update ===
Riga 201:
==== Sintassi del comando update ====
* Update generico:
<sourcesyntaxhighlight lang="sql">
UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
Riga 207:
...
;
</syntaxhighlight>
</source>
 
* Update con condizione:
<sourcesyntaxhighlight lang="sql">
UPDATE nome_tabella
SET nome_campo1 = 'valore1_nuovo',
nome_campo2 = 'valore2_nuovo'
WHERE nome_campo3 = 'valore';
</syntaxhighlight>
</source>
 
=== Delete ===
Riga 224:
==== Sintassi del comando delete ====
* Delete generico:
<sourcesyntaxhighlight lang="sql">DELETE FROM nome_tabella;</sourcesyntaxhighlight>
 
* Delete con condizione:
<sourcesyntaxhighlight lang="sql">
DELETE FROM nome_tabella
WHERE nome_campo = 'valore';
</syntaxhighlight>
</source>
 
=== Truncate Table ===
Riga 236:
 
==== Sintassi del comando truncate table ====
<sourcesyntaxhighlight lang="sql">
TRUNCATE [TABLE] nome_tabella
</syntaxhighlight>
</source>
 
=== La transazione ===
Riga 256:
 
===== Sintassi del comando begin transaction =====
<sourcesyntaxhighlight lang="sql">
BEGIN TRANSACTION [transaction_name];
</syntaxhighlight>
</source>
 
==== Commit ====
Riga 264:
 
===== Sintassi del comando commit =====
<sourcesyntaxhighlight lang="sql">
COMMIT [TRANSACTION] [transaction_name];
</syntaxhighlight>
</source>
 
==== Rollback ====
Riga 272:
 
===== Sintassi del comando rollback =====
<sourcesyntaxhighlight lang="sql">
ROLLBACK [TRANSACTION] [transaction_name];
</syntaxhighlight>
</source>
 
== DQL: Interrogazione dei dati ==
Riga 283:
 
==== Sintassi del comando select ====
<sourcesyntaxhighlight lang="sql">
SELECT [ ALL | DISTINCT | TOP ] lista_elementi_selezione
FROM lista_riferimenti_tabella
Riga 289:
[ GROUP BY lista_colonne [HAVING Condizione] ]
[ ORDER BY lista_colonne ];
</syntaxhighlight>
</source>
dove:
* ''lista_elementi_selezione'' è l'elenco dei campi da estrarre (separati tra loro con una virgola);
* ''lista_riferimenti_tabella'' è l'elenco delle tabelle 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.
 
Riga 300:
La clausola ''GROUP BY'' serve per raggruppare per [[tupla]] i risultati mentre la relativa condizione ''HAVING'' serve per filtrarne i risultati.
 
<sourcesyntaxhighlight lang="sql">
SELECT fornitore, sum(importo_fattura)
FROM fatture
GROUP BY fornitore
HAVING sum(importo_fattura)>10.000
</syntaxhighlight>
</source>
 
In questo caso vengono filtrati i fornitori che hanno un totale fatturato maggiore di 10.000.
Riga 315:
L'SQL standard non prevede alcun ordinamento se non si specifica la clausola ''ORDER BY'', pertanto senza di essa anche ''LIMIT'' ha un effetto imprevedibile.<br />
Un esempio è il seguente:
<sourcesyntaxhighlight lang="sql">
SELECT DISTINCT cognome, nome, citta_residenza
FROM utenti
WHERE anni > = 18
ORDER BY cognome
</syntaxhighlight>
</source>
 
Questa ''query'' estrae l'elenco di tutti gli utenti maggiorenni ordinando l'output in base al cognome.
Nelle clausole ''GROUP BY'' e ''ORDER BY'' i nomi dei campi si possono sostituire con il numero corrispondente all'ordine della funzione ''SELECT'': nell'ultimo caso ''ORDER BY cognome'' si può scrivere ''ORDER BY 1''.
 
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.
 
<sourcesyntaxhighlight lang="sql">
SELECT DISTINCT *
FROM utenti
</syntaxhighlight>
</source>
 
l'asterisco permette di includere nella selezione tutte le colonne della tabella ''utenti''
 
Con le select è possibile anche eseguire dei calcoli:
<sourcesyntaxhighlight lang="sql">
Select DISTINCT cod_art, prezzo_unit*giacenza AS Totale, giacenza*ingombro AS TotIngombro;
FROM articoli
</syntaxhighlight>
</source>
questo produce dati estratti ma anche dati calcolati.
La clausola AS serve per dare un nome alla nuova colonna che verrà mostrata nel risultato della select eseguita.
Riga 344:
Molti DBMS supportano la clausola non standard LIMIT, che deve essere posta per ultima e può avere tre forme:
 
<sourcesyntaxhighlight lang="sql">
LIMIT <numero_risultati>
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="sql">
LIMIT <pos_primo_risultato>, <numero_risultati>
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="sql">
LIMIT <numero_risultati> [OFFSET <pos_primo_risultato>]
</syntaxhighlight>
</source>
 
''numero_risultati'' è il numero delle righe da estrarre. ''pos_primo_risultato'' è l'indice della prima riga da estrarre. Insieme, possono essere utilizzati per suddividere i risultati in blocchi e leggerli un po' alla volta (per esempio per comodità del DBA, o per la paginazione dei risultati mostrati da una applicazione web).
 
=== Join ===
{{vedi anche|Join (SQL)}}
Una forma di select composto tra più tabelle con uno o più campi comuni si ottiene attraverso la clausola [[Join (SQL)|Join]].
Riga 366:
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:
 
<sourcesyntaxhighlight lang="sql">
SELECT AVG(campo1) FROM mia_tabella;
</syntaxhighlight>
</source>
 
Questa query verrà inserita nella clausola WHERE della query più esterna; la subquery viene eseguita per prima:
 
<sourcesyntaxhighlight lang="sql">
SELECT * FROM mia_tabella WHERE campo1 > (SELECT AVG(campo1) FROM mia_tabella);
</syntaxhighlight>
</source>
 
Come si vede, da un punto di vista sintattico è necessario porre le subquery tra parentesi.
Riga 384:
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:
 
<sourcesyntaxhighlight lang="sql">
SELECT email FROM (SELECT email FROM utenti WHERE conferma = TRUE);
</syntaxhighlight>
</source>
 
In realtà le tabelle derivate sono utili laddove non vi sono altri approcci possibili, il che accade quando la query esterna contiene una JOIN.
Riga 416:
 
== Bibliografia ==
* {{en}} "SQL-99 Complete, Really", Peter Gulutzan e Trudy Pelzer, R&D Books, 1999, ISBN 9780879305680978-0-87930-568-0
 
== Voci correlate ==