Interrogazione di una base di dati relazionale Algebra relazionale
Algebra relazionale Linguaggio formale per interrogare una base di dati relazionale: consiste di un insieme di operatori che possono essere applicati a una (operatori unari) o due (operatori binari) istanze di relazione e forniscono un’istanza di relazione Linguaggio procedurale: l’interrogazione consiste in un’espressione in cui compaiono operatori dell’algebra e istanze di relazioni della base di dati
Proiezione Consente di effettuare un “taglio verticale” su una relazione, cioè di selezionare solo alcune colonne (attributi) Si denota con il simbolo : A1,A2,…,Ak(r) seleziona le colonne di r che corrispondono agli attributi A1,A2,…,Ak
Proiezione Query: Nomi dei clienti Nome(Cliente) Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Query: Nomi dei clienti Rossi Bianchi Verdi Nome(Cliente)
Proiezione Query: Nomi e codici dei clienti Nome,C#(Cliente) Cliente Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Query: Nomi e codici dei clienti Rossi C1 C2 Bianchi C3 Verdi C4 Nome,C#(Cliente)
Selezione Consente di effettuare un “taglio orizzontale” su una relazione, cioè di selezionare solo le righe (tuple) che soddisfano una data condizione Si denota con il simbolo : C(r) seleziona le tuple di r che soddisfano la condizione C
Selezione La condizione di selezione è un’espressione booleana (operatori , e ) in cui i termini semplici sono del tipo: AB oppure A’a’ dove: è un operatore di confronto (,,,,) A e B sono due attributi con lo stesso dominio (dom(A)=dom(B)) a è un elemento di dom(A) (adom(A))
Selezione Query: Dati dei clienti che risiedono a Roma Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Query: Dati dei clienti che risiedono a Roma Rossi C1 Roma Bianchi C3 Verdi C4 Città=‘Roma’(Cliente)
Selezione Query: Dati dei clienti che si chiamano Rossi Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Query: Dati dei clienti che si chiamano Rossi e risiedono a Roma Rossi C1 Roma Città=‘Roma’Nome=‘Rossi’(Cliente)
Unione Consente di costruire una relazione contenente tutte le tuple che appartengono ad almeno uno dei due operandi Si denota con il simbolo r1 r2 r1 r2
L’operazione di unione può essere applicata solo a operandi union compatibili cioè tali che: hanno lo stesso numero di attributi gli attributi corrispondenti sono definiti sullo stesso dominio
Differenza (si applica a operandi union compatibili) Consente di costruire una relazione contenente tutte le tuple che appartengono al primo operando e non appartengono al secondo operando Si denota con il simbolo r1 r2 r1 r2
Intersezione (si applica a operandi union compatibili) Consente di costruire una relazione contenente tutte le tuple che appartengono ad entrambi gli operandi Si denota con il simbolo r1 r2= (r1 (r1 r2 )) r1 r2
Prodotto cartesiano Consente di costruire una relazione contenente tutte le tuple che si ottengono concatenando una tupla del primo operando con una tupla del secondo operando Si denota con il simbolo x r1xr2
Query: Dati dei clienti e degli ordini Prodotto cartesiano Ordine C# A# N-pezzi C1 A1 100 C2 A2 200 C3 150 C4 A3 Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Query: Dati dei clienti e degli ordini (Cliente Ordine)
Nome C# Città A# N-pezzi Rossi C1 Roma A1 100 C2 A2 200 C3 150 C4 A3 Milano … Bianchi Verdi
Query: Dati dei clienti e dei loro ordini Cliente. C#=Ordine. C#(Cliente Ordine) Nome C# Città A# N-pezzi Rossi C1 Roma A1 100 A2 200 A3 C2 Milano Bianchi C3 150 Verdi C4
Query: Dati dei clienti e dei loro ordini Nome Cliente.C# Città A# N-pezzi(Cliente.C#=Ordine.C#(Cliente Ordine)) Nome C# Città A# N-pezzi Rossi C1 Roma A1 100 A2 200 A3 C2 Milano Bianchi C3 150 Verdi C4
R1.A1= R2.A1 R1.A2= R2.A2 … R1.Ak= R2.Ak Join naturale Consente di selezionare le tuple del prodotto cartesiano dei due operandi che soddisfano la condizione: R1.A1= R2.A1 R1.A2= R2.A2 … R1.Ak= R2.Ak (dove R1 ed R2 sono i nomi delle relazioni operando e A1,,A2,…, Ak sono gli attributi comuni delle relazioni operando) eliminando le ripetizioni degli attributi r1 r2 = XY(C (r1 x r2 )) dove: C: R1.A1= R2.A1 … R1.Ak= R2.Ak X è l’insieme di attributi di r1 Y è l’insieme di attributi di r2 che non sono attributi di r1
Query: Dati dei clienti e dei loro ordini Join naturale Ordine C# A# N-pezzi C1 A1 100 C2 A2 200 C3 150 C4 A3 Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Query: Dati dei clienti e dei loro ordini Cliente Ordine
Nome C# Città A# N-pezzi Rossi C1 Roma A1 100 A2 200 A3 C2 Milano Bianchi C3 150 Verdi C4
Esempio 1 Query : Nomi dei clienti che hanno ordinato più di 100 pezzi per almeno un articolo Ordine C# A# N-pezzi C1 A1 100 C2 A2 200 C3 150 C4 A3 Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 NomeN-pezzi>100Cliente Ordine
Esempio 1 Cliente Ordine Nome C# Città A# N-pezzi Rossi C1 Roma A1 100 A2 200 A3 C2 Milano Bianchi C3 150 Verdi C4
N-pezzi>100Cliente Ordine Esempio 1 N-pezzi>100Cliente Ordine Nome C# Città A# N-pezzi Rossi C1 Roma A2 200 C2 Milano Bianchi C3 150 Verdi C4 A3
NomeN-pezzi>100Cliente Ordine Esempio 1 NomeN-pezzi>100Cliente Ordine Nome Rossi Bianchi Verdi
Esempio 2 Query : Nomi e città dei clienti che hanno ordinato più di 100 pezzi per almeno un articolo con prezzo superiore a 2 Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Ordine C# A# N-pezzi C1 A1 100 C2 A2 200 C3 150 C4 A3 Articolo A# Denom. Prezzo A1 Piatto 3 A2 Bicchiere 2 A3 Tazza 4 Nome,CittàN-pezzi>100Prezzo>2(Cliente Ordine Articolo)
(Cliente Ordine Articolo Esempio 2 Nome,CittàN-pezzi>100Prezzo>2(Cliente Ordine Articolo) Nome C# Città A# N-pezzi Denom. Prezzo Rossi C1 Roma A1 100 Piatto 3 A2 200 Bicchiere 2 A3 Tazza 4 C2 Milano Bianchi C3 150 Verdi C4 (Cliente Ordine Articolo
N-pezzi>100Prezzo>2(Cliente Ordine Articolo) Esempio 2 Nome,CittàN-pezzi>100Prezzo>2(Cliente Ordine Articolo) Nome C# Città A# N-pezzi Denom. Prezzo Verdi C4 Roma A3 200 Tazza 4 N-pezzi>100Prezzo>2(Cliente Ordine Articolo)
Esempio 2 Nome,CittàN-pezzi>100Prezzo>2(Cliente Ordine Articolo) Nome Città Verdi Roma
Esempio 2 Query : Nomi e città dei clienti che hanno ordinato più di 100 pezzi per almeno un articolo con prezzo superiore a 2 Cliente Nome C# Città Rossi C1 Roma C2 Milano Bianchi C3 Verdi C4 Ordine C# A# N-pezzi C1 A1 100 C2 A2 200 C3 150 C4 A3 Articolo A# Denom. Prezzo A1 Piatto 3 A2 Bicchiere 2 A3 Tazza 4 Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo)))
N-pezzi>100(Ordine) Esempio 2 Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))) C# A# N-pezzi C2 A2 200 C3 150 C4 A3 C1 N-pezzi>100(Ordine)
Cliente N-pezzi>100(Ordine) Esempio 2 Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))) Nome C# Città A# N-pezzi Rossi C1 Roma A2 200 C2 Milano Bianchi C3 150 Verdi C4 A3 Cliente N-pezzi>100(Ordine)
Esempio 2 A#,Prezzo(Articolo) Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))) A# Prezzo A1 3 A2 2 A3 4 A#,Prezzo(Articolo)
Prezzo>2 (A#,Prezzo(Articolo)) Esempio 2 Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))) A# Prezzo A1 3 A3 4 Prezzo>2 (A#,Prezzo(Articolo))
Esempio 2 Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))) Nome C# Città A# N-pezzi Prezzo Verdi C4 Roma A3 200 4 (Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))
Esempio 2 Nome,Città ((Cliente N-pezzi>100(Ordine)) Prezzo>2 (A#,Prezzo(Articolo))) Nome Città Verdi Roma
-join Consente di selezionare le tuple del prodotto cartesiano dei due operandi che soddisfano una condizione del tipo AB dove è un operatore di confronto (,,,,), A è un attributo dello schema del primo operando, B è un attributo dello schema del secondo operando e dom(A)=dom(B) r1 r2 = AB (r1 x r2 )