Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
vuoi
o PayPal
tutte le volte che vuoi
SQL
È più di un semplice linguaggio di query. È il linguaggio di riferimento per l’interrogazione di
DBMS relazionali. Si compone di una parte DDL e di una DML
• DDL - definizione di domini, tabelle, indici, autorizzazioni, viste (sono una versione più logica
delle tabelle), vincoli, procedure, trigger
• DML - linguaggio di query, linguaggio di modifica (update, insert, delete), comandi transazionali
La standardizzazione è stata fondamentale per la sua diffusione.
Le interrogazioni SQL sono dichiarative: l’utente specifica quale informazione è di suo interesse, ma
non come estrarla dai dati. Le interrogazioni vengono tradotte dall’ottimizzatore (query optimizer)
nel linguaggio procedurale interno al DBMS. Il programmatore si focalizza sulla leggibilità, non
sull’efficienza.
Nella sua forma più semplice l’estrazione di dati avviene attraverso il seguente comando:
SELECT ListaAttributi
FROM Tabella
che ha come effetto quello di estrarre da una tabella i valori relativi ad un sottoinsieme degli
attributi della tabella stessa. Tale operazione è equivalente alla PROIEZIONE nell’algebra
relazionale πListaAttributi^Tabella
La lista degli attributi che segue la parola chiave SELECT è detta target list
risultato contiene i dati relativi a tutti gli attributi della
SELECT * FROM Impiegatoàil
tabella.
L’istruzione può essere estesa in modo da effettuare una SELEZIONE delle righe che
select
devono comparire nel risultato. Questo richiede la specifica di una condizione di selezione: una
formula booleana da calcolarsi (riga per riga) in base al valore di alcuni attributi. Il risultato conterrà
solo quelle righe per le quali la condizione di selezione dà valore vero.
Sia gli attributi che le tabelle possono essere rinominati per mezzo di con il costrutto
alias as
La clausola ammette come argomento un'espressione booleana costruita combinando
where
predicati atomici con gli operatori e
and, or not
Oltre ai normali operatori di confronto relazionali (=, <, >, <=, >=, <>), SQL mette a disposizione
l’operatore per il confronto di stringhe. Questo supporta il confronto tra stringhe in cui
like
compaiono due caratteri speciali:
_ (?) può rappresentare un qualsiasi carattere
% (*) può rappresentare una stringa di un numero arbitrario di caratteri (anche nullo)
Cognome inizia con la cà where cognome like ‘C%’
Cognome ha una “o” in seconda posizione e finisce con “i”à ‘_o%i’
JOIN
L’estrazione di informazioni contenute su più tabelle richiede la specifica di: quali siano le tabelle da
prendere in considerazione; quale sia il criterio per correlare le righe delle diverse tabelle.
Questa operazione prende il nome di JOIN tra le tabelle e viene eseguita attraverso due passi:
- Prodotto cartesiano tra le due tabelle: si concatenano ogni riga della prima tabella con ogni riga
della seconda tabella
- Si selezionano le righe conformi al criterio di correlazione
I valori nulli rappresentano tre diverse situazioni:
- un valore non è applicabile
- un valore è applicabile ma sconosciuto
- non si sa se il valore è applicabile o meno
SQL fornisce un predicato per la gestione dei valori nulli. La sintassi è:
- Attributo is [ not ] null
e risulta vero solo se l’attributo ha valore nullo (o non nullo se usato nella forma is not null)
in caso di presenza di NULL si usa la logica a tre valori: V=vero, F=falso, U=unknown
Quando confrontiamo un valore mancante con un valore esistente, il risultato è sconosciuto
UNKNOWN (proprio perché uno dei due valori è mancante e quindi l’espressione non potrà essere
né vera né falsa)
Duplicati:
Nel modello relazionale non si ammette che una relazione possa contenere righe uguali
In SQL possono esserci più righe uguali (dette duplicati) nel risultato di una eliminare i
select:
duplicati è costoso (richiede tempo) e spesso non necessario.
SQL esegue la rimozione dei duplicati solo quando esplicitamente richiesto
nell’interrogazioneàcostrutto select distinct
Join interni ed esterni: sino ad ora la specifica della condizione di join è stata inclusa nella clausola
where. Una sintassi alternativa permette di distinguere le condizioni di join da quelle di selezione tra
le righe. In questo modo è anche possibile specificare le forme esterne dell’operatore di join.
La condizione di join non compare nella clausola where ma nella clausola from:
- (valore di default, è il join dell’algebra relazionale), (questi
inner right, left, full
ultimi tre possono essere seguiti dalla parola chiave outer).
Join naturale: un’estensione di SQL-2 permette di far precedere ad ogni join la parola chiave
In questo modo si consente la specifica del join natural presente nell’algebra
natural.
relazionale, che prevede di utilizzare nel join di due tabelle una condizione di implicita uguaglianza
su tutti gli attributi caratterizzati dallo stesso nome.
Ordinamento: in SQL è possibile specificare che i risultati di una interrogazione siano ordinati sulla
base del valore di alcuni attributi. Questo è consentito attraverso l’uso della clausola order by
posta a seguire la clausola Sintassi:
where. order by Attributo1[ asc | desc ]
Operatori aggregati consentono di estrarre informazioni che rappresentano proprietà di gruppi di
tuple: Gli operatori aggregati vengono gestiti dopo aver
count, sum, max, min, avg.
risolto l’interrogazione in base alle clausole from e where.
-count: conteggio tuple in una relazione
(* restituisce numero righe; restituisce il numero di righe con valore diverso e non
distinct
nullo degli attributi in ListaAttributi; restituisce il numero di righe con valore non nullo degli
all
attributi in ListaAttributi).
-sum ed avg ammettono come argomento solo espressioni che rappresentano valori numerici o
intervalli di tempo.
-max e min richiedono solamente che sull’espressione sia definito un ordinamento (si possono
anche applicare a stringhe di caratteri e istanti di tempo).
Gli attributi NON possono essere mischiati con operatori aggregati!
La specifica della lista di attributi su cui effettuare il raggruppamento avviene attraverso la clausola
group by
La query raggrupperà le righe che possiedono valori uguali sull’insieme di attributi della clausola
group by. Il valore di eventuali operatori aggregati sarà valutato separatamente per ciascun gruppo.
In presenza della clausola group by i valori estratti dall’operazione di SELECT riflettono proprietà
di ciascun gruppo, non di singole tuple: nella target list possono comparire solo un sottoinsieme
degli attributi della clausola group by (oltre agli operatori aggregati)
Le condizioni da verificare a livello di gruppo sono specificate attraverso un nuovo costrutto: la
clausola Questa consente la specifica di un predicato in cui compaiono gli operatori
having.
aggregati. I predicati dove compaiono operatori aggregati possono comparire solo come argomento
della clausola having.
La sintassi prevede l’uso della clausola having anche in assenza di una clausola group by
La condizione espressa nella clausola having viene valutata al termine dell’interrogazione: where
ha precedenza su (i gruppi vengono composti dopo aver verificato la clausola where e solo
having
dopo la composizione dei gruppi si valuta la clausola having).
Interrogazioni di tipo insiemistico
(unione), (intersezione), (o differenza).
union intersect except minus,
Mentre i risultati di intersezione e differenza possono essere espressi utilizzando altri costrutti del
linguaggio (interrogazioni nidificate), l’operatore di unione arricchisce il potere espressivo di SQL
permettendo di scrivere interrogazioni altrimenti non formulabili.
Gli operatori insiemistici assumono come default l’eliminazione dei duplicati (se si vogliono
mantenere i duplicati basta includere la clausola all).
Interrogazioni nidificate fino ad ora abbiamo visto interrogazioni in cui l’argomento della clausola
si basa su condizioni espresse da predicati semplici: confronto riga per riga tra il valore di un
where
attributo ed una costante o il valore di un altro attributo. Ci sono tuttavia interrogazioni che richiedono
una modalità di specifica più complessa, che consenta di effettuare la selezione in base al risultato di
una seconda interrogazione.
La soluzione consiste nell’estendere il tipo di confronti che possono essere specificati nella clausola
Confronto riga per riga tra: il valore di un attributo ed una costante; il valore di un attributo
where.
e un altro attributo; il valore di un attributo e il risultato di una select
(in questo caso l’interrogazione usata x confronto viene definita direttamente all’interno della
clausola where e si parla di interrogazioni nidificate). Ci può essere disomogeneità tra i termini
messi a confronto nella clausola whereà SQL la gestisce con le parole chiave e che
any all
estendono gli operatori di confronto relazionale (=,
<>, <, >, <=, >=).
- Con la condizione risulta vera se il confronto
any
tra attributo e risultato è vero per almeno uno degli
elementi restituiti dall’interrogazione.
- Con la condizione risulta vera se il confronto
all
tra attributo e risultato è vero per tutti gli elementi
restituiti dall’interrogazione.
Deve esserci compatibilità di dominio tra l’attributo
oggetto del confronto ed il risultato
dell’interrogazione.
Per rappresentare il controllo di appartenenza rispetto
ad un insieme, SQL mette a disposizione gli operatori
e che sono del tutto equivalenti agli
in not in
operatori =any e <>all.
L’operatore logico (ed il suo duale può essere usato nelle interrogazioni
exists not exists)
nidificate e restituisce il valore vero solo se l’interrogazione nidificata fornisce come risultato un
insieme non vuoto.
Una select che restituisce una tabella con un solo attributo ed una sola riga prende il nome di scalar
query. Una scalar query può essere inclusa come subquery nella target list di una query.
VISTE il concetto di vista deriva dall’indipendenza logica dei dati. Permette di avere una vista di
dati per ogni utente, indipendentemente dal livello sottostante.
Il modello relazionale permette di definire:
- Relazioni di base, il cui contenuto è autonomo
- Relazioni derivate, il cui contenuto è funzione di altre relazioni (sia di base che derivate)
Le relazioni derivate possono essere di due tipi:
1. Viste materializzate, il cui contenuto è salvato su disco
Le relazioni derivate materializzate sono mem