Istituto Tecnico Industriale Statale
“Conte Michele Maria Milano” Polistena
SQL
Structured Query Language
Prof. Rocco Ciurleo
Introduzione
La storia dei DBMS (Data Base Management Systems =
Sistemi di Gestione delle Basi di Dati) si sviluppa negli anni '60 e
'70, in seguito al crescente fabbisogno di gestire e manipolare
grandi quantità di dati.
Subito, in seguito all'affermarsi di una teoria con basi formali
(algebra relazionale) nascono i database relazionali chiamati
RDBMS (Relational Data Base Management Systems = Sistemi
di Gestione delle Basi di Dati Relazionali) e di conseguenza il
linguaggio SQL (Structured Query Language = Linguaggio di
Interrogazione Strutturato - alcuni traducono "linguaggio per
interrogazioni strutturate", ma la versione più corretta sembra
essere la prima) nasce e si sviluppa con loro.
Ormai il linguaggio SQL è definito da norme ANSI
(American Standard Code for Information Interchange -ovvero Codice
Standard Americano per lo Scambio di Informazioni) che lo rendono
uno standard internazionale, anche se le varie implementazioni
differiscono leggermente fra loro.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
2
Breve storia di SQL 1/3
La storia di SQL inizia nel 1974 con la definizione da parte di Donald
Chamberlin e di altre persone che lavoravano presso i laboratori di
ricerca dell'IBM di un linguaggio per la specificazione delle
caratteristiche dei database che adottavano il modello relazionale.
Questo linguaggio si chiamava SEQUEL (Structured English Query
Language). Le sperimentazioni con tale prototipo portarono fra il
1976 ed il 1977 ad una revisione del linguaggio (SEQUEL/2), che in
seguito cambiò nome per motivi legali, diventando SQL. Il prototipo
(System R) basato su questo linguaggio venne adottato ed utilizzato
internamente da IBM e da alcuni sui clienti scelti. Grazie al successo
di questo sistema, che non era ancora commercializzato, anche altre
compagnie iniziarono a sviluppare i loro prodotti relazionali basati su
SQL. Nel corso degli anni ottanta numerose compagnie (ad esempio
Oracle e Sybase, solo per citarne alcune) commercializzarono
prodotti basati su SQL, che divenne lo standard industriale di fatto
per quanto riguarda i database relazionali.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
3
Breve storia di SQL 2/3
Nel 1986 l'ANSI adottò SQL (sostanzialmente adottò il dialetto SQL di
IBM) come standard per i linguaggi relazionali e nel 1987 esso
diventò anche standard ISO. Questa versione dello standard va sotto
il nome di SQL/86. Negli anni successivi esso ha subito varie
revisioni: SQL/89, SQL/92 SQL/99 e SQL/2003 . La versione SQL/92
diventò uno standard fatto proprio anche dall’International Standard
Organization (ISO).
Il fatto di avere uno standard definito per un linguaggio per database
relazionali, apre potenzialmente la strada alla intercomunicabilità fra
tutti i prodotti che si basano su di esso, ma in generale ogni
produttore adotta ed implementa nel proprio database solo il cuore
del linguaggio SQL (il cosiddetto Entry level), mettendo sul mercato
versioni personalizzate, chiamate convenzionalmente dialetti, nelle
quali ai comandi essenziali di SQL se ne aggiungono altri, che in
alcuni casi svolgono funzioni sostanzialmente estranee alla natura
propria di SQL.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
4
Breve storia di SQL 3/3
Attualmente e’ in corso un processo di revisione
del linguaggio da parte dei comitati ANSI e ISO,
che dovrebbe portare alla definizione di cio’ che
al momento e’ noto come SQL3.
Le caratteristiche principali di questa nuova
incarnazione di SQL dovrebbero essere la sua
trasformazione in un linguaggio stand-alone
(mentre ora viene usato come linguaggio ospitato
in altri linguaggi) e l’introduzione di nuovi tipi di
dato piu’ complessi per permettere, ad esempio,
il trattamento di dati multimediali.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
5
I linguaggi “dentro” SQL
DDL
(Data Definition Language, linguaggio di definizione dei dati).
Consente di descrivere la struttura delle tabelle e di tutti gli
elementi di supporto (come indici, vincoli, trigger, viste ecc.).
Viene utilizzato per realizzare lo schema logico e lo schema
fisico del database.
DML
(Data Manipulation Language, linguaggio per la manipolazione
dei dati).
Operazioni di inserimento, modifica e cancellazione dei dati.
DCL
(Data Control Language, linguaggio di controllo dei dati).
Limiti sui dati (permessi di accesso, vincoli di integrità).
QL
(Query Language, linguaggio di interrogazione)
Interrogare il database al fine di individuare i dati che
corrispondono ai parametri di ricerca dell’utente.
SQL: Linguaggio dichiarativo
Forse il problema più grosso che un esperto programmatore
incontra nell’imparare a programmare in SQL è che deve
dimenticare gli altri linguaggi di programmazione, SQL infatti
chiede a chi lo studia di cambiare il modo di pensare circa la
programmazione.
Molti programmatori usano linguaggi procedurali come C++,
FORTRAN, PASCAL, COBOL e altri, detti linguaggi di terza
generazione; si tratta di linguaggi che fanno da ponte tra
l’assembler e la lingua naturale, con i quali si scrivono
programmi i cui statement descrivono passo passo, in modo
preciso e rigoroso, che cosa il computer deve fare.
SQL invece è un linguaggio dichiarativo, che cioè dichiara,
o descrive, ciò che si vuole ottenere, e lascia al computer di
decidere come ottenerlo.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
7
Linguaggio dichiarativo: esempio
Per fare un’analogia, si immagini di andare in un supermercato
con la lista della spesa e con una dettagliata descrizione degli
spostamenti da fare per raggiungere i corridoi e gli scaffali che
contengono le varie merci. Si esegue la procedura – seguendo
le indicazioni – e si fanno gli acquisti: questo è un approccio
procedurale. In termini di programma, i file di dati sono gli
scaffali, i dati sono le merci e il programma è costituito dalle
indicazioni degli spostamenti.
Ora si immagini di andare in un negozio e consegnare al
commesso che si trova al banco la lista della spesa, in modo
che egli procuri il materiale mentre si aspetta. La lista della
spesa è dichiarativa – “questo è quello che voglio!” – e il
commesso è il traduttore del linguaggio, che decide come
procurare la merce in base alle conoscenze che ha sul negozio,
come la pianta degli scaffali, la quantità disponibili dei vari
articoli e tutto quello che gli serve per soddisfare il cliente.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
8
Identificatori
Il linguaggio SQL utilizza i caratteri alfabetici, le cifre decimali,
gli operatori aritmetici e di confronto (+ - / * = < >) più altri
caratteri che assumono particolari significati nella sintassi delle
istruzioni e che verranno descritti in seguito.
Gli identificatori (nomi di tabelle e di attributi) sono costituiti da
sequenze di caratteri con lunghezza massima di 18 caratteri:
devono iniziare con una lettera e possono anche contenere il
carattere _ .
Quando è necessario identificare il nome di un attributo della
tabella si deve usare la notazione
NomeTabella.NomeAttributo
(separati dal punto).
(dipende dal compilatore che si usa, basta anche solo il nome
del campo)
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
9
Tipi di Dati
Nella dichiarazione della struttura di una tabella occorre specificare il tipo dei dati scelto per gli attributi.
I tipi standard del linguaggio SQL sono:
CHARACTER(n) o CHAR(n)
Stinga di lunghezza n
N da 1 a 15000
DATE
Data nella forma GG/MM/AA
TIME
Ora nella forma HH:MM
INTEGER(p) o INT(p)
Numero intero con precisione p
P da 1 a 45
SMALLINT
Numero intero con precisione 5
Da –32768 a 32767
INTEGER
Numero intero con precisione 10
Da –2.147.483.648 a 2.147.483.647
DECIMAL(p,s) o DEC(p,s)
Numero decimale con presicione p e s cifre
decimali
P da 1 a 45 ed s da 0 a p
REAL
Numero reale con mantissa di precisione 7
Valore 0 oppure valore assoluto da 1E-38
a 1E+38
FLOAT (o DOUBLE PRECISIN)
Numero reale con mantissa di precisione 15
Valore 0 oppure valore assoluto da 1E-38
a 1E+38
FLOAT(p)
Numero reale con mantissa di precisione p
P da 1 a 45
Per i dati numerici la precisione p indica il numero massimo di cifre che il numero può contenere, esclusi il
segno e il punto decimale.
Per i numeri reali il valore s indica il numero di cifre che seguono il punto decimale.
I dati numerici floating point (numeri approssimati) sono memorizzati in forma esponenziale; la precisione
riguarda solo le cifre della mantissa.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
10
Come creare una tabella
Il database relazionale è composto da un insieme di "relazioni" dette anche tabelle, ad esempio:
NOME
CITTA’
ANNO NASCITA
Rocco
Tritanti
1960
M
Paola
Vicenza
1961
F
Michele
Milano
1957
M
SESSO
Per ogni tabella è attribuito un nome che la identifica, poniamo di chiamare la precedente tabella "anagrafica" e
scopriamo come costruirla in SQL.
La sintassi per creare la tabella "anagrafica" è la seguente:
CREATE TABLE anagrafica
(nome CHAR(25),
città CHAR(20),
anno_di_nascita INTEGER NOT NULL,
sesso CHAR(1));
Come si può capire il comando CREATE TABLE crea la tabella "anagrafica" e definisce le 4 colonne nel nome
e negli attributi (numerica, alfanumerica ecc.).
Accanto alla definizione dell’attributo può essere specificata la clausola NOT NULL, per indicare che in tutte le
righe della tabella quella colonna deve essere inserito un valore pertinente il tipo specificato, nelle operazioni di
inserimento e aggiornamento.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
11
Come modificare una tabella
La struttura della tabella può essere successivamente modificata con il
comando ALTER
Aggiunta di una nuova colonna nella tabella
ALTER TABLE nome_tabella ADD definizione_colonna
nome_tabella è il nome della tabella che si vuole modificare. Nel definire la
colonna dovranno quindi essere specificati il nome della colonna, il suo tipo ed
eventualmente il suo valore di default e i vincoli imposti sulla colonna.
Eliminazione di una colonna dalla tabella
ALTER TABLE nome_tabella DROP nome_colonna
nome_tabella è il nome della tabella che si vuole modificare, nome_colonna la
colonna che si vuole eliminare.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
12
Inserimento dei dati
L’istruzione SQL che effettua l'inserimento di una nuova tupla in una tabella è
INSERT. La sintassi con cui essa viene più usata è:
INSERT INTO nome_tabella [ ( elenco_campi ) ]
VALUES ( elenco_valori )
dove nome_tabella è il nome della tabella in cui deve essere inserita la nuova
tupla, elenco_campi è l'elenco dei nomi dei campi a cui deve essere assegnato
un valore, separati fra loro da una virgola. I campi non compresi nell'elenco
assumeranno il loro valore di default o nessun valore (NULL).
Nel caso in cui l'elenco non venga specificato, dovranno essere specificati i
valori di tutti i campi della tabella; elenco_valori è l'elenco dei valori che verranno
assegnati ai campi della tabella nell'ordine e numero specificati
dall'elenco_campi o in quello della definizione della tabella (se elenco_campi non
viene specificato).
L’esempio mostra come inserire la prima tupla nella tabella anagrafica.
INSERT INTO anagrafica (nome, città, anno_di_nascita, sesso)
VALUES (‘Rocco', ‘Tritanti', '1960', 'M')
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
13
Eliminazione di tuple
SQL consente di eliminare o modificare tuple di una tabella, ma non si deve
dimenticare che queste operazioni possono avere effetti a cascata su altre
tabelle grazie ai vincoli di integrità referenziale.
Per eliminare uno o più record da una tabella si può utilizzare il comando
DELETE, la cui struttura sintattica è:
DELETE FROM nome_tabella
[WHERE condizione]
Se non si utilizza la clausola WHERE, che è facoltativa, il comando cancella il
contenuto di tutti i record, senza possibilità di recupero, lasciando soltanto la
struttura della tabella.
Esempio1:
DELETE From anagrafica
Where nome=“Rocco”
Esempio2:
DELETE From anagrafica
Where nome=“Rocco” AND città=“Tritanti”
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
14
Modificare dati
Le informazioni presenti in un database non sono statiche, ma evolvono nel tempo. C‘è quindi la necessità
non solo di aggiungere nuovi dati, ma di modificare quelli che sono già inseriti nelle tabelle del database.
L’istruzioni SQL utilizzata a questo scopo è UPDATE. La quale permette di modificare i valori presenti in
una o più colonne di una o più righe di una tabella.
La sintassi di UPDATE è la seguente:
UPDATE nome_tabella
SET elenco_assegnamenti
[ WHERE espressione_condizionale ];
Gli assegnamenti vengono specificati nella forma:
nome_colonna = espressione_scalare
L'istruzione UPDATE aggiorna le colonne della tabella che sono state specificate nella clausola SET,
utilizzando i valori che vengono calcolati dalle corrispondenti espressioni scalari. Se viene espressa anche
la clausola WHERE, vengono aggiornale solo le righe che soddisfano l'espressione condizionale.
Vediamo un esempio:
UPDATE anagrafica
SET nome = ‘Giorgio‘
WHERE città = ‘Milano‘ ;
L’ istruzione cambia il valore della colonna nome della tabella anagrafica nelle righe in cui l’attributo città
ha valore ‘Milano'.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
15
SELECT
Interrogazione del database
L’aspetto più importante del linguaggio SQL è
costituito dalla possibilità di porre interrogazioni
(query) in modo molto semplice alla base di dati per
ritrovare le informazioni che interessano.
Queste prestazioni sono fornite dal comando
SELECT, che è nello stesso tempo molto potente e
molto semplice da usare. Il comando SELECT è
quello che viene più utilizzato nella programmazione
SQL, si può considerare che l’80% o il 90% di SQL
sia tutto in questo comando.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
16
SELECT
Nella forma più semplice il comando SELECT restituisce
semplicemente un’intera tabella, oppure colonne, oppure alcune
righe, e la sua forma di base è:
SELECT lista_elementi_selezione
FROM tabella
[ WHERE espressione_condizionale ]
Quindi, dopo aver digitato la parola SELECT si elencano gli
attributi (le colonne) che si vogliono includere nella query (si usa
un asterisco (*) per indicare tutti gli attributi della tabella); segue
la parola FROM con il nome della tabella che contiene i dati che
si vuole interrogare. La clausola WHERE (facoltativa) permette di
inserire eventuali condizioni (vincoli) che valgono per i dati da
reperire
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
17
SELECT
sintassi completa
La sintassi completa dell'istruzione SELECT è la seguente:
SELECT [ ALL | DISTINCT ] lista_elementi_selezione
FROM lista_riferimenti_tabella
[ WHERE espressione_condizionale ]
[ GROUP BY lista_colonne ]
[ HAVING espressione_condizionale ]
[ ORDER BY lista_colonne ]
Per comprendere meglio il funzionamento del comando SELECT ci
aiuteremo con degli esempi, supponendo di utilizzare una tabella di nome
anagrafica con i seguenti attributi: cogn, nome, città, prov, indirizzo,
data_nascita.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
18
Proiezione su una tabella
SELECT prov
FROM anagrafica;
Questo statement estrae dalla tabella anagrafica tutte le righe
della colonna provincia.
SELECT DISTINCT prov
FROM anagrafica;
Se viene specificato il predicato DISTINCT le righe duplicate
nella tabella risultante vengono ridotte a una.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
19
Elencare l’intera tabella
SELECT *
FROM anagrafica;
Il risultato produrrà una tabella con tutte le colonne nell’ordine in
cui sono state descritte al momento della creazione della tabella.
Se si vogliono le colonne disposte in un ordine diverso, bisogna
digitare i nomi degli attributi nell’ordine desiderato separando i
nomi con una virgola.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
20
Intestazioni diverse alle colonne
selezionate
Normalmente la tabella che si ottiene da una query con SELECT
possiede un’intestazione della colonne che riporta i nomi degli attributi,
se si vuole modificare l’intestazione, occorre dichiarare la stringa della
nuova intestazione insieme alla clausola AS
SELECT prov AS PROVINCIA
FROM anagrafica;
SELECT cogn AS COGNOME, prov AS PROVINCIA,
FROM anagrafica;
Per inserire l’intestazione formata da due parole, si devono racchiudere
tra apici: ‘DATA DI NASCITA’; in ACCESS si devono racchiudere tra
parentesi quadre [DATA DI NASCITA].
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
21
Ordinamento
Nel comando SELECT si può inserire la clausola ORDER BY per ottenere i risultati di
un’interrogazione ordinati secondo i valori contenuti in una o più colonne tra quelle
elencate accanto alla parola SELECT. L’ordinamento è crescente per default e va
specificata la parola DESC solo se si desidera l’ordinamento decrescente.
(Comunque può essere usata la parola chiave ASC per l’ordinamento crescente)
SELECT cognome, nome, città
FROM anagrafica
ORDER BY cognome, nome;
SELECT cognome, nome, classe
FROM anagrafica
ORDER BY cognome DESC, classe;
Il primo esempio ordina in senso crescente di cognome e a parità di cognome in
senso crescente di nome, il secondo esempio produce l’elenco delle persone in
ordine decrescente rispetto al cognome e, a cognome uguale, in ordine crescente di
classe.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
22
Funzione COUNT
La funzione COUNT conta il numero di righe presenti in una tabella. La
funzione conta il numero delle righe indipendentemente dei valori in esse
memorizzati.
SELECT COUNT (*)
FROM anagrafica
Lo statement restituisce il numero di tutte le righe presenti nella tabella
anagrafica.
Se un comando Select contiene una condizione (Where), la funzione
COUNT restituisce il numero delle righe che soddisfano la condizione:
SELECT COUNT (*)
FROM anagrafica
Where prov =“RC”
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
23
Funzione SUM
La funzione SUM restituisce la somma di tutti i valori contenuti in
una colonna specificata come argomento della funzione,
naturalmente l’attributo utilizzato nel calcolo deve essere numerico.
SELECT SUM (stipendio)
FROM personale
WHERE livello = 5 ;
L’argomento della funzione SUM può anche essere un’espressione
numerica contenente i nomi di attributi di tipo numerico
SELECT SUM (prezzo_unitario * quantità ) AS totale
FROM fattura ;
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
24
Funzioni MIN e MAX
Le funzioni MIN e MAX restituiscono rispettivamente il valore minimo e il
valore massimo tra i valori della colonna specificata come argomento della
funzione
SELECT MIN (stipendio), Max(stipendio)
FROM personale ;
Le funzioni MIN e Max consentono di determinare i valori minimi e massimi
anche per campi di tipo carattere
SELECT MIN (cognome), Max(cognome)
FROM anagrafica ;
Lo statement restituisce il primo e l’ultimo cognome in ordine alfabetico
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
25
Raggruppamento: clausola
GROUP BY
La clausola GROUP BY raggruppa un insieme di righe aventi lo
stesso valore nelle colonne indicate: questa opzione produce una
riga di risultati per ogni raggruppamento.
Supponiamo di avere una tabella (ordini) con i seguenti campi:
numero_ordine, cod_articolo, quantità, prezzo, la query:
SELECT numero_ordine, SUM(quantità*prezzo)
FROM ordini
GROUP BY numero_ordine ;
produce una riga per ogni tipo ordine calcolando i totali dei singoli
ordini. Se nella query non mettiamo la clausola GROUP BY come
risultato si otterrebbe una sola riga con il totale generale.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
26
Clausola HAVING
La struttura del comando SELECT con raggruppamento può
essere ulteriormente ampliata con la clausola HAVING, con la
quale è possibile sottoporre al controllo di una o più condizioni i
gruppi creati con la clausola GROUP BY.
Consideriamo la query nella diapositiva precedente ed
aggiungiamo una clausola Having:
SELECT numero_ordine, SUM(quantità*prezzo)
FROM ordini
GROUP BY numero_ordine ;
HAVING SUM(quantità*prezzo) > 200;
Come risultato otteniamo solo le righe che soddisfano la
condizione espressa con HAVING.
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
27
I vincoli
I vincoli consentono di specificare controlli
sui dati, al fine di assicurare la correttezza e
consistenza dell’informazione.
I vincoli possono essere:


interni (o intrarelazionali) specificano controlli sulla singola tabella
intesa come entità a se stante
di integrità referenziale riguardano i rapporti tra una tabella e
l’altra.
Vincoli interni
NOT NULL
Impedisce di inserire un dato nullo nel
campo in cui viene specificato.
 <NomeCampo> <Tipo> NOT NULL;

PRIMARY KEY
Imposta un campo (o più campi) come
chiave primaria della tabella.
 PRIMARY KEY (<NomeCampo>);

CHECK
Vincoli di integrità referenziale
FOREIGN KEY
Imposta una chiave esterna in una tabella,
con campi che fanno riferimento ad un’altra
tabella del DataBase.
 FOREIGN KEY (<ElencoCampi>)
REFERENCES <NomeTabella>
(<ElencoCampiTabella>);

<ElencoCampi>

Elenco dei campi della tabella corrente.
Integrità referenziale
L’integrità referenziale viene controllata
anche dalle parole chiave RESTRICT,
CASCADE e SET NULL, che
consentono di controllare la risposta del
database a un vincolo.
RESTRICT

Il database rifiuta le modifiche violano un
vincolo
CASCADE
SQL
Fine
21/04/2016
ITIS "M. M. Milano" Polistena - Prof. Rocco Ciurleo
32