Algebra Relazionale Concetti Fondamentali Introduzione La Base di Dati di Esempio Algebra Relazionale selezione, proiezione prodotto cartesiano, join unione, intersezione, differenza ridenominazioni Forma Standard 2 SQL Linguaggio di Definizione (DDL) Creare la base di dati e le tabelle (schema) Linguaggio di Controllo (DCL) Creare utenti e autorizzazioni Linguaggio di Manipolazione (DML) Inserire, cancellare, modificare le ennuple Interrogare la base di dati DDL, DCL concettualmente semplici DML aggiornamenti: concettualmente semplice interrogazioni: complesso Lavorare con oggetti inconsueti le tabelle algebra su tabelle; analogo: algebra sui reali 4
Algebra per Tabelle insieme di operatori che applicati a tabelle restituiscono tabelle; analogo: y+, x-2 espressioni; analogo: z=(y+)-2 sintassi astratta; analogo: semantica operazionale astratta analogo: somme per addizioni di unità W = x y Professori codice,, qualifica, facoltà numeri di telefono Studenti matricola,, tipo di corso (ciclo): laurea tr., laurea spec. relatore della tesi Corsi codice, titolo, docente, ciclo Esami studente, voto, lode, corso Tutorato Studentesco studente tutore, studente tutorato 5 6 TABLE Professori ( cod char(4) PRIMARY KEY, cog varchar(20) NOT NULL, varchar(20) NOT NULL, qualifica char(5), facolta char(0) ); TABLE Studenti ( matr integer PRIMARY KEY, cog varchar(20) NOT NULL, varchar(20) NOT NULL, ciclo char(20), anno integer, relatore char(4) REFERENCES Professori(cod) ); TABLE Corsi ( cod char() PRIMARY KEY, titolo varchar(20) NOT NULL, TABLE Numeri ( ciclo char(20), docente char(4) REFERENCES Professori(cod) ); TABLE Tutorato ( studente integer REFERENCES Studenti(matr), tutor integer REFERENCES Studenti(matr), PRIMARY KEY (studente,tutor)); TABLE Esami ( studente integer REFERENCES Studenti(matr) ON DELETE cascade ON UPDATE cascade, corso char() REFERENCES Corsi(cod), voto integer, lode bool, CHECK (voto>=8 and voto<=0), CHECK (not lode or voto=0), PRIMARY KEY (studente, corso)); professore char(4) REFERENCES Professori(cod), numero char(9), PRIMARY KEY (professore,numero)); Algebra Relazionale >> Concetti Fondamentali >> La Base di Dati di Esempio Professori Studenti Corsi cod cog matr cog cod PR titolo Programmazione I ASD Algoritmi e Str. Dati IN Informatica Teorica qualifica facolta ordinario Ingegneria associato Scienze supplente ciclo anno relatore 2 ciclo docente 7 8 2
Algebra Relazionale >> Concetti Fondamentali >> La Base di Dati di Esempio Tutorato studente tutor Numeri professore numero 09720545 Esami studente corso PR ASD IN voto 27 0 24 VC lode false true false 472456 097205227 0972056 82456 Nota nella base di dati vengono utilizzati ripetutamente codici alfanumerici leggibilità dell esempio (es:, PR ) in generale è meglio adottare come chiavi primarie codici interi maggiore compattezza e migliori prestazioni PR 2 false ASD 20 false ASD 28 false PR 0 false IN 0 true 9 0 Collezione di operatori applicati a tabelle che producono tabelle Espressioni composizione di operatori applicati a tabelle Assegnazioni consentono di assegnare ad un nuova tabella il risultato di un espressione Attenzione lavoreremo con due tipi di tabelle Tabelle originali della base di dati con schema completo di vincoli Tabelle temporanee risultato di interrogazioni dell algebra per queste tabelle non viene definito uno schema vero e proprio ereditano parte dello schema (attributi e tipi) dall interrogazione di cui sono il risultato 2
Operatori principali selezione proiezione prodotto cartesiano e join unione, intersezione e differenza ridenominazione Funzione serve per selezionare alcune delle ennuple di una tabella scartando le altre sulla base di una condizione Esempio Estrarre dalla base di dati una tabella, StudentiTriennio, contenente i dati degli studenti della laurea triennale 4 Studenti matr cog ciclo anno 2 relatore Operatore unario ( monadico ) condizione sui valori degli attributi Condizione: espressione booleana operandi: valori degli attributi della tabella operatori di confronto, operatori booleani condizione: Studenti.ciclo= StudentiTriennio matr cog ciclo anno relatore Sintassi: s (R) condizione 2 StudentiTriennio = s (Studenti) ciclo= 5 6 4
Studenti matr cog ciclo anno relatore 2 condizione: ciclo= AND anno > Schema del risultato attributi e tipi della tabella originale Istanza del risultato ennuple della tabella i cui valori soddisfano la condizione cardinalità minore o uguale rispetto alla tabella originale Risultato matr cog ciclo anno relatore 2 Risultato = s (Studenti) ciclo= AND anno> 7 8 Nota sullo schema si tratta di una tabella temporanea i nomi (e i tipi) degli attributi sono ereditati dalle tabelle della base di dati Funzione estrarre alcune delle colonne di una tabella Esempio Estrarre l elenco dei nomi e i cognomi degli studenti TABLE StudentiTriennio ( TABLE StudentiTriennio ( Studenti.matr integer, matr integer, Studenti.cog varchar(20), Studenti.cog varchar(20), Studenti. varchar(20), Studenti. varchar(20), Studenti.ciclo char(20), Studenti.ciclo char(20), Studenti.anno integer, anno integer, Studenti.relatore char(4)); relatore char(4)); TABLE ElencoNomi ( Studenti.cog varchar(20), Studenti. varchar(20), ); 9 20 5
Studenti matr cog ciclo anno 2 relatore Operatore unario lista di attributi della tabella Sintassi ElencoNomi cog p (R) lista attributi ElencoNomi = p (Studenti) cog, 2 22 Schema del risultato attributi dello schema originale su cui si effettua la proiezione Istanza del risultato restrizione ( proiezione ) delle ennuple originali agli attributi specificati ATTENZIONE se nel risultato non sopravvivono chiavi dello schema originale possono esserci duplicati Studenti matr Risultato cog anno 2 cog ciclo anno 2 relatore Risultato = p (Studenti) cog, anno ennuple identiche (duplicati) NOTA: ulteriori duplicati se Risultato = p (Studenti) cog 2 24 6
Finora operatori unari lavorano sui dati di un unica tabella In realtà è nella natura del modello relazionale frammentare i dati tra le tabelle molto spesso è necessario correlare dati provenienti da tabelle diverse è possibile utilizzare il prodotto cartesiano Esempio Generare la tabella ProfessoriENumeri contenente nomi, cognomi e numeri dei prof. TABLE Professori ( cod char(4) PRIMARY KEY, cog varchar(20) NOT NULL, varchar(20) NOT NULL, qualifica char(5), facolta char(0) ); TABLE Numeri ( professore char(4) REFERENCES Professori(cod), numero char(9), PRIMARY KEY (professore,numero)); TABLE ProfessoriENumeri ( Professori.cog varchar(20), Professori. varchar(20), numero char(9)); 25 26 Professori Numeri professore numero 09720545 cod cog qualifica facolta 472456 ordinario Ingegneria VC 097205227 associato Scienze 0972056 supplente 82456 I Passo: Prodotto Cartesiano TabellaA = Professori X Numeri cod cog qualifica facolta professore numero ordinario Ingegneria 09720545 ordinario Ingegneria 472456 ordinario Ingegneria VC 097205227 ordinario Ingegneria 0972056 ordinario Ingegneria 82456 associato Scienze 09720545 associato Scienze 472456 supplente 82456 27 cod cog qualifica facolta professore ordinario Ingegneria ordinario Ingegneria ordinario Ingegneria VC ordinario Ingegneria ordinario Ingegneria associato Scienze supplente II Passo: Selezione TabellaB = s cod=professore (TabellaA) cod cog qualifica facolta professore ordinario Ingegneria ordinario Ingegneria associato Scienze VC supplente supplente TabellaA numero 09720545 472456 097205227 0972056 82456 09720545 82456 numero 09720545 472456 097205227 0972056 82456 28 7
Tabella B cod cog qualifica facolta professore numero In sintesi ordinario Ingegneria 09720545 ordinario Ingegneria 472456 associato Scienze VC 097205227 supplente 0972056 supplente 82456 III Passo: Proiezione ProfessoriENumeri = p cog,,numero (TabellaB) TabellaA = Professori X Numeri s TabellaB = (TabellaA) cod=professore ProfessoriENumeri = p (TabellaB) cog,, numero cog numero 09720545 472456 097205227 0972056 82456 ProfessoriENumeri = p ( cog,, numero s ( cod=professore Professori X Numeri )) 29 0 Operatore binario ( diadico ) è il primo operatore che consente di mettere assieme dati provenienti da tabelle diverse Sintassi R X S Schema del risultato unione degli attributi (e relativi tipi) Istanza del risultato tutte le ennuple ottenute concatenando ennuple delle due tabelle indiscriminatamente (in tutti i modi possibili) cardinalità pari al prodotto delle cardinalità 2 8
Prodotto cartesiano consente di correlare dati di tabelle diverse ma genera risultati di grandi dimensioni (es: tabelle di 000 ennuple > mil. di ennuple) su cui poi bisogna effettuare una selezione Sarebbe opportuno avere un operatore che consente di fare la correlazione verificando contestualmente la condizione Professori Numeri professore numero 09720545 cod cog qualifica facolta 472456 ordinario Ingegneria VC 097205227 VC associato Scienze 0972056 supplente 82456 I Passo: Join TabellaA = Professori cod=professore Numeri cod cog qualifica facolta professore numero ordinario Ingegneria 09720545 VC ordinario Ingegneria 472456 associato Scienze VC 097205227 supplente 0972056 supplente 82456 4 Tabella A cod cog qualifica facolta professore numero In sintesi ordinario Ingegneria 09720545 ordinario Ingegneria 472456 associato Scienze VC 097205227 supplente 0972056 supplente 82456 II Passo: Proiezione ProfessoriENumeri=pcog,,numero (TabellaA ) TabellaA = Professori ProfessoriENumeri = p cod=professore Numeri (TabellaA ) cog,, numero cog numero 09720545 472456 097205227 ProfessoriENumeri = p ( cog,, numero Professori cod=professore Numeri) 0972056 82456 5 6 9
Operatore binario ( diadico ) Sintassi R condizione S Condizione AND di condizioni semplici attributo di R = attributo di S i due attributi devono essere dello stesso tipo Schema del risultato unione degli attributi e relativi tipi Istanza del risultato: ennuple ottenute concatenando ennuple di R ed ennuple di S, tali che soddisfano la condizione Equivalente a prodotto cartesiano e selezione: R condizione S = s condizione (R X S) Attenzione: semantica operazionale diversa 7 8 Esempio Matricola e cog degli studenti che hanno sostenuto l esame di informatica teorica Richiede di correlare tre tabelle matricola di Studenti e studente di Esami cod di Corso e corso di Esami Due condizioni di join TABLE Studenti ( TABLE Esami ( matr integer PRIMARY KEY, studente integer cog varchar(20) NOT NULL, REFERENCES Studenti(matr) varchar(20) NOT NULL, corso char() ciclo char(20), REFERENCES Corsi(cod), anno integer, voto integer, relatore char(4) lode bool, REFERENCES Professori(cod)); PRIMARY KEY (studente, corso)); StudentiEsami = Studenti matr=studente Esami TABLE StudentiEsami ( matr integer, cog varchar(20), varchar(20), ciclo char(20), anno integer, relatore char(4) studente integer, corso char(), voto integer, lode bool); 9 40 0
TABLE StudentiEsami ( matr integer, cog varchar(20), varchar(20), Studenti.ciclo char(20), anno integer, relatore char(4) studente integer, corso char(), voto integer, lode bool); StudentiEsamiCorsi = StudentiEsami corso=cod Corso TABLE Corsi ( cod char() PRIMARY KEY, titolo varchar(20) NOT NULL, ciclo char(20), docente char(4) REFERENCES Professori(cod)); TABLE StudentiEsamiCorsi ( matr integer, cog varchar(20), varchar(20), Studenti.ciclo char(20), anno integer, relatore char(4) studente integer, corso char(), voto integer, lode bool cod char(), titolo varchar(20), Corso.ciclo char(20), docente char(4)); 4 StudentiEsamiCorsi matr cog studente corso voto cod titolo PR 27 PR Progr... ASD 0 ASD Algorit IN 24 IN Inform PR 2 PR Progr ASD 20 ASD Algorit ASD 28 ASD Algorit PR 0 PR Progr IN 0 IN Inform dalla tabella Studenti dalla tabella Esami dalla tabella Corsi Risultato = p matricola, cog (s titolo= Inform. t. (StudentiEsamiCorsi)) Risultato matr cog 42 StudentiEsami = Studenti StudentiEsamiCorsi = StudentiEsami cod=corso Corsi StudentiEsamiCorsi = (Studenti matr=studente Esami) cod=corso Corsi il join è associativo matr=studente Esami StudentiEsamiCorsi = Studenti matr=studente (Esami cod=corso Corsi) StudentiEsamiCorsi = Studenti matr=studente Esami cod=corso Corsi In sintesi: StudentiEsami = Studenti matr=studente Esami StudentiEsamiCorsi = StudentiEsami cod=corso Corsi Risultato = p matricola, cog ( s titolo= Inform. t. (StudentiEsamiCorsi)) Risultato = p matricola, cog ( s titolo= Inform. t. ( Studenti matr=studente Esami cod=corso Corsi )) 4 44
Finora abbiamo visto gli operatori fondamentali Unari selezione, s condizione (R) proiezione, p attributi (R) Binari prodotto cartesiano, R x S Altri operatori importanti Operatori insiemistici unione intersezione differenza Ridenominazione meno importante (ha solo funzioni di leggibilità) join, R condizione S 46 45 Funzione le tabelle sono collezioni di ennuple è possibile applicare le operazioni consuete sulle collezioni unione intersezione differenza Esempio Cog e di tutte le persone TABLE Professori ( cod char(4) PRIMARY KEY, Professori.cog varchar(20) NOT NULL, Professori. varchar(20) NOT NULL, qualifica char(5), facolta char(0) ); TABLE Persone ( cog varchar(20), TABLE Studenti ( varchar(20)); matr integer PRIMARY KEY, Studenti.cog varchar(20) NOT NULL, Studenti. varchar(20) NOT NULL, ciclo char(20), anno integer, relatore char(4) REFERENCES Professori(cod)); 47 48 2
Professori cod cog NomiProfessori = p cog, (Professori) qualifica facolta cog ordinario Ingegneria NomiProfessori cog Persone = NomiProfessori U NomiStudenti associato Scienze cog supplente Studenti NomiStudenti = p cog, (Studenti) NomiStudenti matr cog ciclo anno relatore cog cog 2 49 50 Operatori binari Sintassi stessi simboli delle operazioni convenzionali su insiemi Unione: R U S Intersezione: R S Si applicano solo in alcuni casi le tabelle R ed S devono avere lo stesso numero di attributi associazione posizionale: gli attributi devono avere ordinatamente lo stesso tipo Schema del risultato eredita i nomi degli attributi dalla prima tabella Differenza: R S 5 52
Istanza del risultato unione, intersezione o differenza delle ennuple Attenzione semantica della differenza: tutti gli elementi del primo membro che non appartengono al secondo esempio: {,, 5} {, 7, 9} = {, 5} Attenzione dal risultato degli operatori insiemistici vengono eliminati eventuali duplicati passo finale di eliminazione degli eventuali duplicati prodotti Motivazioni semantica più naturale esistono implementazioni efficienti 5 54 Esempio cog Persone = NomiProfessori U NomiStudenti In sintesi: NomiProfessori cog NomiProfessori = p cog, (Professori) NomiStudenti = p cog, (Studenti) NomiStudenti cog Persone = NomiProfessori U NomiStudenti Persone = p cog, (Professori) U p cog, (Studenti) 55 56 4
Nota sulla base della semantica è possibile anche StranaTabella = p, cog (Professori) U p cog, (Studenti) Alex cog Funzione consente di cambiare i nomi degli attributi in una tabella temporanea es: cogpersona, Persona Caratteristiche agisce solo sullo schema non cambia né la cardinalità, né il n. di attributi normalmente si applica solo sul risultato finale (funzione puramente cosmetica ) 57 58 Sintassi r ridenominazioni (R) ridenominazioni: elenco di coppie vecchionome AS nuovonome separate da virgole vecchionome deve essere un attributo di R Semantica nello schema del risultato ai vecchi nomi sono sostituiti i nuovi In definitiva: Persone = r cog AS cogpersona, AS Persona ( p cog, (Professori)) U p cog, (Studenti) TABLE Persone ( cogpersona varchar(20), Persona varchar(20)); 59 60 5
Interrogazioni in algebra relazionale risultato dell applicazione di vari operatori è possibile applicare gli operatori in ordine vario (es: prima selezioni o prima ridenominaz.) Forma standard nel seguito viene presentata una strategia sistematica per la scrittura di interrogazioni ordine standardizzato di applicazione degli operatori dell algebra Esempio Nome e Cog dei professori ordinari che non hanno tesisti della laurea triennale Strategia (a) trovo e cog di tutti i professori ordinari (b) trovo e cog dei professori che hanno tesisti della laurea triennale faccio la differenza tra (a) e (b) 6 62 Professori cod cog qualifica facolta Professori cod cog qualifica ordinario facolta Ingegneria ordinario Ingegneria associato Scienze associato Scienze supplente supplente ProfessoriOrdinari = s qualifica = Ordinario (Professori) Studenti matr cog ciclo anno relatore cod cog qualifica facolta 2 ordinario Ingegneria NomiOrdinari = r cog AS cogprof, AS Prof ( p cog, (ProfessoriOrdinari)) cogprof Prof ProfessoriConTesisti = Studenti relatore = cod Professori 6 64 6
matr ProfessoriConTesisti = Studenti S.cog S. ciclo anno relatore relatore = cod Professori P.cog P. qualif ica ordinario ordinario associato f acolta Ing. Ing. Sc. NomiOrdinari = r cog AS cogprof, AS Prof ( p cog, ( s qualifica = Ordinario ( Professori)) cogprof Prof matr ProfessoriConTesiTriennali = s ciclo = (ProfessoriConTesisti) S.cog S. ciclo NomiProfConTesiTriennali = r cog AS cogprof, AS Prof ( p Professori.cog, Professori. (ProfessoriConTesiTriennali)) cogprof anno relatore Prof P.cog P. qualif ica ordinario f acolta Ing. NomiProfConTesiTriennali = r cog AS cogprof, AS Prof ( p cog, ( s ciclo = ( cogprof Studenti relatore = cod Professori ))) Risultato = NomiOrdinari NomiProfConTesiTriennali cogprof Prof Prof 65 66 sottointerrogazione n. operatore insiemistico sottointerrogazione n. 2 Risultato = r cog AS cogprof, AS Prof ( p cog, ( s qualifica = Ordinario ( Professori)) r cog AS cogprof, AS Prof ( p cog, ( s ciclo = ( Studenti relatore = cod Professori )) Varie sottointerrogazioni (una o più) correlate con operatori insiemistici Ciascuna sottointerrogazione prima: eventuali join o prodotti cartesiani poi: eventuali selezioni poi: eventuali proiezioni infine: eventuali ridenominazioni ridenominazioni proiezioni selezioni join 67 68 7