APPUNTI DI SQL
Gli appunti qui forniti vogliono essere un riferimento scritto di alcuni degli argomenti trattati a lezione per
gli studenti a cui vengono messi a disposizione. Non viene fornita alcuna garanzia di completezza
sull’argomento trattato, essendo solo appunti informali.
Il libro di riferimento, a cui spesso si rimanda per eventuali riferimenti e approfondimenti, è “Basi Di Dati –
modelli e linguaggi di interrogazione ; McGraw-Hill; terza edizione”.
Nelle prossima trattazione, ed in particolare della stesura delle query sql, spesso si utilizzano caratteri
upper case ed altre volte no. SQL non è case sensitive, pertanto l’utilizzo di un carattere piccolo o grande
non influenza il risultato, e tuttavia la differenza mostrata nelle presente stesura è la semplice, volta per
volta, messa in evidenza.
SQL (structured query language, oggi nome a se stante)

DDL (Data Definition Language)

DML (Data Manipolation Language)
DATI:

atomici

strutturati
DATI ATOMICI:
character [varyng] [(lunghezza)]
char; varchar
bit [varyng] [(lunghezza)]
---------------------------------------------------------------------------decimal [(precisione [,scala] )]
scala: quante cifre significative devono sparire
numeric [(precisione [,scala] )]
scala: quante cifre significative devono sparire
integer
smallint
---------------------------------------------------------------------------float [(precisione)]
real
precisione: cifre per la mantissa
precisione fissa
double precision precisione doppia alla precedente
---------------------------------------------------------------------------Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 1
date
data senza ora
time [(precisione)] [with time zone]
precisione: per la frazione del secondo
timestamp [(precisione)] [with time zone]
precisione: per la frazione del secondo
---------------------------------------------------------------------------boolean
blob
clob
---------------------------------------------------------------------------NULL: indica assenza di valore
VARI
create scheme NOMEDB; (crea il database)
show databases; (mostra tutti I database esistenti)
use NOMEDB; (imposta il database da utilizzare)
show tables; (mostra tutte le tabelle si un database)
CREAZIONE TABELLA
CREATE TABLE <tabella> (
<campo> <tipo> [ NULL | NOT NULL ] [ <chiave> ] [ <vincolo> ],
<campo> <tipo> [ NULL | NOT NULL ] [ <chiave> ] [ <vincolo> ],
...
)
create table nome_tabella(
nome_attributo dominio [valore di default] [vincoli]
, etc..
altri vincoli
)
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 2
Es:
create table nominativi(
cognome varchar(256),
nome varchar(256)
);
L’opzione “DEFAULT <valore | NULL >” , inserita subito dopo la definizione del dominio, permette di
definire valori di default.
Vincoli
La violazione di un vincolo, usualmente (vedasi vincoli inter-relazionali), non permette l’operazione.
Vincoli intrarelazionali
NOT NULL
Impossibilità di assumere valore NULL.
es: nome varchar(20) NOT NULL
UNIQUE (impostazione di una superchiave)
Impossibilità di assumere valori uguali ad uno o più attributi. I valori null sono assunti tutti diversi tra loro.
Due modi:
-
su un solo attributo: si specifica l’attributo seguito dalla parola unique
-
su più attributi: dopo aver definito tutti gli attributi della tabella, si elencano quelli a cui fornire il
vincolo: unique(attr1, attr…)
PRIMARY KEY
È come unique ma implica anche il vincolo NOT NULL
Definizione identica a unique.
Vincoli inter-relazionali
(foreigni key = chiave esterna)
Crea un legame tra la tabella interna, il cui valore deve essere diverso da null, e quella esterna su un
attributo con vincolo unique o primary key.
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 3
Brevemente:
FOREIGN KEY (attr1)
REFERENCES tabella_esterna(attr)
Completo:
CONSTRAINT nome_vincolo (rigo opzionale e dipendente dall’implementazione)
FOREIGN KEY (attr1)
REFERENCES tabella_esterna(attr)
On <delete | update>
<cascade | set null | set default | no action>
VIOLAZIONE:
Violazioni del vincolo della tabella interna (che viene vista come subordinata) non vengono permesse.
Violazioni del vincolo (modifica o cancellazione) della tabella esterna (master) :
-
cascade: il nuovo valore dell’attributo della tabella esterna viene riportato su ttutte le
corrispondenti della tabella interna.
-
Set null: all’attributo referente viene assegnato NULL
-
Set default: all’attributo referente viene assegnato il valore di default
-
No action: l’azione non viene esegiuta
Modifica delle relazioni
Vedi pag. 108
Interrogazioni
Vengono esaminate dal query optimizer per la loro ottimizzazione.
Query base:
select lista_attributi
from nome_tabella
[where condizioni]
Query base:
select Attr [ [as] alias ] {, Attr [ [as] alias ]}
from nome_tabella [[as] alias ] {, nome_tabella [[as] alias ]}
[where condizioni]
WHERE ammette un’espressione booleana tramite gli operatori:
-
And; or; not
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 4
-
=; <>(diverso); >; <; <=; >=
-
ordine di precedenza a mezzo di parentesi
-
like (confronto tra stringhe: vedi dopo)
LIKE:
utilizzato nella clausola where con due caratteri speciali:
“_”: carattere arbitrario
“%”: stringa arbitraria di lunghezza arbitraria (eventualmente nulla)
Esempio:
where cognome like ‘_o%i’
DISTINCT:
Nelle selezioni può facilmente accadere che il risultato presenti dei duplicati. Ove non siano richiesti, è
possibile rimuoverli tramite la clausola “DISTINCT”, immediatamente dopo “select”, il cui opposto è “ALL”,
valore di default.
Esempio di utilizzo:
select [ DISTINCT | ALL ] attr, from…
JOIN INTERNI ED ESTERNI:
Tipicamente è possibile realizzare un join con una select su due o più tabelle.
Es:
select *
from tab1, tab2
where tab1.attr1=tab2.attr2
Lo standard sql mette a disposizione i seguenti costrutti.
select Attr [ [as] alias ] {, Attr [ [as] alias ]}
from nome_tabella [[as] alias ]
{ [TIPOJOIN] join nome_tabella [[as] alias ] on Condizione_di_join}
[where alter_condizioni]
Tipo di join:
-
inner
-
left outer
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 5
-
right outer
-
full outer
L'inner, è il join interno.
Il left outer join: fornisce il risultato esteso con le righe della tabella a sinistra.
In modo analogo si definisce il comportamento degli altri.
USO DI VARIABILI:
Tramite l’utilizzo degli alias vengono a crearsi delle variabili il cui utilizzo non si limita ad una semplice
ridenominazione: è infatti possibile riferirsi, per esempio, alla stessa tabella con due variabili differenti le
quali rappresentano due istanze della tabella stessa.
Es:
..
from Tab1 as A1, Tab1 as A2,
…
Ancora una volta ne viene a guadagnare l’espressività generale.
Nelle selezioni nidificate (non ancora esaminate) vale lo scope per le variabili.
ORDINAMENTI:
è possibile specificare un ordinamento delle righe delle selezioni terminando la selezione in questo modo:
…
ORDER BY attr_di_ordinamento [ ASC | DESC ]
{, attr_di_ordinamento [ ASC | DESC ]}
ASC (ascendente) è il valore di default. DESC è l’opposto.
Operatori aggregati
(estendono l’algebra relazionale)
Sono operatori che agiscono non più su una tupla alla volta, bensì su insiemi di tuple.
In prima analisi vediamo l’operatore count(*), il quale conta il numero di righe.
Utilizzo:
select count(*)
from tabella
where condizione
Nella risoluzione della query vengono esaminate prima le ultime due righe, ed il risultato viene passato
all’operatore.
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 6
Nello standard SQL ci sono 5 operatori:
count (< *| [distinct|all] lista_attributi > )
< sum | max | min | avg > (< [distinct|all] lista_attributi > )
Sum e avg ammettono espressioni che contengono valori numerici o intervalli di tempo. Max e min
ammettono espressioni su cui sia definito un ordinamento.
Rimane ovvio il significato degli operatori (deducibile dal nome).
Le varie implementazioni sql spesso offrono ulteriori operatori.
Gli operatori non possono essere utilizzati per condizionare le select (cioè utilizzati dopo il where).
Raggruppamenti
È possibile definire un ordinamento delle righe tramite l’inserimento in coda della clausola:
order by attr.
Gli operatori precedentemente introdotti, possono in questo modo agire su gruppo di tuple.
Esiste una limitazione di sintassi: vedi pag 131.
PREDICATI SUI GRUPPI:
per effettuare una selezione sui gruppi si utilizza la clausola:
having …
vedi pag 133
L’utilizzo di questo costrutto senza il precedente order by, tratta le tuple come un unico gruppo.
Interrogazioni di tipo sistemistico
selectSQL
<union | intersec | except > [all]
selectSQL
except sta per “differenza”.
[all] va inserito in quanto questa volta il valore di defaul, quello utilizzato in caso in cui non sia inserito
alcunché, è distinct (che toglie tutti i valori uguali).
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 7
Interrogazioni nidificate
Viene inserita una interrogazione (select) in una clausola where di un’altra interrogazione.
Select..
From…
where attr operatore any|all ( selectSQL )
Dove:
Operatore: =; <>(diverso); >; <; <=; >=
Any: la condizione deve essere verificata per almeno una tupla
All: la condizione deve essere verificata per tutte le tuple
I domini devono essere confrontabili
Per rappresentare il controllo di appartenenza o esclusione rispetto ad un’insieme, SQL mette a
disposizione due operatori “in” e “not in”, i quali risultano del tutto identici a “= any” e “<> all”.
Interrogazioni nidificate complesse
Pag140
Inserimento
(dei dati nelle tabelle)
insert into nome_tabella (attr.1,attr.2,..) values (‘val1’,val2,..);
oppure
insert into nome_tabella ( selectSQL )
nell’ultimo caso serve la compatibilità tra i domini.
Cancellazione di righe
Delete from nome_tabella
where condizione;
condizione: rispetta la sintassi delle select; può valutare anche select nidificate.
Cancellazione di tabelle
Drop table nome_tabella cascade | restrict
Cascade: elimina anche le viste e le tabelle che nella loro definizione fanno riferimento alla tabella
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 8
Restrict: se vi sono viste o tabelle che vi fanno riferimento, allora la cancellazione fallisce.
Modifica dei dati
Update nome_tabella
set attr = <espressione | selectSQL | NULL | defaul >
{, attr = <espressione | selectSQL | NULL | defaul >}
[where condizione]
Es:
Update alunno
set anno =3
where id=1;
Vincoli di integrità generici
Tutti i vincoli si possono anche in un altro modo, peraltro più espressivo, e cioè tramite la clausola:
check ( condizione )
applicato al seguito della definizione di ciascun attributo. Tutti gli altri vincoli possono essere specificati in
questo modo, il quale è però meno pratico rispetto ai vincoli su visti. Inoltre di perde la possibilità di
definire una politica di reazione.
Asserzioni
Sono vincoli definiti tramite la clausola check ed associati allo schema.
Create assertion nome_asserzione
Check (condizione)
Politiche di controllo
Il controllo dei vincoli può essere
-
immediato
-
differito (da controllare alla fine di una transazione)
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 9
Viste
Vedi pag. 160
Funzioni scalari
Vedi pag. 165
Controllo dell’accesso
SQL permette di specificare chi opera, su cosa opera e come.
Si basa sul concetto di privilegio. Ogni privilegio è caratterizzato da:
1- la risorsa a cui si riferisce
2- l’utente che concede il privilegio
3- l’utente che riceve il privilegio
4- l’azione che viene permessa alla risorsa
5- se il privilegio può essere trasmesso o meno ad altri utenti
Quando una risorsa viene creata, il sistema concede automaticamente tutti i privilegi su tale risorsa al
creatore. Esiste inoltre un utente predefinito (_system) che rappresenta il database administrator, il quale
possiede tutti i privilegi su tutte le risorse.
I privilegi disponibili sono:
-
insert
-
update
-
delete
-
select
-
references (per fornire l’autorizzazione ad effettuare un riferimento)
-
usage
drop ed alter possono essere concessi ma rimangono prerogativa del creatore.
Concedere privilegi:
grant Privilegi on Risorsa to Utente [with grant option]
Privilegi: se tutti allora “all privileges”
with grant option: indica se il privilegio può essere propagato
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 10
Rimuovere privilegio:
revoke Privilegi on Risorsa from Utente [restrict | cascade]
Nei privilegi si può anche specificare “grant option”.
Nella revoca dei privilegi può nascere un problema quando l’utente aveva concesso, a sua volta, altri
privilegi. In questo caso, il comportamento è specificato secondo i valori:
-
restrict: è il valore di default, ed indica di non eseguire la revoca qualora li si debba revoca anche ad
altri utenti
-
cascade: li toglie a tutti
SQL-3 ha introdotto l’accesso basato sui ruoli.
Transazioni
Start transaction
…
…
< commit | rollnack > work
Procedure
Sql permette procedure molto molto semplici.
Trigger
Detti anche regole attive, seguono il paradigma evento-condizione-azione (ECA).
Ogni trigger si attiva dopo uno specifico evento e se si verifica una condizione, eseguono un’azione.
Documento redatto da Mercogliano Isidoro con diritti di cui art. 2576 c.c.
Mercogliano Isidoro - Appunti di SQL -Bozza n°3
- pagina: 11