Tipi di linguaggi per basi di dati Si distinguono due categorie: DDL Linguaggi di definizione dei dati o data definition languages: utilizzati per definire gli schemi logici, esterni e fisici e le autorizzazioni degli utenti DML Linguaggi di manipolazione dei dati o data manipulation languages: utilizzati per l’interrogazione e l’aggiornamento delle istanze di basi di dati L’algebra relazionale è un DML Structured Query Language 1 Structured Query Language pron: “esse-qu-elle”, “es-que-el” o “sequel” Letteralmente: “Linguaggio Strutturato di Interrogazione” E’ sia un DDL che un DML Ne esistono varie versioni Fu proposto (come SEQUEL) dall’IBM Research nel 1974 La prima implementazione risale al 1981 (IBM SQL/DS) Dal 1983 circa è uno standard di fatto E’ standard ANSI 1986, 1989, 1992 (quest’ultimo denominato SQL-2) Structured Query Language 2 Convenzioni di specifica della sintassi “courier” esattamente i caratteri specificati dalla stringa Es.: “where” indica la sequenza “w”, “h”, “e”, “r”, “e” neretto un valore non specificato, ma il cui tipo (stringa, intero, booleano, ecc) è evidente dal contesto Es.: NomeRelazione può rappresentare la stringa “Impiegati” Structured Query Language 3 Convenzioni di specifica della sintassi (2) [ ... ] tutto ciò che è tra parentesi quadre è opzionale Es.: [ “abc” ] può indicare tanto “abc” quanto “” (la stringa vuota) { ... } tutto ciò che è tra parentesi graffe può essere ripetuto zero o più volte Es.: [ “abc” ] può indicare “”, “abc”, “abc abc”, ... < ... | ... > tutto ciò che è tra parentesi angolate e separato da barre verticali è alternativo Es.: < “a” | “b” | “c” > può indicare “a”, “b” o “c” Structured Query Language 4 Scopo Definisce uno schema di relazione e ne crea un’istanza vuota Sintassi “create table” NomeTabella “(” NomeAttributo Dominio [ Default ] [ Vincoli ] { “,” NomeAttributo Dominio [ Default ] [ Vincoli ] } [ “,” AltriVincoli ] “)” Esempio create table create createtable tableDipartimento Dipartimento (( Nome Nome char char(20) (20)primary primarykey, key, Indirizzo Indirizzo char char(50), (50), Citta char Citta char(20) (20) )) Structured Query Language 5 Esempio di create table create createtable tableImpiegato Impiegato(( Matricola Matricola Nome Nome Cognome Cognome Dipart Dipart Stipendio Stipendio Citta Citta char char(6) (6)primary primarykey, key, char char(20) (20)not notnull, null, char char(20) (20)not notnull, null, char char(15), (15), numeric numeric(9) (9)default default0, 0, char char(15), (15), foreign foreignkey key(Dipart) (Dipart) refereces refereces Dipartimento Dipartimento (NomeDip) (NomeDip) on ondelete deleteset setnull null on onupdate updatecascade, cascade, unique unique(Cognome, (Cognome,Nome) Nome) )) Structured Query Language 6 Altro esempio di create table Incidenti codice 00001 00002 prov1 RM BO num1 prov2 034524 PG 823507 MI num2 982453 827283 create createtable tableIncidenti Incidenti(( codice codice prov1 prov1 num1 num1 prov2 prov2 num2 num2 )) numeric numeric(5) (5)primary primarykey, key, char char(2), (2), numeric numeric (6), (6), char char(2), (2), numeric numeric (6) (6) Structured Query Language 7 Tipi di domini Esistono due tipi di domini 1) domini elementari: sono quelli predefiniti e presenti in tutte le implementazioni di SQL 2) domini definiti dall’utente: • solo domini semplici (derivati cioè da un altro dominio già esistente) • vengono dichiarati prima del loro utilizzo • possono essere riutilizzati in più punti Structured Query Language 8 Scopo Definisce stringhe e singoli caratteri Sintassi Domino character “character” [ “varying” ] [ “(” Lunghezza “)” ] [ “character set” NomeFamigliaCaratteri ] Es. character character (20) (20) stringa di 20 caratteri Es. char = character varchar = character varying varchar varchar(1000) (1000) character characterset setGreek Greek stringa di caratteri dell’alfabeto greco a lunghezza variabile di lunghezza massima 1000 Structured Query Language 9 Scopo Es. “bit” [ “varying” ] [ “(” Lunghezza “)” ] bit bit(5) (5) sequenza di 5 valori binari Es. Definisce sequenze di valori binari che vengono generalmente utilizzati come flag Sintassi Dominio bit (SQL-2) bit bitvarying varying(100) (100) sequenza di valori binari di lunghezza variabile e lunghezza massima 100 Structured Query Language 10 Scopo Domini numerici esatti Rappresentano valori interi, decimali, o in virgola fissa. Sintassi “numeric” [ “(” NumCifre [ “,” NumDecimali ] “)” ] “decimal” [ “(” NumCifre [ “,” NumDecimali ] “)” ] “integer” Es. “smallint” numeric numeric (6,3) (6,3) rappresenta valori compresi tra -999,999 e +999,999 con decimal vengono definiti requisiti minimi, con numeric i valori di precisione esatti Structured Query Language 11 Scopo Domini numerici approssimati Rappresentano valori approssimati Sintassi “real” “double precision” “float” [ “(” CifreMantissa “)” ] 0.1756 × 10 15 mantissa esponente Per real e double precision il numero di cifre della mantissa e dell’esponente dipendono dall’implementazione Structured Query Language 12 Scopo Definiscono rispettivamente una data e un’ora Es. Sin. Data e ora (SQL-2) “date” Sin. “time” [ “(” NumDecimali “)”] [ “with time zone” ] Es. date date definisce una data con i campi anno, mese e giorno (Es.: ‘2000-10-18’) time time(2) (2)with withtime timezone zone definisce una stringa con ore, minuti, secondi, e fuso orario (Es.: ‘21:03:04,98+1:00’) Structured Query Language 13 Scopo Sintassi “timestamp” [ “(” NumDecimali “)”] [ “with time zone” ] timestamp timestamp(1) (1) definisce un’etichettatura temporale (Es.: ‘2000-10-18 15:30:45,3’) Es. Definisce un etichettatura temporale (timestamp) Es. timestamp (SQL-2) timestamp timestampwith withtime timezone zone definisce un’etichettatura temporale. Un valore può essere il seguente: ‘2000-10-18 15:30:45+5:30’ Structured Query Language 14 Scopo Es. “interval” UnitàDiTempo [ “to” UnitàDiTempo ] interval intervalyear yearto tomonth month definisce un intervallo in anni e mesi (Es.: ‘2-3’ = due anni e tre mesi) Es. Definisce un intervallo temporale Sintassi interval (SQL-2) interval intervalday dayto tosecond second definisce un intervallo in giorni, ore, minuti e secondi (Es.: ‘3 20:43:21’ = tre giorni, 20 ore, 43 minuti e 21 secondi) Non è possibile abbracciare nello stesso intervallo i mesi e i giorni Structured Query Language 15 Scopo Definisce un domino (semplice) utilizzabile nelle definizioni delle ralazioni che seguiranno Sintassi “create domain” NomeDominio “as” TipoDiDato [ ValoreDiDefault ] [ Vincoli ] Esempio create domain create createdomain domainVoto Votoas assmallint smallint default default null null check check((value value>= >=18 18and and value value<= <=30 30)) L’istruzione create domain aggiunge un alias, un valore di default ed un insieme di vincoli ad un dominio esistente Structured Query Language 16 Scopo Definisce un valore di default per un dominio Sintassi “default” < Valore | “user” | “null” > Esempio create createtable tablePersona Persona(( Figli Figli smallint smallintdefault default0, 0, ... ... Esempio create createtable tableVoceElenco VoceElenco(( InseritaDa InseritaDa char char(20) (20) default defaultuser, user, ... ... Esempio Valori di default create createdomain domainVoto Votoas assmallint smallint default defaultnull null ... ... Structured Query Language 17 Sintassi Vincoli “create table” NomeTabella “(” NomeAttributo Dominio [ Default ] [ Vincoli ] { “,” NomeAttributo Dominio [ Default ] [ Vincoli ] } [ “,” AltriVincoli ] “)” i Vincoli compaiono in più punti nella sintassi di create table create createtable tableDipartimento Dipartimento(( Nome Nome char char(20) (20)primary primarykey, key, Indirizzo Indirizzo char char(50), (50), primary primarykey key(Nome) (Nome) )) è equivalente specificare un vincolo dopo l’attributo cui si riferisce o in coda alla definizione Structured Query Language 18 Esempio uno Attenzione! create createtable tablePersona Persona(( Matricola Matricola integer integerprimary primarykey, key, Nome char Nome char(20), (20), Cognome Cognomechar char(20), (20), Indirizzo Indirizzo char char(50), (50), unique unique(Cognome,Nome) (Cognome,Nome) )) Esempio due è diverso da... create createtable tablePersona Persona(( Matricola Matricola integer integerprimary primarykey, key, Nome char Nome char(20), (20), Cognome Cognomechar char(20), (20), Indirizzo Indirizzo char char(50), (50), unique unique(Cognome), (Cognome), unique unique(Nome) (Nome) )) Quando sono interessati più attributi è d’obbligo specificarli assieme (e dunque necessariamente in coda alla definizione) Structured Query Language 19 Vincoli intrarelazionali primary key elegge l’attributo specificato (o gli attributi specificati) come chiave primaria per la relazione not null impone che l’attributo abbia sempre un valore definito unique impone che non esistano due tuple della relazione con lo stesso valore sull’attributo (o sugli attributi). Gli attributi che sono unique sono anche superchiavi per la relazione primary key implica il not null e l’unique sugli attributi interessati Structured Query Language 20 Vincoli interrelazionali Esempio Esempio Vincoli di integrità referenziali: • references dopo l’attributo create createtable tableImpiegato Impiegato(( CF CF char(16) char(16) references referencesPersona(CF), Persona(CF), ... ... • foreign key ... references per insiemi di attributi (in coda alla create table) ... ... foreign foreign key key(Nome,Cognome) (Nome,Cognome) references references Anagrafe(Nome,Cognome) Anagrafe(Nome,Cognome) )) SQL richiede che gli attributi della tabella riferita siano dichiarati unique Structured Query Language 21 Violazione dei vincoli interrelazionali vincolo di integrità referenziale tabella tabella interna interna tabela tabela esterna esterna Il vincolo può essere violato: • inserendo o modificando una tupla della tabella interna • cancellando o modificando una tupla della tabella esterna Nel primo caso si assume che sia l’applicazione o l’utente a verificare la non violazione del vincolo. Nel secondo caso SQL offre costrutti opportuni Structured Query Language 22 Strategie di reazione cascade: la cancellazione o la modifica nella tupla della tabella esterna si riflette in una analoga cancellazione o modifica nelle tuple corrispondenti della tabella interna set null: le corrispondenti tuple della tabella interna assumono il valore null sugli attributi interessati set default: le corrispondenti tuple della tabella interna assumono il valore di default sugli attributi interessati no action: non viene presa nessuna particolare precauzione Structured Query Language 23 Sintassi Esempio Sintassi La strategia di reazione alla violazione viene specificata immediatamente dopo il vincolo con la sintassi seguente “on” < “delete” | “update” > < “cascade” | “set null” | “set default” | “no action” > create createtable tableImpiegato Impiegato(( Nome Nomechar(20) char(20)not notnull, null, Cognome Cognomechar(20) char(20)not notnull, null, Dipart Dipartchar(15), char(15), Stipendio Stipendionumeric(9) numeric(9)default default0, 0, primary primarykey key(Cognome, (Cognome,Nome), Nome), foreign foreignkey key(Dipart) (Dipart)references references Dipartimento(Nome) Dipartimento(Nome) on ondelete deleteset setnull null on on update update cascade cascade )) Structured Query Language 24 Scopo “create schema” [ NomeSchema ] [ [ “autorization” ] UtenteProprietario ] { Definizioni } Esempio Definisce uno schema in SQL Sintassi create schema create create schema schema NuovoSchema NuovoSchema create createtable tableImpiegato Impiegato(( ... ... )) create createtable tableDipartimento Dipartimento(( ... ... )) ... ... Structured Query Language 25 Esercizio 1 Si definisca in SQL la seguente base di dati Partenze(Numero, Ora, Destinazione,Categoria) Scali(Treno, Stazione, Ora) • Tra l’attributo Treno di Scali e la relazione Partenze c’è un vincolo di integrità referenziale • Non si ammette nessun valore nullo • Non ci sono due treni con lo stesso orario, stessa destinazione e stessa categoria Structured Query Language 26 Esercizio 2 Si definisca in SQL la seguente base di dati Pazienti(Codice, Cognome, Nome) Ricoveri(Paziente, Inizio, Fine, Reparto) Medici(Matr., Cognome, Nome, Reparto) Reparti(Sigla, Nome, Primario) Vincoli di integrità referenziale sono: • tra l’attributo Paziente di Ricoveri e la relazione Pazienti • tra Reparto di Ricoveri e Reparti • tra Primario di Reparti e Medici • tra Reparto di Medici e Reparti Valori nulli sono ammessi per gli attributi: • Cognome e Nome di Pazienti • Fine di Ricoveri • Cognome e Nome di Medici • Nome di Reparti Structured Query Language 27 Sintassi Interrogazioni: select “select” ListaAttributi “from” ListaTabelle [ “where” Condizione ] Sintassi dettagliata le tre parti vengono chiamate: • target list • clausola from • clausola where “select” AttrExpr [ “as” Alias ] { AttrExpr [ “as” Alias ] } “from” Tabella [ “as” Alias ] { Tabella [ “as” Alias ] } [ “where” Condizione ] Se la calusola where è assente vengono selezionate tutte le righe delle tabelle Structured Query Language 28 Nome Mario Carlo Giuseppe Franco Carlo Lorenzo Paola Marco Impiegato Structured Query Language 29 Cognome Rossi Bianchi Verdi Neri Rossi Lanzi Borroni Franchi Dipartimento Amministrazione Produzione Amministrazione Distribuzione Direzione Direzione Amministrazione Produzione Ufficio 10 20 20 16 14 7 75 20 Relazione Impiegato Stipendio 45 36 40 45 80 73 40 46 Domanda Algebra ρρSalario←Stipendio ( Salario←Stipendio ( ππStipendio ( Stipendio ( σσCognome=‘Rossi’ (Impiegato))) Cognome=‘Rossi’ (Impiegato))) select selectStipendio Stipendioas asSalario Salario from fromImpiegato Impiegato where whereCognome Cognome==‘Rossi’ ‘Rossi’ Risultato Individuare Individuareililsalario salariodi ditutti tuttigli gli impiegati impiegatidi dicognome cognome‘Rossi’ ‘Rossi’ SQL Esempio #1 Salario 45 80 Structured Query Language 30 Algebra Recuperare Recuperare tutte tutte le le informazioni informazioni degli degliimpiegati impiegatidi dinome nome‘Rossi’ ‘Rossi’ σσCognome=‘Rossi’ (Impiegato) Cognome=‘Rossi’ (Impiegato) SQL Domanda Esempio #2 select select** from fromImpiegato Impiegato where whereCognome Cognome==‘Rossi’ ‘Rossi’ Risultato Il carattere speciale * (asterisco) rappresenta tutti gli attributi delle tabelle elencate nella clausola from Nome Cognome Dip. Ufficio Stip. Mario Rossi Amm. 10 45 Carlo Rossi Dir. 14 80 Structured Query Language 31 SQL Domanda Esempio #3 Trovare Trovarelo lostipendio stipendiomensile mensiledi di ‘Bianchi’ ‘Bianchi’ select selectStipendio/12 Stipendio/12as asMensile Mensile from fromImpiegato Impiegato where whereCognome Cognome==‘Bianchi’ ‘Bianchi’ Risultato Nella target list possono comparire generiche espressioni sui valori degli attributi Mensile 3,00 Structured Query Language 32 Structured Query Language 33 Nome Amministrazione Produzione Distribuzione Direzione Ricerca Dipartimento Indirizzo Via Tito Livio, 27 P.le Lavater, 3 Via Segre, 9 Via Tito Livio, 27 Via Morone, 6 Citta Milano Torino Roma Milano Milano Relazione Dipartimento Domanda ππNome,Cognome,Citta ( Nome,Cognome,Citta ( Impiegato Impiegato Dipartimento Dipartimento==NN (ρ (Dipartimento))) (ρN←Nome N←Nome (Dipartimento))) SQL Trovare Trovareiinomi nomieecognomi cognomidegli degli impiegati impiegatieele lecittà cittàin incui cuilavorano lavorano Algebra Esempio #4 select select Impiegato.Nome, Impiegato.Nome, Impiegato.Cognome, Impiegato.Cognome, Dipartimento.Citta Dipartimento.Citta from fromImpiegato, Impiegato,Dipartimento Dipartimento where where Impiegato.Dipartimento Impiegato.Dipartimento == Dipartimento.Nome Dipartimento.Nome Structured Query Language 34 Impiegato.Nome Mario Carlo Giuseppe Franco Carlo Lorenzo Paola Marco Impiegato.Cognome Rossi Bianchi Verdi Neri Rossi Lanzi Borroni Franchi Dipartimento.Citta Milano Milano Milano Roma Milano Milano Milano Milano Risultato esempio #4 Structured Query Language 35 Risultato SQL Domanda Esempio #5 Trovare Trovareiinomi nomieecognomi cognomidegli degli impiegati impiegatieele lecittà cittàin incui cuilavorano lavorano select select I.Nome, I.Nome, Cognome, Cognome, Citta Citta from from Impiegato Impiegatoas asI,I, Dipartimento Dipartimentoas asDD where where I.Dipartimento I.Dipartimento == D.Nome D.Nome I.Nome Mario Carlo Giuseppe Franco Carlo Lorenzo Paola Marco I.Cognome D.Citta Rossi Milano Bianchi Milano Verdi Milano Neri Roma Rossi Milano Lanzi Milano Borroni Milano Franchi Milano Structured Query Language 36 Domanda Trovare Trovareiinomi nomieecognomi cognomidegli degli impiegati impiegati che che lavorano lavorano nell’ufficio nell’ufficio 20 20 dell’Amministrazione dell’Amministrazione Algebra ππNome,Cognome ( Nome,Cognome ( σσUfficio=20 Ufficio=20∧∧Dipartimento Dipartimento== ‘Amministrazione’ ‘Amministrazione’ (Impiegato)) (Impiegato)) SQL Esempio #6 select select Nome, Nome,Cognome Cognome from from Impiegato Impiegato where whereUfficio Ufficio==20 20and and Dipartimento Dipartimento== ‘Amministrazione’ ‘Amministrazione’ Risultato La clausola where può contenere espressioni booleane con confronti Nome Cognome Giuseppe Verdi Structured Query Language 37 Risultato SQL Algebra Domanda Esempio #7 Trovare Trovareiinomi nomieecognomi cognomidegli degli impiegati impiegati dell’Amminstrazione dell’Amminstrazione ee della della Distribuzione Distribuzione ππNome,Cognome ( Nome,Cognome ( σσDipartimento Dipartimento==‘Amministrazione’∨ ‘Amministrazione’∨ Dipartimento Dipartimento==‘Distribuzione’ ‘Distribuzione’ (Impiegato)) (Impiegato)) select select Nome, Nome,Cognome Cognome from from Impiegato Impiegato where where Dipartimento Dipartimento == ‘Amministrazione’ ‘Amministrazione’or or Dipartimento=‘Distribuzione’ Dipartimento=‘Distribuzione’ Nome Cognome Mario Rossi Giuseppe Verdi Franco Neri Paola Borroni Structured Query Language 38 Algebra Domanda Esempio #8 Trovare Trovareiinomi nomidegli degliimpiegati impiegatidi di cognome cognome‘Rossi’ ‘Rossi’che chelavorano lavorano nell’Amminstrazione nell’Amminstrazioneeenella nella Distribuzione Distribuzione ππNome ( Nome( σσ(Dipartimento (Dipartimento==‘Amministrazione’∨ ‘Amministrazione’∨ Dipartimento Dipartimento==‘Distribuzione’) ‘Distribuzione’)∧∧ Cognome=‘Rossi’ Cognome=‘Rossi’ Risultato SQL (Impiegato)) (Impiegato)) select select Nome Nome from from Impiegato Impiegato where whereCognome Cognome==‘Rossi’ ‘Rossi’and and (Dipartimento (Dipartimento == ‘Amministrazione’ ‘Amministrazione’or or Dipartimento=‘Distribuzione’) Dipartimento=‘Distribuzione’) Nome Mario Structured Query Language 39 Operatore like Nella clausola where, oltre ai normali operatori di confronto (=, <>, <, >, <=, >=) si può usare anche l’operatore like, con i due caratteri speciali: _ rappresenta un carattere qualsiasi Es. % rappresenta una stringa di caratteri arbitrari (anche la stringa vuota) Nome Nome like like ‘ab%ba_’ ‘ab%ba_’ è verificato sia dalla stringa ‘abcdedcbac’ che dalla stringa ‘abbaf’ Structured Query Language 40 Domanda SQL select select ** from from Impiegato Impiegato where whereCognome Cognomelike like‘_o%i’ ‘_o%i’ Trovare Trovaregli gliimpiegati impiegatiililcui cuinome nome contiene contienedue due‘a’ ‘a’oppure oppuredue due‘e’ ‘e’ SQL Trovare Trovaregli gliimpiegati impiegatiche chehanno hannoilil cognome cognomecon conuna una‘o’ ‘o’in inseconda seconda posizione posizioneeeterminano terminanoper per‘i’‘i’ Domanda Esempio #9 select select ** from from Impiegato Impiegato where where (Nome (Nome like like ‘%a%a%’) ‘%a%a%’) or or (Nome (Nomelike like‘%e%e%’) ‘%e%e%’) Structured Query Language 41 Cognome Rossi Rossi Borroni Cognome Verdi Borroni Nome Giuseppe Paola Dipartimento Amministrazione Amministrazione Dipartimento Amministrazione Direzione Amministrazione Ufficio 20 75 Ufficio 10 14 75 Risultati esempio #9 Nome Mario Carlo Paola Structured Query Language 42 Stipendio 40 40 Stipendio 45 80 40 SQL Interpretazione algebrica select select TT11.Attributo .Attributo11,,... ... TThh.Attributo .Attributohh from fromTT11,,..., ...,TThh where where Condizione Condizione Algebra Una interrogazione SQL può essere tradotta in una espressione dell’algrebra relazionale come segue ππT1.Attributo1, ..., Th.Attributoh (( T1.Attributo1, ..., Th.Attributoh σσCondizione ( Condizione ( TT11 TT22 ... ...TThh)))) dove simboleggia un prodotto cartesiano (eventuali rinominazioni che si rendessero necessarie sono state omesse) Structured Query Language 43 Gestione dei duplicati Cognome Rossi Bianchi Verdi Neri Rossi Lanzi Borroni Franchi Risultato 2 select select distinct distinct Cognome Cognome from fromImpiegato Impiegato Risultato 1 SQL 1 select select Cognome Cognome from fromImpiegato Impiegato SQL 2 Devono essere eliminati esplicitamente Cognome Rossi Bianchi Verdi Neri Lanzi Borroni Franchi Structured Query Language 44 Esempio #10 Con riferimento allo schema: SQL Algebra Domanda Persone(Nome, Età, Reddito) Paternità(Padre, Figlio) Maternità(Madre, Figlio) Trovare Trovareiipadri padridi dipersone personeche che guadagnano guadagnanopiù piùdi di20 20milioni milioni ππPadre (Paternità Padre(Paternità Figlio=Nome Figlio=Nome (σ (Persone))) (σReddito>20 Reddito>20(Persone))) select selectdistinct distinctPadre Padre from from Persone Persone Paternità Paternità where whereFiglio Figlio==Nome Nomeand and Reddito Reddito>>20 20 Structured Query Language 45 SQL Algebra Domanda Esempio #11 Trovare Trovarepadre padreeemadre madredi diogni ogni persona persona ππFiglio,Padre,Madre (Paternità Figlio,Padre,Madre(Paternità Figlio=Nome Figlio=Nome (ρ (Maternità))) (ρFiglio←Nome Figlio←Nome(Maternità))) select select Paternita.Figlio, Paternita.Figlio, Padre, Padre,Madre Madre from fromMaternita MaternitaPaternità Paternità where where Paternita.Figlio Paternita.Figlio == Maternita.Figlio Maternita.Figlio Structured Query Language 46 Domanda Esempio #12 Trovare Trovarele lepersone personeche che guadagnano guadagnanopiù piùdei deirispettivi rispettivipadri, padri, mostrandone mostrandonenomi, nomi,redditi, redditi,eenomi nomi dei deipadri padri Algebra ππNome,Reddito,Padre(σ ( Nome,Reddito,Padre(σReddito>RP Reddito>RP( Persone Persone Nome=Figlio Nome=Figlio Paternità Paternità P=NP P=NP SQL ρρNP,EP,RP←Nome,Eta,Reddito(Persone))) NP,EP,RP←Nome,Eta,Reddito(Persone))) select selectf.Nome, f.Nome,f.Reddito, f.Reddito,p.Reddito p.Reddito from fromPersone Personep, p,Paternita, Paternita, Persone Personeff where wherep.Nome p.Nome==Padre Padreand and Figlio Figlio==f.Nome f.Nomeand and f.Reddito f.Reddito >> p.Reddito p.Reddito Structured Query Language 47