ALGEBRA RELAZIONALE Linguaggi per basi di dati • I linguaggi per la interazione con DBMS sono una componente fondamentale per le basi dati (sino ad ora abbiamo solo visto SQL): • operazioni sullo schema • DDL: data definition language • operazioni sui dati • DML: data manipulation language • interrogazione ("query") • aggiornamento (inserimento, cancellazione, modifica) 2 1 Linguaggi di interrogazione per basi di dati • In base a come si specifica una interrogazione, i Data Manipulation Languages si dividono in: • Dichiarativi specificano le proprietà del risultato ("che cosa") • Procedurali specificano le modalità di generazione del risultato ("come") 3 Linguaggi di interrogazione per il modello relazionale • Algebra relazionale: procedurale • Calcolo relazionale: dichiarativo (teorico) • SQL (Structured Query Language): parzialmente dichiarativo (reale) • QBE (Query by Example): dichiarativo (reale) 4 2 Algebra relazionale • Costituito da un insieme di operatori definiti su relazioni e che producono relazioni come risultati • Gli operatori possono essere composti in cascata per formulare interrogazioni complesse 5 Operatori dell'algebra relazionale • Unione, intersezione, differenza (operatori insiemistici) • Ridenominazione, selezione, proiezione (operatori monadici, agiscono su una sola relazione) • Join: join naturale, prodotto cartesiano, theta-join (operatori su due o più relazioni) 6 3 Operatori insiemistici • Dato che le istanze di relazioni sono insiemi ha senso considerare gli operatori definiti per gli insiemi • Tuttavia una relazione nel modello relazionale differisce da una generica relazione insiemistica per la presenza dello schema • Per evitare risultati non coerenti, l’applicazione degli operatori unione, intersezione, differenza deve essere limitata a relazioni definite sugli stessi attributi 7 Unione • L’unione tra due relazioni R1 ed R2 definite sullo stesso insieme di attributi X è indicata con R1 ∪ R2 ed è una relazione su X contenente le n-uple che appartengono ad R1 o ad R2 o ad entrambe 8 4 Unione • Siccome in una relazione non possono esserci due n-uple uguali, le n-uple che sono presenti in entrambe le relazioni di partenza vengono rappresentate una sola volta nell’unione 9 Unione Laureati Quadri Matricola Nome 7274 Rossi 7432 Neri 9824 Verdi Età 42 54 45 Matricola Nome 9297 Neri 7432 Neri 9824 Verdi Età 33 54 45 Laureati ∪ Quadri Matricola Nome 7274 Rossi 7432 Neri 9824 Verdi 9297 Neri Età 42 54 45 33 10 5 Unione • Grado? • Cardinalità? Grado: inalterato MAX(#(R1),#(R2)) ≤ #(R1 ∪ R2) ≤ #(R1) + #(R2) 11 Intersezione • L’intersezione tra due relazioni R1 ed R2 definite sullo stesso insieme di attributi X è indicata con R1 ∩ R2 ed è una relazione su X contenente le n-uple che appartengono sia ad R1 che ad R2 12 6 Intersezione Laureati Quadri Matricola Nome 7274 Rossi 7432 Neri 9824 Verdi Età 42 54 45 Matricola Nome 9297 Neri 7432 Neri 9824 Verdi Età 33 54 45 Laureati ∩ Quadri Matricola Nome 7432 Neri 9824 Verdi Età 54 45 13 Intersezione • Grado? • Cardinalità? Grado: inalterato 0 ≤ #(R1 ∩ R2) ≤ MIN(#(R1),#(R2)) 14 7 Differenza • La differenza tra una relazione R1 ed una relazione R2 definite sullo stesso insieme di attributi X è indicata con R1 - R2 ed è una relazione su X contenente le n-uple di R1 che non appartengono ad R2 • La differenza NON È commutativa 15 Differenza Laureati Quadri Matricola Nome 7274 Rossi 7432 Neri 9824 Verdi Età 42 54 45 Matricola Nome 9297 Neri 7432 Neri 9824 Verdi Età 33 54 45 Laureati – Quadri Matricola Nome 7274 Rossi 7432 Neri 9824 Verdi Età 42 54 45 16 8 Differenza • Grado? • Cardinalità? Grado: inalterato 0 ≤ #(R1 - R2) ≤ #(R1) 17 Operatori insiemistici e schemi • Come applicare operatori insiemistici tra relazioni definite su schemi diversi? Paternità Maternità Padre Adamo Adamo Abramo Figlio Abele Caino Isacco Madre Eva Eva Sara Paternità ∪ Maternità ?? Figlio Abele Set Isacco 18 9 Ridenominazione • operatore monadico (con un argomento) • "modifica lo schema" di una relazione cambiando il nome di uno o più attributi e lasciando inalterata l'istanza • Data una relazione R definita su un insieme di attributi X la ridenominazione di A⊆X in A’ si indica con: RENA’←A(R) 19 Paternità Padre Adamo Adamo Abramo Figlio Abele Caino Isacco RENGenitore ← Padre (Paternità) Genitore Padre Figlio Adamo Abele Adamo Caino Abramo Isacco 20 10 RENGenitore ← Padre (Paternità) Paternità Padre Adamo Adamo Abramo Figlio Abele Caino Isacco RENGenitore ← Madre (Maternità) Maternità Madre Eva Eva Sara Genitore Figlio Adamo Abele Adamo Caino Abramo Isacco Figlio Abele Set Isacco Genitore Figlio Eva Abele Eva Set Sara Isacco 21 RENGenitore ← Padre (Paternità) Genitore Figlio Adamo Abele Adamo Caino Abramo Isacco RENGenitore ← Padre (Paternità) ∪ RENGenitore ← Madre (Maternità) RENGenitore ← Madre (Maternità) Genitore Figlio Eva Abele Eva Set Sara Isacco Genitore Figlio Adamo Abele Adamo Caino Abramo Isacco Eva Abele Eva Set Sara Isacco 22 11 Impiegati Cognome Ufficio Stipendio Rossi Neri Operai Roma Milano Cognome Fabbrica Bruni Monza Verdi Latina 55 64 Salario 45 55 REN Sede, Retribuzione ← Ufficio, Stipendio (Impiegati) ∪ REN Sede, Retribuzione ← Fabbrica, Salario (Operai) Cognome Rossi Neri Bruni Verdi Sede Retribuzione Roma 55 Milano 64 Monza 45 Latina 55 23 Ridenominazione • Grado? • Cardinalità? Grado: inalterato Cardinalità: inalterata 24 12 Ridenominazione • Vincoli: • Non si può assegnare ad un attributo un nome che compare già come nome di un attributo della relazione 25 Selezione • operatore monadico • produce un risultato che: • ha lo stesso schema dell'operando • contiene un sottoinsieme delle ennuple dell'operando: quelle che soddisfano una condizione si selezione 26 13 Selezione • Una condizione di selezione su un insieme di attributi X è una formula proposizionale su X ottenuta combinando con i connettivi logici AND(∨), OR(∧) e NOT(¬) condizioni atomiche del tipo AχB o Aχc dove: • χ è un operatore di confronto (=,<,>,…) • A e B sono attributi di X su cui χ abbia senso • c è una costante compatibile con il dominio di A 27 Selezione, sintassi e semantica • sintassi SEL Condizione (Operando) • Condizione: espressione booleana (come quelle dei vincoli di ennupla) • semantica • il risultato contiene le ennuple dell'operando che soddisfano la condizione 28 14 Impiegati Matricola Cognome Filiale Stipendio 7309 Rossi Roma 55 5998 Neri Milano 64 9553 Milano Milano 44 5698 Neri Napoli 64 • impiegati che • guadagnano più di 50 • guadagnano più di 50 e lavorano a Milano • hanno lo stesso cognome della filiale presso cui lavorano 29 • impiegati che guadagnano più di 50 Impiegati Matricola Cognome Filiale Stipendio 7309 Rossi Roma 55 5998 Neri Milano 64 9553 5698 Milano Neri Milano Napoli 44 64 5698 Neri Napoli 64 SELStipendio > 50 (Impiegati) 30 15 • impiegati che guadagnano più di 50 e lavorano a Milano Impiegati Matricola Cognome Filiale Stipendio 7309 5998 Rossi Neri Milano Roma 55 64 5998 Neri Milano 64 9553 Milano Milano 44 5698 Neri Napoli 64 SELStipendio > 50 AND Filiale = 'Milano' (Impiegati) 31 • impiegati che hanno lo stesso nome della filiale presso cui lavorano Impiegati Matricola Cognome Filiale Stipendio 7309 9553 Milano Rossi Milano Roma 55 44 5998 Neri Milano 64 9553 Milano Milano 44 5698 Neri Napoli 64 SEL Cognome = Filiale(Impiegati) 32 16 Selezione • Grado? • Cardinalità? Grado: inalterato 0 ≤ #( SELF(R) ) ≤ #(R) 33 Selezione con valori nulli Impiegati Matricola Cognome Filiale 7309 Rossi Roma 5998 Neri Milano 9553 Bruni Milano Età 32 45 NULL SEL Età > 40 (Impiegati) • la formula proposizionale è FALSA per quelle n-ple in cui qualcuno degli 34 attributi coinvolti ha valore nullo 17 Un risultato non desiderabile ∪ SEL Età≤30 (Persone) ≠ Persone SEL Età>30 (Persone) • Perché? Perché le selezioni vengono valutate separatamente! • Ma anche SEL Età>30 ∨ Età≤30 (Persone) ≠ Persone • Perché? Perché anche le condizioni atomiche vengono valutate separatamente! 35 SEL Età > 40 (Impiegati) • la condizione atomica è vera solo per valori non nulli • per riferirsi ai valori nulli esistono forme apposite di condizioni: IS NULL IS NOT NULL • Una soluzione alternativa è ricorrere all’uso di una "logica a tre valori" (vero, falso, sconosciuto) 36 18 • A questo punto: SEL Età>30 (Persone) ∪ SEL Età≤30 (Persone) (Persone) = SEL Età>30 ∨ Età≤30 ∨ Età IS NULL (Persone) = Persone ∪ SEL Età IS NULL 37 Impiegati Matricola Cognome Filiale 7309 5998 Rossi Neri Milano Roma 5998 9553 Bruni Neri Milano 9553 Bruni Milano Età 32 45 NULL 45 NULL SEL (Età > 40) OR (Età IS NULL) (Impiegati) 38 19 Selezione e proiezione • operatori "ortogonali" • selezione: • decomposizione orizzontale • proiezione: • decomposizione verticale 39 selezione proiezione 40 20 Proiezione • operatore monadico • produce un risultato che • È definito su un sottoinsieme Y degli attributi dell'operando • contiene n-uple ottenute considerando i valori su Y delle n-uple dell'operando 41 Proiezione, sintassi e semantica • Data una relazione R(X) ed un insieme Y⊂X la proiezione di R su Y si indica con PROJY(R) ed è una relazione R’ definita su Y e contenente le n-ple di R considerandone solo i valori su Y: PROJY(R) = {t[Y] | t∈R} 42 21 Impiegati Matricola Cognome Filiale Stipendio 7309 Neri Napoli 55 5998 Neri Milano 64 9553 Rossi Roma 44 5698 Rossi Roma 64 • per tutti gli impiegati: • matricola e cognome • cognome e filiale 43 • matricola e cognome di tutti gli impiegati Matricola Cognome Filiale Stipendio 7309 Neri Napoli 55 5998 Neri Milano 64 9553 Rossi Roma 44 5698 Rossi Roma 64 PROJ Matricola, Cognome (Impiegati) 44 22 Proiezione • Grado? • Cardinalità? 1 ≤ Grado(PROJY(R)) ≤ Grado(R) 1 ≤ #( PROJY(R) ) ≤ #(R) 45 • cognome e filiale di tutti gli impiegati Matricola Cognome Filiale Stipendio 7309 Neri Napoli 55 5998 Neri Milano 64 9553 Rossi Roma 44 5698 Rossi Roma 64 PROJ Cognome, Filiale (Impiegati) 46 23 Cardinalità delle proiezioni • una proiezione • contiene al più tante ennuple quante l'operando • può contenerne di meno • se X è una superchiave di R, allora PROJX(R) contiene esattamente tante ennuple quante R 47 Selezione e proiezione • Combinando selezione e proiezione, possiamo estrarre interessanti informazioni da una relazione 48 24 • matricola e cognome degli impiegati che guadagnano più di 50 Matricola Cognome Filiale Stipendio 7309 Rossi Roma 55 5998 Neri Milano 64 9553 5698 Milano Neri Milano Napoli 44 64 5698 Neri Napoli 64 PROJMatricola,Cognome (SELStipendio > 50 (Impiegati) ) 49 Join • Combinando selezione e proiezione, possiamo estrarre informazioni da una relazione • Non possiamo però correlare informazioni presenti in relazioni diverse • Il JOIN è l'operatore dell'algebra relazionale che permette di correlare dati in relazioni diverse 50 25 Join • Quali esami ha superato Maria Rossi e con quale votazione? studenti Matricola Cognome 6554 Rossi 8765 Neri 9283 Verdi 3456 Rossi esami Matricola 3456 3456 9283 6554 Nome Mario Paolo Luisa Maria Data di nascita 05/12/1978 03/11/1976 12/11/1979 01/02/1978 Voto 30 24 28 26 Corso Analisi I Chimica Analisi I Fisica 51 Join naturale • operatore binario (generalizzabile) • produce una relazione le cui righe sono ottenute concatenando le tuple degli operandi sulla base di valori uguali in attributi con lo stesso nome • Il risultato del JOIN è definito sull'unione degli attributi degli operandi 52 26 Impiegato Reparto Rossi A Neri B Bianchi B Reparto A B Impiegato Reparto Rossi A Neri B Bianchi B Capo Mori Bruni Capo Mori Bruni Bruni 53 Join, sintassi e semantica • R1(X1), R2(X2) • R1 JOIN R2 è una relazione su X1∪X2 R1 JOIN R2 = { t su X1 ∪ X2 | ∃ t1∈R1e t2∈R2 con t[X1] =t1 e t[X2] =t2 } 54 27 JOIN Completo • Se ogni n-pla delle due relazioni contribuisce al risultato il JOIN si dice completo • Altrimenti il join è non competo 55 Un join non completo Impiegato Reparto Rossi A Neri B Bianchi B Reparto B C Impiegato Reparto Neri B Bianchi B Capo Mori Bruni Capo Mori Mori 56 28 JOIN vuoto • Un caso particolare del JOIN non completo è il JOIN vuoto che dà come risultato la relazione vuota 57 Un join vuoto Impiegato Reparto Rossi A Neri B Bianchi B Reparto D C Impiegato Reparto Capo Mori Bruni Capo 58 29 JOIN completo • Il JOIN è completo se ogni n-upla delle due relazioni si combina con ALMENO UNA nupla dell’altra relazione • Un caso particolare di JOIN completo è quello in cui ogni n-upla delle due relazioni si combina con TUTTE le n-uple dell’altra relazione 59 Un join completo, con n x m ennuple Impiegato Reparto Rossi A B Neri B Reparto A B B Impiegato Reparto Rossi B Rossi B Neri B Bianchi B Capo Mori Bruni Capo Mori Bruni Mori Bruni 60 30 Cardinalità del JOIN • Il join di R1 e R2 contiene un numero di nple compreso fra zero e il prodotto di |R1| e |R2| • Il fatto che il JOIN sia completo non significa che |R1 JOIN R2| = |R1|*|R2| 61 Cardinalità del JOIN • se il join coinvolge una chiave di R2, allora … il numero di n-ple è compreso fra zero e |R1| perché ciascuna n-upla della prima relazione potrà combinarsi al più con una sola n-upla della seconda • se il join coinvolge una chiave di R2 e un vincolo di integrità referenziale tra la chiave di R2 ed R1, allora … il numero di n-ple è pari a |R1| perché oltre a valere la condizione precedente, ciascuna n-upla della prima relazione dovrà combinarsi R2 R1 almeno con una n-upla della seconda X X 62 31 Cardinalità del join, esempi R1(A,B) JOIN R2 (B,C) • in generale 0 ≤ |R1 JOIN R2| ≤ |R1| × |R2| • se B è chiave in R2 0 ≤ |R1 JOIN R2| ≤ |R1| • se B è chiave in R2 ed esiste vincolo di integrità referenziale fra B in R1 e R2: |R1 JOIN R2| = |R1| 63 Proprietà del JOIN • Il JOIN naturale soddisfa le proprietà: • Commutativa: R1 JOIN R2 = R2 JOIN R1 • Associativa: R1 JOIN R2 JOIN R3 = (R1 JOIN R2) JOIN R3 = R1 JOIN (R2 JOIN R3) 64 32 Join, una difficoltà Impiegato Reparto Rossi A Neri B Bianchi B Reparto B C Capo Mori Bruni Impiegato Reparto Capo Neri B Mori Bianchi B Mori • Se il JOIN non è completo alcune n-ple non contribuiscono al risultato: l’informazione nel risultato non contiene alcune delle informazioni 65 negli operandi Join esterno • Il join esterno estende, con valori nulli, le ennuple che verrebbero tagliate fuori da un join (interno) • esiste in tre versioni: • sinistro, destro, completo 66 33 Join esterno • sinistro: mantiene tutte le ennuple del primo operando, estendendole con valori nulli, se necessario • destro: ... del secondo operando ... • completo: … di entrambi gli operandi ... 67 Impiegati Impiegato Reparto Rossi A Neri B Bianchi B Reparti Reparto B C Capo Mori Bruni Impiegati JOINLEFT Reparti Impiegato Reparto Neri B Bianchi B Rossi A Capo Mori Mori NULL 68 34 Impiegati Impiegato Reparto Rossi A Neri B Bianchi B Reparti Reparto B C Capo Mori Bruni Impiegati JOINRIGHT Reparti Impiegato Reparto Neri B Bianchi B NULL C Capo Mori Mori Bruni 69 Impiegati Impiegato Reparto Rossi A Neri B Bianchi B Reparti Reparto B C Capo Mori Bruni Impiegati JOINFULL Reparti Impiegato Reparto Neri B Bianchi B Rossi A NULL C Capo Mori Mori NULL Bruni 70 35 Cardinalità JOIN esterno • La cardinalità minima, da 0 diventa: • |R1| per il LEFT join • |R2| per il RIGHT join • MAX(|R1|, |R2|) per il FULL join 71 JOIN e proiezioni • Date due relazioni R1(X1) ed R2(X2) si ha che PROJX1(R1 JOIN R2) ⊆ R1 • Infatti, nel caso che il JOIN non sia completo, al risultato potrebbe partecipare solo un sottoinsieme delle n-ple di R1. 72 36 Join e proiezioni Impiegato Reparto Rossi A Neri B Bianchi B Reparto B C Impiegato Reparto Neri B Bianchi B Impiegato Reparto Neri B Bianchi B Capo Mori Bruni Capo Mori Mori Reparto B Capo Mori 73 JOIN e proiezioni • Data una relazione R(X) con X = X1∪X2 si ha che: (PROJX1(R)) JOIN (PROJX2 (R)) ⊇ R • Si ha il segno = solo nel caso in cui … X1∩X2 è una superchiave per R 74 37 Proiezioni e join Impiegato Reparto Capo Neri B Mori Bianchi B Bruni Verdi A Bini Impiegato Reparto Reparto Capo Neri B B Mori Bianchi B B Bruni Verdi A A Bini Impiegato Neri Bianchi Neri Bianchi Verdi Reparto B B B B A Capo Mori Bruni Bruni Mori Bini 75 Join e proiezioni • R 1(X1), R 2(X2) PROJX (R 1 JOIN R2 ) ⊆ R 1 1 • R(X), X = X1 ∪ X2 (PROJX1 (R)) JOIN (PROJX2 (R)) ⊇ R 76 38 Prodotto cartesiano • Che succede se eseguo un join naturale tra relazioni che non hanno attributi in comune? • Ogni n-pla della prima relazione può combinarsi con ognuna delle n-ple della seconda • Il risultato contiene sempre un numero di n-ple pari al prodotto delle cardinalità degli operandi • In questo caso il JOIN diventa il prodotto cartesiano tra i due operandi 77 Impiegati Impiegato Reparto Rossi A Neri B Bianchi B Reparti Codice A B Capo Mori Bruni Impiegati JOIN Reparti Impiegato Reparto Codice Rossi A A Rossi A B Neri B A Neri B B Bianchi B A Bianchi B B Capo Mori Bruni Mori Bruni Mori Bruni 78 39 • Il prodotto cartesiano, in pratica, ha senso solo se seguito da selezione: SELCondizione (R1 JOIN R2) • L'operazione viene chiamata theta-join e indicata con R1 JOINCondizione R2 79 Perché "theta-join"? • La condizione C è spesso una congiunzione (AND) di atomi di confronto A1ϑ A2 dove ϑ è uno degli operatori di confronto (=, >, <, …) • se l'operatore è sempre l'uguaglianza (=) allora si parla di equi-join 80 40 Impiegati Impiegato Reparto Rossi A Neri B Bianchi B Reparti Codice A B Capo Mori Bruni Impiegati JOINReparto=Codice Reparti Impiegato Reparto Codice Rossi A A Rossi A B Neri B Neri A Bianchi B B Neri B B Bianchi B A Bianchi B B Capo Mori Bruni Mori Bruni Bruni Mori Bruni 81 Impiegati Impiegato Reparto Rossi A Neri B Bianchi B Reparti Reparto A B Capo Mori Bruni Impiegati JOIN Reparti Impiegato Reparto Rossi A Neri B Bianchi B Capo Mori Bruni Bruni 82 41 JOIN naturale ed equi-join • Il JOIN naturale può essere ottenuto per mezzo di operatori di ridenominazione, equi-join e proiezione 83 Join naturale ed equi-join Impiegati Reparti Impiegato Reparto Reparto Capo Impiegati JOINnat Reparti = PROJImpiegato,Reparto,Capo ( Impiegati JOINReparto=Codice RENCodice ← Reparto (Reparti) ) 84 42 JOIN e vincoli di integrità referenziale • Il vincolo di IR esplicita un legame tra gli attributi di due tabelle diverse. • Livello sintattico: valori della tabella interna sono vincolati a comparire nella tabella esterna • Livello semantico: equi join tra attributi interessati a vincolo IR esplicita un’informazione non presente né in R1 né in R2 se prese separatamente 85 JOIN e vincoli di integrità referenziale • Esempio: Lo schema sotto riportato rappresenta informazioni sui dipendenti di un’azienda. Ogni dipendente è affiliato ad un dipartimento. Ogni dipartimento ha un direttore che è uno dei dipendenti Dipendente(matricola, nome, cognome, dipartimento, stipendio) Dipartimento(codice, descrizione, direttore) • Quale informazione è resa esplicita da Dipendente JOINdipartimento=codice Dipartimento • Quale informazione è resa esplicita da Dipendente JOINdirettore=matricola Dipartimento 86 43 JOIN e vincoli di integrità referenziale Dipendente JOINdipartimento=codice Dipartimento Restituisce una tabella con una riga per ciascun dipendente. Ogni riga esplicita i dati del dipendente e quelli del dipartimento a cui il dipendente è affiliato Dipendente JOINdirettore=matricola Dipartimento Restituisce una tabella con una riga per ciascun dipartimento. Ogni riga esplicita i dati del dipartimento e quelli del dipendente che ne è direttore 87 Esempi Impiegati Matricola Nome Età Stipendio Rossi 34 45 Bianchi 37 38 Neri 42 35 Bruni 43 42 Mori 45 50 Lupi 46 60 Supervisione Impiegato Capo 7309 5698 5998 5698 9553 4076 5698 4076 4076 8123 7309 5998 9553 5698 4076 8123 88 44 Esempi • • • • • • Matricola, nome, età e stipendio degli impiegati che guadagnano più di 40 milioni Matricola, nome ed età degli impiegati che guadagnano più di 40 milioni Matricole dei capi degli impiegati che guadagnano più di 40 milioni Nome e stipendio dei capi degli impiegati che guadagnano più di 40 milioni Impiegati che guadagnano più del proprio capo, mostrando matricola, nome e stipendio dell'impiegato e del capo Matricole dei capi i cui impiegati guadagnano tutti più di 40 milioni Impiegati Supervisione Impiegato 7309 5998 9553 5698 4076 Capo 5698 5698 4076 4076 8123 Matricola Nome 7309 Rossi 5998 Bianchi 9553 Neri 5698 Bruni 4076 Mori 8123 Lupi Età 34 37 42 43 45 46 Stipendio 45 38 35 42 50 89 60 Esercizi • Estrarre Nome e Cognome degli studenti lavoratori • Nome e Cognome degli studenti NON lavoratori • Nome e cognome degli studenti lavoratori che hanno sostenuto almeno un esame con più di 4 crediti • Nome e Cognome degli studenti che hanno preso almeno un trenta e mai un voto inferiore a 27 • Nome e Cognome degli studenti che hanno dato Analisi I e non Geometria • Nome e Cognome degli studenti che hanno dato almeno due esami • Nome e Cognome degli studenti che hanno dato almeno due esami con lo stesso docente Studenti Matricola Corsi Codice Nome Nome Cognome Eta Crediti Docente Esami Corso StudentiLavoratori Matricola Studente Voto Data 107 45