SQL92 e XQuery1.0 a confronto1 SQL92 E XQUERY1.0 A CONFRONTO Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria - Sede di Modena Corso di Laurea in Ingegneria Informatica Relatore:Tesi di Laurea di: Prof. Sonia BergamaschiCristina Iotti
SQL92 e XQuery1.0 a confronto2 Contenuti: SQL92 e il modello dati relazionale XQuery1.0, XML e il modello dati semi- strutturato Confronto sintassi di query semplici Confronto di alcune parole chiave di SQL92 e XQuery1.0 Conclusioni
SQL92 e XQuery1.0 a confronto3 SQL92 e il Modello Relazionale SQL92 compie interrogazioni su dati di tipo relazionale Il modello relazionale fu introdotto da E.F.Codd nel 1970 La struttura base del modello relazionale è la relazione La relazione viene rappresentata con una tabella bidimensionale PERSONE NOMEETÀ Mario Paola Michele Piero
SQL92 e XQuery1.0 a confronto4 XQuery1.0 e il Modello Semistrutturato - XML XQuery nasce per interrogare dati di tipo semi-strutturato, sempre più diffusi grazie allaffermazione di XML (Extensible Markup Language) più completo di HTML nella gestione di informazioni Web Punti di forza di XML: –Estensibilità (tag personalizzabili) –Possibilità di uso di tag significativi –Focalizzazione sul contenuto informativo di una sorgente piuttosto che sulla sua rappresentazione grafica Esempio di documento XML: Mario Rossi 25 Paola Bianchi 32 via Roma22 Michele Neri 25 via Appia 823
SQL92 e XQuery1.0 a confronto5 Modello Semistrutturato e Modello Relazionale Persone nome età Mario Rossi 25 Persona nome età indirizzo nome età indirizzo Paola Bianchi 32 via Roma 22 via Appia Michele Neri NOMEETÀ Mario Paola Michele Piero PERSONE
SQL92 e XQuery1.0 a confronto6 Analisi Sintattica: Struttura Base di Query In SQL92 : SELECT nome FROM Persona WHERE età = 25 In XQuery1.0: for $p in document(Persone.xml)//persona where $p/età = 25 return $p/nome query specification ::= SELECT set quantifier? select list table expression table expression ::=from clause where clause? group by clause? having clause? FLWR Expr ::= (ForClause | LetClause)+ WhereClause? "return" ExprSingle : In SQL92: In XQuery1.0: Esempio: selezionare le persone di 25 anni:
SQL92 e XQuery1.0 a confronto7 Quadro Sinottico del Confronto SQL 92XQuery 1.0 SELECTreturn FROMin + for -let WHEREwhere =, <>, >, =,, >, =, <=, and, not, or BETWEEN…AND- LIKEcontains IS NULLempty EXISTSexists -some | every … in … satisfies - > ORDER BY (ASC | DESC)order by (ascending | descending) DISTINCTdistinct-values UNIONunion IN | NOT INintersect | except GROUP BYlet + order by HAVING- FIRST- -if...then...else AVG(), SUM(), COUNT()avg(), sum(), count() CURRENT()current() Alcune parole chiave sono comuni ai due linguaggi (where) Altre hano nomi diversi, ma uguale significato (IN e intersect) Altre ancora non hanno corrispondente (let)
SQL92 e XQuery1.0 a confronto8 Order By in SQL92 e in XQuery1.0 In SQL92 e in XQuery1.0 la parola chiave order by svolge la stessa funzione: ordina il risultato – ASC o DESC (SQL92) – ascending o descending (XQuery1.0) Esempio: Selezionare codice, prezzo, numero e nome di articoli presenti in magazzino, in ordine decrescente di codice. In SQL92: SELECT codice, prezzo, pno, nome FROM Magazzino ORDER BY codice DESC In XQuery 1.0: for $a in document(Mag.xml)//articolo order by $a/codice descending return {$a/codice} {$a/prezzo} {$a/pno} {$a/nome}
SQL92 e XQuery1.0 a confronto9 Raggruppamenti Sia in XQuery1.0 che in SQL92 può capitare di dover compiere operazioni su gruppi di elementi (es. funzioni sum(), avg()) Per questo scopo in SQL92 si utilizza GROUP BY, mentre in XQuery1.0 si ricorre a let + order by Esempio: mostrare i numeri e il prezzo medio degli articoli che hanno come minimo tre fornitori. In SQL92: SELECT num, avg(price) FROM Catalogs GROUP BY num HAVING count(*) >=3 In XQuery1.0: for $n in distinct-values(document("catal.xml")//num) let $i := document("catalog.xml")//item[num = $n] where count($i) >= 3 order by $n return {$n} {avg($i/price)}
SQL92 e XQuery1.0 a confronto10 Join Per effettuare query su più di una tabella (o documento) si utilizza il costrutto di join Esistono diversi tipi di join Esempio di inner-join: selezionare gli articoli (da tabella e documento Articoli) e il loro numero di stock (da tabella e documento Stock) In SQL92: SELECT code, name, number FROM Articoli A, Stock S WHERE A.code = S.code In XQuery1.0: for $a in document(Articoli.xml")/Articolo, $s in document("Stock.xml")/Stock, where $a/code = $s/code return {$a/code} {$a/name} {$s/number}
SQL92 e XQuery1.0 a confronto11 Funzioni SQL92 prevede funzioni predefinite (fra cui SUM(), AVG(), COUNT(), CURRENT(), MAX(), MIN()) XQuery1.0 prevede oltre a funzioni predefinite anche la possibilità per lutente di definire proprie funzioni Esempio: funzione che permette di testare (restituendo true o false) se un nodo preceda un altro nodo in un documento (senza essere un suo nodo genitore) declare function local:precedes($a as node(), $b as node()) as boolean { $a << $b and empty($a//node() intersect $b) };
SQL92 e XQuery1.0 a confronto12 Confronto fra SQL92 e XQuery1.0 SQL92 VANTAGGI: Sintetico Alta velocità di interrogazione Basato su un modello con solide basi teoriche Utile per associare e correlare molti record per produrre risultati sintetici SVANTAGGI: Poco flessibile XQUERY1.0 VANTAGGI: Maggiore flessibilità (funzioni definibili dallutente) Il risultato della query è un documento (con propria gerarchia interna) SVANTAGGI: Più prolisso Meno efficiente
SQL92 e XQuery1.0 a confronto13 Conclusioni Numerose somiglianze fra parole chiave dei linguaggi SQL92 e XQuery1.0 (es. where, exists,order by) Il successo di XQuery1.0 dipende dalla diffusione di XML Molte case distributrici di software (Microsoft, IBM e Oracle) stanno pensando di fornire supporti per XQuery1.0 assieme a SQL.