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.
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
R (PROJ (R) JOIN (PROJ (R))
X1 X2
Può infatti capitare, nel primo caso, che alcune ennuple non contribuiscano al risultato e, formando righe
identiche, vengano tagliate fuori.
Il JOIN ESTERNO estende con valori nulli le ennuple che verrebbero alternativamente tagliate fuori da un join
interno. Esistono 3 versioni di questo tipo di join:
➢ Sinistro, che mantiene tutte le ennuple del primo operando estendendole con valori nulli se
necessario.
➢ Destro, che mantiene tutte le ennuple del secondo operando estendendole con valori nulli se
necessario.
➢ Completo, che mantiene tutte le ennuple di entrambi gli operandi estendendole con valori nulli se
necessario.
Il prodotto cartesiano è un join naturale su relazioni che non hanno attributi in comune. Quindi contiene
sempre un numero di ennuple pari al prodotto delle cardinalità degli operandi poiché tutte le ennuple sono
combinabili tra loro.
Il prodotto cartesiano ha senso solo se seguito quindi da un’operazione di selezione del tipo:
SEL (R JOIN R )
Condizione 1 2
Questo tipo di operazione viene definito come THETA-JOIN ed indicato con:
R JOIN R
1 condizione 2
La condizione riportata è spesso una congiunzione di atomi di
confronto A ϑ A dove ϑ è uno degli operatori di confronto (=,<,>,…).
1 2
Se l’operatore è l’uguaglianza (=) allora si parla di EQUI-JOIN.
In SQL non esiste un operatore che esegua il JOIN NATURALE poiché i
DBMS non fanno controlli sul nome degli attributi. Quindi è
implementato in pratica soltanto il Theta-join.
Il join naturale è però interscambiabile con il Theta Join.
Le seguenti scritture sono equivalenti:
Impiegati JOIN (NATURALE) Reparti
PROJ (Impiegati JOIN REN (Reparti))
Impiegato,Reparto,Capo Reparto=Rep.reparto Rep.reparto<-Reparto
Nel caso di valori nulli bisogna utilizzare nella SLECT i specifici comandi IS NULL ed IS NOT NULL per
comprendere o meno anche tutti quanti i valori nulli presenti nella relazione considerata.
Due espressioni sono equivalenti se producono lo stesso risultato indipendentemente dall’istanza attuale
della base di dati. In algebra relazionale si possono avere due tipologie di equivalenza:
➢ Dipendente allo schema (= )
R
PROJ (R ) JOIN PROJ (R ) = PROJ (R JOIN R )
AB 1 AC 2 R ABC 1 2
Vera solo se (R ∩ R ) = A
1 2
➢ Assoluta (=)
R JOIN R = R JOIN R
1 2 2 1
R JOIN (R JOIN R ) = (R JOIN R ) JOIN R = R JOIN R JOIN R
1 2 3 1 2 3 1 2 3
Si ha inoltre distributività della selezione rispetto all’unione, alla differenza e della proiezione rispetto
all’unione.
SEL (P) = SEL (P) U SEL (P)
ϑ1 OR ϑ2 ϑ1 ϑ2
SEL (P) = SEL (P) ∩ SEL (P)
ϑ1 AND ϑ2 ϑ1 ϑ2
SEL (P) = SEL (P) - SEL (P)
ϑ1 AND -ϑ2 ϑ1 ϑ2
Un’equivalenza importante è la seguente, push selections:
SEL (R JOIN R ) = R JOIN SEL (R )
ϑ 1 2 R 1 ϑ 2
A condizione che ϑ contenga solo attributi di R . Essa riduce significativamente la dimensione del
2
risultato intermedio e quindi il costo dell’operazione. Un esempio di push projections con D unico
attributo in comune, prendendo R (A,B,C,D) ed R (D,E,F) avremo:
1 2
PROJ (R JOIN R ) = PROJ (PROJ (R ) JOIN PROJ (R ))
ABE 1 2 R ABE ABD 1 DE 2
Le viste sono relazioni derivate rappresentanti diversamente gli stessi dati (schema esterno). Il loro
contenuto è dunque funzione del contenuto di altre relazioni e viene definito per mezzo di interrogazioni.
Esse possono anche essere definite su altre derivate ma possono esserci solo due tipi di tali relazioni:
➢ Viste materializzate
Sono relazioni derivate che vengono memorizzate nella base di dati e che sono immediatamente
disponibili per le interrogazioni ma assolutamente ridondanti e raramente supportate dai DBMS.
➢ Relazioni virtuali (o viste)
Sono relazioni derivate che vengono calcolate al momento in cui viene eseguita un’interrogazione su
di essa e sono supportate da tutti i DBMS.
Le interrogazioni sulle viste sono eseguite sostituendo alla vista la sua definizione:
SEL (Supervisione)
Capo=’Bruni’
Viene eseguita esattamente come se avessimo scritto:
SEL (PROJ (Afferenza JOIN Direzione))
Capo=’Bruni’ Impiegato, Capo
Le viste, facendo parte dello schema esterno, consentono di mostrare agli utenti solo le informazioni di
interesse e ciò che a tutti gli effetti sono autorizzati a vedere. Sono inoltre utili strumenti di programmazione
ai fini di semplificare la scrittura delle interrogazioni specie in espressioni complesse o sottoespressioni
ripetute. L’utilizzo di viste non influisce inoltre sull’efficienza delle interrogazioni. La relazioni base hanno
invece contenuto autonomo.
Per aggiornare una vista è necessario modificare le relazioni di base in modo che la vista ricalcolata rispecchi
l’aggiornamento. Tale aggiornamento corrispondente a quello specificato sulla vista deve essere univoco ma
in generale non lo è: sono pochi gli aggiornamenti ammissibili sulle viste.
CALCOLO RELAZIONALE
E’ una famiglia di linguaggi dichiarativi basati sul calcolo dei predicati del primo ordine. Ne esistono diverse
versioni:
➢ Calcolo relazionale su domini
Le espressioni hanno la forma {A : x ,…, A : x | f} dove f è una formula con connettivi booleani e
1 1 k k
quantificatori. Si definisce A : x ,…, A : x come target list costituita da attributi distinti A ,…, A e
1 1 k k 1 k
variabili distinte x ,…, x .
1 k
Le formule sono atomiche:
R(A : x ,…, A : x ) con R(A ,…, A ) schema di relazione e x ,…, x variabili
1 1 k k 1 k 1 k
x ϑ y, x ϑ c con x e y “variabili”, c “costante” e ϑ operatore di confronto
La sintassi prevede formule composte quindi se f e f sono formule e x è un simbolo di variabile allora
1 2
si potranno avere f OR f , f AND f , f - f , per ogni x(f), esiste x(f).
1 2 1 2 1 2
Il risultato di un’espressione è una relazione su A ,…, A che contiene ennuple di valori per x ,…, x
1 k 1 k
che rendono vera la formula f.
➢ Calcolo su ennuple con dichiarazioni di range
LINGUAGGIO SQL
Originariamente “Structured Query Language” l’SQL è un linguaggio dotato di varie funzionalità poiché
contenente sia il DDL che il DML. Esistono numerosi versioni di questo linguaggio ma ne esamineremo solo
gli aspetti essenziali e non i dettagli specifici.
La prima proposta fu nel 1974 quando uscì il SEQUEL ma diventò lo standard di fatto solo dal 1983. Tutt’ora
la standardizzazione non è completa.
La definizione della base di dati in SQL avviene tramite l’utilizzo dell’istruzione:
➢ CREATE SCHEMA che definisce uno schema di base di dati, eventualmente con schema di tabelle
vuoto, enunciandone le proprietà:
Create schema [nome_schema] [authorization]
{
Definizione degli elementi dello schema
};
La creazione di uno schema di relazione avviene per mezzo del comando:
➢ CREATE TABLE che definisce lo schema e ne crea un’istanza vuota specificando attributi, domini e
vincoli
Create table [nome_tabella]
(
nome_Attributo [Dominio] [Val_Default] [Vincoli]
);
I domini utilizzati possono essere:
➢ Elementari (predefiniti)
CARATTERI
BIT
NUMERICI
DATA, ORA, INTERVALLI DI TEMPO
BOOLEAN
BLOB, CLOB
➢ Definiti dall’utente (semplici ma riutilizzabili)
Si utilizza l’istruzione CREATE DOMAIN che definisce un dominio semplice utilizzabile in definizioni di
relazioni anche con vincoli e valori di default.
La creazione di un nuovo dominio personalizzato avviene per mezzo del comando:
➢ CREATE DOMAIN che definisce un dominio semplice ed utilizzabile nelle definizioni delle relazioni
anche con vincoli e valori di default
create domain Voto as smallint DEFAULT NULL check (voto>=18 and voto <=30);
I vincoli intrarelazionali sono esprimibili per mezzo dei comandi:
➢ NOT NULL che segnala un valore che non può essere nullo
Nome char (6) NOT NULL;
➢ UNIQUE che definisce le chiavi venendo posto nella definizione di un attributo se esso forma da solo
la chiave oppure, in caso contrario, come elemento separato
Stipendio numeric (9) UNIQUE
UNIQUE (stipendio, matricola)
➢ PRIMARY KEY che definisce le chiavi primarie (nel caso di una sola implica anche NOT NULL)
Matricola char (6) PRIMARY KEY
PRIMARY KEY (Matricola, Badge)
➢ CHECK
I vincoli interrelazionali sono esprimibili per mezzo di altri comandi quali:
➢ REFERENCES E FOREIGN KEY che permettono di definire vincoli di integrità referenziale per singoli
attributi o su più attributi.
FOREIGN KEY (Vigile) REFERENCES Vigili (Matricola)
FOREIGN KEY (Provincia, numero) REFERENCES Auto (Provincia, numero)
È possibile inoltre definire politiche di reazione alla violazione. Tali azioni compensative sono
esprimibili con i comandi: on <delete | update> <cascade | set null | set default | no action>
FOREIGN KEY(TargaP, TargaN) REFERENCES(Provincia, numero) on delete set null on update cascade
La modifica agli schemi avviene per mezzo di comandi quali:
➢ ALTER DOMAIN
➢ ALTER TABLE
➢ DROP DOMAIN
➢ DROP TABLE
Gli schemi definiti vengono mantenuti dai DBMS
in un dizionario dei dati mediante una struttura
relazionale. Ci sono infatti due tipi di tabelle:
➢ Dati
➢ Metadati, ovvero i dati che descrivono i dati
Le operazioni sui dati in SQL si esprimono per
mezzo di comandi di:
➢ Interrogazione, come SELECT
➢ Modifica, come INSERT, DELETE, UPDATE
L’istruzione SELECT nella sua versione base è definita tramite i comandi:
SELECT Lista_Attributi
FROM Lista_Tabelle
[WHERE Condizione]
❖ L’istruzione SELECT definisce la target list decomponendo verticalmente (PROIEZIONE) mentre l’istruzione
FROM permette di indicare le tabelle su cui si sta agendo o le operazioni di JOIN tra di esse. Il comando
WHERE è facoltativo e permette di decomporre orizzontalmente (SELEZIONE).
Nome e reddito delle persone con meno di trenta anni
PROJ Nome, Reddito (SEL Età < 30 (Persone))
SELECT Nome, Reddito
FROM Persone
WHERE Età < 30;
Si può utilizzare il nome della relazione di riferimento seguito dal punto e dall’attributo che vogliamo
utilizzare per indicare l’appartenenza di quest’ultimo alla specifica tabella.
SELECT Persone.Nome, Persone.Reddito
FROM Persone
WHERE Persone.età < 30
Oppure
SELECT P.Nome as Nome, P.Reddito as Reddito
FROM Persone as P
WHERE P.Età < 30
Per poter vedere i