Dati relazionali e
Introduzione (1) Memorizzazione dei dati Utilizzo dei dati Applicazione DBMS relazionale Applicazione Applicazione 2
Introduzione (2) Memorizzazione dei dati Utilizzo dei dati Applicazione DBMS relazionale Applicazione Oggi gran parte dei dati viene memorizzata in database relazionali. Applicazione 3
Introduzione (3) Memorizzazione dei dati Utilizzo dei dati Applicazione DBMS relazionale Applicazione Numerose applicazioni utilizzano come formato di scambio e manipolazione dei dati. Applicazione 4
Introduzione (4)! viene utilizzato principalmente per due tipi di attività di data management:! Scambio di dati tra applicazioni.! Rappresentazione di dati semi-strutturati.! Quando i dati scambiati tra diverse applicazioni sono localmente memorizzati in database relazionali, è necessario un ponte tra questi due formati.! SQL/, che è un estensione standard di SQL, fornisce un linguaggio comune per convertire dati relazionali in. 5
Funzionalità: SQL-> e ->SQL! Per utilizzare congiuntamente dati relazionali e occorrono due funzionalità principali:! Estrazione di da una o piu' tabelle relazionali.! Memorizzazione di in una (o più) tabelle relazionali.! La prima funzionalità è concettualmente più semplice, in quanto nasce allo scopo di rappresentare dati sia semi-strutturati che strutturati.! La seconda è in generale più complessa, per lo stesso motivo. Dato rappresentabile sia in relazionale che in Dato difficilmente rappresentabile in relazionale SQL Dati Strutturati Dati semi-strutturati 6
Estrarre da una tabella! Estrarre dati a partire da una tabella e' semplice, perche' qualsiasi dato rappresentabile in una tabella e' anche rappresentabile in.! Vediamo due modi alternativi per realizzare questa funzionalità. 7
1: Estrarre da una tabella ( + XQuery)! Rappresentare la tabella in (mappatura).! Estrarre dati utilizzando tecnologie (XQuery). mappatura XQuery 8
mappatura XQuery IMPIEGATI ID NOME COGNOME SALARIO imp0001 Mario Rossi 20000 imp0002 Giorgio Bianchi 18000 Partiamo da una tabella relazionale. 9
mappatura XQuery! La mappatura avviene nel seguente modo:! Il nome della tabella diventa il nome del documento.! Ogni riga viene inclusa in un elemento <row>.! Ogni valore (colonna) viene incluso in un elemento con il nome dell'attributo.! Valori nulli vengono rappresentati tramite l'attributo xsi:nil="true". 10
mappatura XQuery Questa è la mappatura definita da SQL/. <IMPIEGATI> <row> <ID>imp0001</ID> <NOME>Mario</NOME> <COGNOME>Rossi</COGNOME> <SALARIO>20000</SALARIO> </row> <row> <ID>imp0002</ID> <NOME>Giorgio</NOME> <COGNOME>Bianchi</COGNOME> <SALARIO>18000</SALARIO> </row> </IMPIEGATI> 11
mappatura XQuery! Lo standard definisce inoltre uno schema contenente le definizioni per ogni tipo di dato SQL e ogni elemento.! Ad esempio, CHARACTER(6) produce: <xsd:simpletype name="char_6"> <xsd:restriction base="xsd:string"> <xsd:length value="6" /> </xsd:restriction> </xsd:simpletype> Frammento di Schema, fornito solo a titolo di esempio (non è necessario ricordarne i dettagli) 12
mappatura XQuery Funzione NON standard XQuery. <salarialti> { for $e in table("impiegati")/impiegati/row where $e/salario > 18000 return <impiegato> } </salarialti> {$e/cognome, $e/nome} </impiegato> Interrogazione XQuery, fornita solo a titolo di esempio (XQuery non viene approfondito in questi lucidi) 13
mappatura XQuery! Il risultato è il seguente: <salarialti> <impiegato> <nome>mario</nome> <cognome>rossi</cognome> </impiegato> </salarialti> 14
2: Estrarre da una tabella (SQL/)! Estrarre dati dalla tabella (SQL).! Trasformare questi dati in (SQL/). Query SQL SQL/ 15
Query SQL SQL/ IMPIEGATI ID NOME COGNOME SALARIO imp0001 Mario Rossi 20000 imp0002 Giorgio Bianchi 18000 Partiamo dalla stessa tabella dell esempio precedente. 16
Query SQL SQL/ SELECT i.nome AS nomeimpiegato FROM IMPIEGATI i WHERE salario > 18000 Scriviamo un interrogazione SQL che ritorni i dati di interesse. 17
Query SQL SQL/ SELECT i.nome AS nomeimpiegato FROM IMPIEGATI i WHERE salario > 18000 nomeimpiegato Mario Giorgio 18
Query SQL SQL/ SELECT ELEMENT( NAME "imp", i.nome ) AS nomeimpiegato FROM IMPIEGATI i WHERE salario > 18000 Aggiungiamo i costruttori. 19
Query SQL SQL/ SELECT ELEMENT( NAME "imp", i.nome ) AS nomeimpiegato FROM IMPIEGATI i WHERE salario > 18000 nomeimpiegato <imp>mario</imp> <imp>giorgio</imp> Più propriamente, in questo modo non si estrae direttamente dell, bensì tabelle contenenti, che può poi essere recuperato ed utilizzato come tale. 20
Inserimento di in DB Relazionali! Per garantire questa funzionalità, sistemi differenti utilizzano tecniche ad hoc.! Queste si possono ricondurre a due modalità principali:! Utilizzo di colonne Object-Relational per memorizzare interi frammenti in un unico campo.! Shredding ( spezzettamento ) dei documenti, per cui elementi differenti vengono memorizzati in campi differenti. 21
Inserire (1)! Un documento puo' essere considerato come un tipo di dato di SQL.! In questo caso, un intero documento viene memorizzato in un attributo (colonna) di una tabella. 22
Inserire (2)! Con qualche limitazione, un documento puo' essere spezzato in frammenti e memorizzato a pezzi. <impiegato> <ID>imp0001</ID> <COGNOME>Rossi</COGNOME> <SALARIO>20000</SALARIO> </impiegato> <impiegato> <ID>imp0002</ID> <COGNOME>Bianchi</COGNOME> <SALARIO>18000</SALARIO> </impiegato> FILE DI DEFINIZIONE DEL MAPPING ID COGNOME SALARIO imp0001 Rossi 20000 imp0002 Bianchi 18000 23
Il linguaggio SQL/
Estrarre tramite SQL/ (1)! SQL/ definisce i seguenti operatori.! ELEMENT! FOREST! CONCAT! AGG! GEN Query SQL SQL/ 25
Estrarre tramite SQL/ (2)! Una query SQL/ ha la seguente struttura: SELECT Attr1, Attr2,..., Costruttore FROM... WHERE...! Per calcolarne il risultato,! PRIMA si considera solo SQL, e si calcola una tabella come se fosse SELECT *.! POI si costruisce il risultato, selezionando gli attributi richiesti (Attr1, Attr2...) e costruendo il codice PER OGNI TUPLA. 26
Tabella utilizzata negli esempi IMPIEGATO id nome cognome dipartimento licenziato salario imp0001 Mario Rossi Vendite null 20000 imp0002 Giorgio Bianchi Vendite null 18000 imp0003 Luca Verdi Contabilità null 15000 imp0004 Gianni Neri Contabilità 01/01/03 15000 27
ELEMENT! ELEMENT permette di creare un elemento.! Come argomenti prende:! Il nome dell'elemento.! Una eventuale lista di attributi.! Il contenuto dell'elemento. 28
ELEMENT esempio SELECT i.id, ELEMENT( NAME "imp", i.nome ) AS risultato FROM IMPIEGATI i 29
ELEMENT esempio SELECT i.id, ELEMENT( NAME "imp", i.nome ) AS risultato FROM IMPIEGATI i nome dell'elemento contenuto 30
ELEMENT risultato SELECT i.id, ELEMENT( NAME "imp", i.nome ) AS risultato FROM IMPIEGATI i nome dell'elemento contenuto id imp0001 imp0002 imp0003 imp0004 risultato <imp>mario</imp> <imp>giorgio</imp> <imp>luca</imp> <imp>gianni</imp> 31
ELEMENT! Il contenuto di un elemento puo' essere formato concatenando piu' valori SQL.! L'operatore di concatenazione e'. 32
ELEMENT SELECT i.id, ELEMENT( NAME "imp", i.nome ' ' i.cognome ) AS risultato FROM IMPIEGATI i id imp0001 imp0002 imp0003 imp0004 risultato <imp>mario Rossi</imp> <imp>giorgiobianchi</imp> <imp>luca Verdi</imp> <imp>gianni Neri</imp> 33
ATTRIBUTES! Per dichiarare una lista di attributi si utilizza l'operatore ATTRIBUTES.! Ogni parametro di ATTRIBUTES viene inserito in un attributo che, se non dichiarato esplicitamente, prende il nome della colonna relazionale dalla quale e' stato selezionato. 34
ELEMENT ed ATTRIBUTES SELECT i.id, ELEMENT( NAME "imp", ATTRIBUTES(i.salario as "sal"), i.nome ' ' i.cognome ) AS risultato FROM IMPIEGATI i id imp0001 imp0002 imp0003 imp0004 risultato <imp sal="20000">mario Rossi</imp> <imp sal="18000">giorgio Bianchi</imp> <imp sal="15000">luca Verdi</imp> <imp sal="15000">gianni Neri</imp> 35
ELEMENT! Nel contenuto di un elemento si possono specificare piu' oggetti, sia elementi sia stringhe di caratteri.! Proviamo a creare un elemento che contenga altri due elementi e del testo. 36
Come detto, il primo parametro specifica il nome dell elemento risultante. ELEMENT esempio SELECT i.id, ELEMENT( NAME "imp", ELEMENT( NAME "co", i.cognome), ' del dipartimento ', ELEMENT( NAME "dip", i.dipartimento) ) AS risultato FROM IMPIEGATI i 37
Di seguito sono elencati i contenuti. In ordine, specifichiamo un elemento <co>, un contenuto testuale, un elemento <dip>. ELEMENT esempio SELECT i.id, ELEMENT( NAME "imp", ELEMENT( NAME "co", i.cognome), ' del dipartimento ', ELEMENT( NAME "dip", i.dipartimento) ) AS risultato FROM IMPIEGATI AS i 38
ELEMENT risultato id imp0001 imp0002 imp0003 imp0004 risultato <imp><co>rossi</co> del dipartimento <dip>vendite</dip></imp> <imp><co>bianchi</co> del dipartimento <dip>vendite</dip></imp> <imp><co>verdi</co> del dipartimento <dip>contabilità</dip></imp> <imp><co>neri</co> del dipartimento <dip>contabilità</dip></imp> 39
FOREST! FOREST e' un modo rapido per produrre una lista di elementi semplici.! Il comportamento dei suoi parametri e' lo stesso di ATTRIBUTES. 40
FOREST esempio SELECT i.id, ELEMENT( NAME "imp", FOREST( i.nome, i.cognome AS "co", i.dipartimento AS "dip") ) AS risultato FROM IMPIEGATI i In mancanza di un nome esplicito, viene utilizzato il nome della colonna corrispondente. 41
FOREST risultato id imp0001 imp0002 imp0003 imp0004 risultato <imp><nome>mario</nome> <co>rossi</co><dip>vendite</dip></imp> <imp><nome>giorgio</nome> <co>bianchi</co><dip>vendite</dip></imp> <imp><nome>luca</nome><co>verdi</co> <dip>contabilità</dip></imp> <imp><nome>gianni</nome><co>neri</co> <dip>contabilità</dip></imp> 42
CONCAT! CONCAT concatena i suoi argomenti, producendo una foresta di elementi.! CONCAT puo' concatenare anche elementi costruiti tramite ELEMENT. 43
CONCAT esempio SELECT i.id, CONCAT( ELEMENT( NAME "co", i.cognome), ELEMENT( NAME "dip", i.dipartimento) ) AS risultato FROM IMPIEGATI i 44
CONCAT risultato id imp0001 imp0002 imp0003 imp0004 risultato <co>rossi</co> <dip>vendite</dip> <co>bianchi</co> <dip>vendite</dip> <co>verdi</co> <dip>contabilità</dip> <co>neri</co> <dip>contabilità</dip> 45
AGG! Nel caso sia necessario aggregare piu' tuple sulla base di uno o piu' attributi, SQL utilizza il costrutto GROUP BY.! AGG permette di recuperare le tuple aggregate dal GROUP BY. 46
AGG id nome cognome dipartimento licenziato salario imp0001 Mario Rossi Vendite null 20000 imp0002 Giorgio Bianchi Vendite null 18000 imp0003 Luca Verdi Contabilità null 15000 imp0004 Gianni Neri Contabilità 01/01/03 15000 <dip nome="vendite"> <imp></imp> <imp></imp> </dip> <dip nome="contabilità"> <imp></imp> <imp></imp> </dip> 47
AGG SELECT ELEMENT( NAME "dipartimento", ATTRIBUTES(i.dipartimento AS "nome"), AGG( ELEMENT( NAME "imp", i.cognome) ) ) AS risultato FROM IMPIEGATI i GROUP BY dipartimento 48
AGG risultato <dipartimento nome="vendite"> <imp>rossi</imp> <imp>bianchi</imp> </dipartimento> <dipartimento nome="contabilità"> <imp>verdi</imp> <imp>neri</imp> </dipartimento> 49
GEN! Un'altra possibilita' per creare e' GEN.! E' possibile specificare esplicitamente il codice, inserendovi dati tramite variabili, indicate tra parentesi graffe.! Le variabili possono essere utilizzate anche per i nomi degli elementi, cosa non possibile tramite ELEMENT, che prevede che i nomi degli elementi vengano forniti esplicitamente tramite una costante. 50
GEN SELECT GEN( '<impiegato> <nome>{$nome}</nome> <salario>{$sal}</salario> </impiegato>', i.nome, i.salario AS "sal" ) AS risultato FROM IMPIEGATI i WHERE salario > 15000 Riferimento per nome 51
GEN risultato <impiegato> <nome>rossi</nome> <salario>20000</salario> </impiegato> <impiegato> <nome>bianchi</nome> <salario>18000</salario> </impiegato> 52
Le specifiche di SQL/! ISO/IEC 9074-14:2003! Corrispondente a quanto trattato nei presenti lucidi.! ISO/IEC 9075-14:2006! Aggiunge la possibilità di eseguire interrogazioni in XQuery, di cui viene adottato il modello dei dati, e di validare documenti.! ISO/IEC 9075-14:2008! La più recente, non ancora diffusa e adottata. 53
Riferimenti! Alcuni articoli su SQL/:! Una descrizione dello standard descritto in questi lucidi: www.acm.org/sigmod/record/issues/0206/standard.pdf! Un approfondimento sulle nuove funzionalità: www.sigmod.org/sigmod/record/issues/0409/11.jimmelton.pdf! Alcuni sistemi che supportano SQL/:! Oracle database server.! DB2. 54