Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
I vari linguaggi utilizzati per l’interazione con le basi di dati sostanzialmente permettono operazioni in due
parti:
Operazioni sullo schema: tramite le istruzioni di tipo DDL (Data Definition Language);
Operazioni sui dati contenuti nel database: tramite le istruzioni DML (Data Manipulation
Language): sostanzialmente le operazioni fondamentali DML sono:
o Interrogazione (query): prelievo di informazioni dal database;
o Aggiornamento di dati già presenti.
Dichiarativi: linguaggi che permettono di specificare che cosa fare, ma senza dare la possibilità di
sapere come viene fatto ciò che si vuole fare;
Procedurali: linguaggi che permettono di specificare come riuscire a fare ciò che si intende fare.
Algebra relazionale
L’algebra relazionale è un linguaggio composto da un insieme di operatori scomponibili; svolgono
operazioni sulle relazioni e permettono di produrre in output altre relazioni.
Operatori insiemistici
Sono degli operatori dove le relazioni vengono considerate come degli insiemi e dove è quindi possibile
applicarvici tutte le sotto-operazioni previste dagli operatori insiemistici, quindi unione, intersezione e
differenza.
Unione
l'unione di due relazioni r1 e
r2 definite sullo stesso
insieme di attributi X è
indicata con r1 ∪ r2 ed è una
relazione ancora su X
contenente le tuple che
appartengono a r1 oppure a
r2, oppure a entrambe.
La relazione ottenuta ha lo
stesso schema di Laureati e
Quadri e contiene i dati
"fusi" delle due entità.
Vengono anche eliminati i
duplicati.
Intersezione
l'intersezione di r1(X) e r2(X) è indicata con r1 ∩ r2 cd è una relazione su X contenente le tuple che
appartengono sia a r1 sia a r2.
Differenza
la differenza di r1(X) e r2(X)
è indicata con r1 - r2 ed è
una relazione su X
contenente le tuple che
appartengono a r1 e le tuple
che NON appartengono a
r2.
La relazione ottenuta
contiene gli elementi che
appartengono a Laureati
ma non a Quadri.
Prodotto cartesiano
il prodotto cartesiano
di r1(X) e r2(X) è
indicata con r1 ✕ r2
ed è una relazione su
X che contiene le
colonne sia di r1 che
di r2.
Per riempire la
tabella ricavata dalla
relazione X si
scorrono tutte le
tuple della relazione
r1 e si associano
ciascuna con una
tupla della relazione
r2; una volta finito lo
scorrimento di r1, si
fa lo stesso con la
prossima tupla di r2,
e via dicendo.
Ridenominazione
La ridenominazione è un operatore monadico, ovvero che
richiede un solo argomento.
Sintassi:
Oppure
Selezione
Sintassi:
σ Condizione( operando)
Oppure
SELcondizione (operando)
La selezione è un operatore monadico che, ricevuti in input l’entità da selezionare (operando) e le eventuali
condizioni di selezione, restituisce in output un risultato che ha lo stesso schema dell’operando e che
contiene un sottoinsieme delle tuple di quell’operando, costituito dalle tuple che soddisfano le condizioni
poste nell’operatore.
Tabella di partenza:
Eseguendo l’operazione SEL Stipendio > 50 AND Filiale = ‘Milano’ (Impiegati):
Proiezione
La proiezione è un operatore monadico che, dati in input l’operando e le colonne che si desiderano
visualizzare, restituisce un risultato che contiene tutte le tuple dell’operando ma contiene solo le colonne
specificate.
Sintassi:
Combinando selezione e proiezione, possiamo estrarre informazioni da una sola relazione; tuttavia, non
possiamo però correlare informazioni presenti in relazioni diverse.
Join
Il join è l’operatore sicuramente più interessante dell’algebra relazionale, che permette di correlare dati
presenti in relazioni diverse.
Sostanzialmente, esistono due versioni del join: il join naturale, più adatto a riflessioni a livello astratto, e il
theta-join, più adatto dal lato pratico.
Join naturale
Il join naturale è un operatore binario che correla dati presenti in relazioni diverse, basando tale unione sui
valori di due attributi con lo stesso nome, che condividono anche lo stesso valore.
Produce un risultato che è costituito dagli attributi di entrambi gli operandi e dalle tuple di entrambi gli
operandi che hanno in comune il valore dell’attributo che c’è in comune tra le due tuple.
Sintassi:
entità 1 ⋈ entità 2
Oppure
Il join qua sopra viene definito join completo: questo perché al risultato partecipano le tuple di entrambe le
entità (sono presenti tutti i valori sia dell’entità Impiegati che di quella Capi).
Il join qua sopra viene invece definito join incompleto: questo perché nel risultato non sono presenti le
tuple di entrambi le relazioni, le tuple circondate di verde non sono infatti presenti perché hanno un valore
del loro attributo comune che non è presente nell’altra relazione.
Inoltre, in questo caso, vi è un join su una chiave, che è l’attributo Reparto, in comune con entrambe le
entità.
Il join qua sopra rappresenta una situazione estrema di un join incompleto, chiamato join vuoto: in questo
caso, nessuna tupla condivide il valore dell’attributo comune con la tupla dell’altra relazione, di
conseguenza non vi sono le condizioni per poter avere un join naturale. Si ha quindi un risultato vuoto.
Join esterno
Il join esterno è una variante del join standard (che è chiamato invece join interno) che include nel risultato
anche le ennuple, di una delle due entità, che invece sarebbero escluse dal join interno.
Left join: vengono incluse le tuple che non soddisfano la condizione di join interno dell’entità di sinistra
(Impiegati).
Right join: vengono incluse le tuple che non soddisfano la condizione di join interno dell’entità di destra
(Reparti).
Full join: vengono incluse le tuple che non soddisfano la condizione di join interno di entrambe le entità
(Impiegati e Reparti).
In generale, avendo R1(X1, Y) e R2(Y, Y2), dove Y è l’attributo comune tra R 1 e R2, si ha che
Il prodotto cartesiano, usato da solo, rimane spesso poco utile, questo perché unisce due relazioni che non
sempre hanno una correlazione sensata tra di loro, e in alcuni casi non lo sono affatto. Avrebbe un pochino
più di senso solo se combinato con un operatore di selezione, che permetterebbe di scremare l’output del
prodotto in base alle esigenze richieste.
Il theta join permette quindi di combinare due entità che non abbiano attributi in comune tra di loro.
Sintassi:
Oppure
R1 ⋈condizione di join R2
Nel join qua sopra, il risultato contiene le tuple di Impiegati e di Reparti che hanno il valore di Reparto
uguale al valore di Codice.
Se l’operatore che viene impiegato nella condizione è l’uguaglianza (=), viene chiamato in quel caso equi
join.
È importante notare che in SQL non esiste la possibilità di eseguire il join naturale, questo perché i DBMS
non fanno controlli sul nome degli attributi, ma solo sul loro valore. È quindi implementato solamente il
theta join.
Equivalenza di espressioni
Due espressioni sono dette equivalenti se producono lo stesso risultato qualunque sia l'istanza attuale della
base di dati.
L'equivalenza di espressioni nell’algebra relazionale risulta particolarmente importante dal punto di vista
applicativo, nella fase di esecuzione delle interrogazioni. Infatti, le interrogazioni, specificate in linguaggio
SQL vengono tradotte in algebra relazionale.
Dipendente dallo schema (≡R), dove l’equivalenza è dipendente dall’istanza dello schema;
Assoluta (≡), dove l’equivalenza è indipendente dallo schema impiegato.
Schema interno: rappresenta il modo in cui il database viene memorizzato fisicamente nel server in cui
giace, e quindi come il livello logico viene memorizzato concretamente.
Viste
Le viste sono delle rappresentazioni differenti create a partire dagli stessi dati. Nell’architettura a tre livelli
del DBMS sono rappresentate dallo schema esterno.
Le viste sono note anche come relazioni derivate, che, nel modello relazionale, sono relazioni il cui
contenuto è dipendente dal contenuto di altre relazioni; volendo, ci sarebbero anche le relazioni di base, il
cui contenuto è invece indipendente dalle altre relazioni.
1. Viste materializzate;
2. Viste virtuali (dette anche relazioni virtuali).
Viste materializzate
Le viste materializzate vengono memorizzate nella base di dati, e hanno il vantaggio quindi di essere
immediatamente disponibili per le interrogazioni.
Tuttavia, è spesso oneroso mantenere il loro contenuto allineato con quello delle relazioni da cui derivano.
Risultano quindi convenienti quando gli aggiornamenti sono rari rispetto alle interrogazioni e il calcolo della
vista è complesso.
Oggigiorno sono scarsamente supportate dai DBMS, perché vi è sempre la difficoltà di dover fornire
tecniche generalizzate per mantenerne l’allineamento.
Sono supportate dalla stragrande maggioranza dei DBMS moderni, che tra l’altro tendono a definirle
semplicemente “viste”, senza la dicitura “virtuali”.
Le viste vengono definite nei sistemi relazionali a partire da un’espressione di interrogazione (quindi a
partire da una query): eventuali query che fanno riferimento alla vista verranno risolte sostituendo il nome
della vista con la query che l’ha originata; le due query (interrogazione + vista) vengono quindi combinate.
La vista virtuale, quando interrogata, viene ricalcolata: i dati presenti vengono quindi eventualmente
aggiornati con quelli nuovi presenti dalle entità da cui derivano.
Esempio di vista
A partire dalle tabelle sottostanti…
SELCapo ¿ Leoni ¿
' '
Come si può vedere nella seconda query, la dicitura Supervisione, che è il nome della vista, sostituisce la
query che compone la vista Supervisione.
Le viste possono avere svariati impieghi, sia per usi pratici che per usi interni:
Possono essere usate come schemi esterni, dove, in base al tipo di utente, è possibile visualizzare
di un’entità solo i dati ritenuti di interesse per lui, nascondendo ciò che non sarebbe autorizzato a
vedere;
Si possono usare anche come strumento di programmazione, dove le viste possono essere usate
per semplificare la scrittura di interrogazioni, espressioni complesse e sotto espressioni ripetute.
Non è possibile stabilire un’unica politica di aggiornamento delle viste, perché quando si vanno ad
aggiornare le relazioni che la compongono, non è sempre detto che la vista, qualora venga aggiornata,
permetta di mantenere l’integrità dei dati che sarebbero memorizzati, e quindi non vi è un unico
aggiornamento che comporterebbe un’istanza della vista uguale a quella della relazione di base. Per evitare
infatti queste situazioni, molto spesso i DBMS pongono forti limitazioni sugli aggiornamenti delle viste, e –
in alcune condizioni - non lo consentono affatto.
Calcolo relazionale
Con il termine calcolo relazionale si fa riferimento a una famiglia di linguaggi di interrogazione, basati sul
calcolo dei predicati del primo ordine, che hanno la caratteristica di essere dichiarativi, ovvero che sono
linguaggi dove si dichiara che cosa si vuole ottenere, senza sapere come ciò che si desidera viene ottenuto.
{ A 1 : x 1 , … , Ak : x k ∨f }
È possibile anche avere delle formule composte: se f 1 e f2 sono formule e x è un simbolo di variabile, allora
f1 ∨ f2, f1 ∧ f2, ¬ f1 1e ∀x(f) ∃x(f) sono formule.
1
∨ = disgiunzione logica (OR) | ∧ = congiunzione logica (AND) | ¬ = negazione logica (NOT)
Semantica del calcolo dei domini
Il risultato di un’espressione è una relazione su A 1, …, Ak che contiene ennuple di valori per x 1, …, xk che
rendono vera la formula f.
R(A1: x1, …, Ak: xk) è vera sui valori di x1, …, xk che formano una tupla di R.
Leggi di De Morgan
¬(A ∧ B) = (¬A) ∨ (¬B)
¬(A ∨ B) = (¬A) ∧ (¬B)
Inoltre:
∃x A = ¬(∀x ¬A)
∀x A = ¬(∃x ¬A)
Primo fra tutti, il fatto che il calcolo relazionale accetta e consente anche relazioni prive di senso.
per ogni espressione del calcolo relazionale che sia indipendente dal dominio esiste un'espressione
dell'algebra relazionale equivalente ad essa;
per ogni espressione dell'algebra relazionale esiste un'espressione del calcolo relazionale
equivalente a essa (e di conseguenza indipendente dal dominio).
TargetList: lista degli obiettivi dell'interrogazione, ha elementi del tipo Y: x.Z (oppure x.Z o anche x.*).
atomi del tipo x.A Θ c o x1.A1 Θ x2.A2. che confrontano, rispettivamente, il valore di x sull'attributo A
con la costante c e il valore di x1 su A1 con quello di X2 su A2:
connettivi;
quantificatori che associano i range alle relative variabili: ∃ x ( R )( f ) ∀ x (R)(f ).
“∃x(R)(f)” significa “esiste nella relazione R una tupla x che soddisfa la formula f”.
Limitazioni
Purtroppo, il calcolo su tuple con dichiarazioni di range non permette di esprimere tutte le interrogazioni
che possono essere formulate in algebra relazionale. In particolare, le interrogazioni i cui risultati possono
provenire indifferentemente da due o più relazioni (come, ad esempio, le unioni) non possono essere
espresse in questa versione del calcolo: infatti. i risultati sono costruiti a partire da tutte le variabili libere, i
cui range sono definiti nella target list, e ogni variabile ha come range una sola relazione.
Per questo motivo, SQL, il linguaggio pratico effettivamente utilizzato per l’interrogazione di basi di dati,
che è basato sul calcolo su tuple con dichiarazioni di range, prevede un costrutto esplicito di unione, questo
per esprimere interrogazioni che altrimenti risulterebbero non esprimibili.
Calcolo e algebra sono sostanzialmente equivalenti: l'insieme di interrogazioni con essi esprimibili è quindi
significativo; abbiamo quindi di conseguenza un concetto che è robusto.
Tuttavia, ci sono delle interrogazioni, anche di interesse, che non sono ancora esprimibili:
calcolo di valori derivati: possiamo solo estrarre valori, non calcolarne di nuovi;
interrogazioni ricorsive, come la chiusura transitiva.