630 likes | 750 Views
Daniel Matteoni, Pavel Kadlec. Formální sémantika SQL. Formální model tříhodnotového kalkulu E3VPC Gramatika SQL Převod SQL na E3VPC Ekvivalence SQL dotazů. Obsah. Ekvivalence SQL dotazů Optimalizace dotazů Určení výpočetní síly jazyka. Proč formalizovat SQL?. E3VPC.
E N D
Daniel Matteoni, Pavel Kadlec Formální sémantika SQL
Formální model tříhodnotového kalkulu E3VPC • Gramatika SQL • Převod SQL na E3VPC • Ekvivalence SQL dotazů Obsah
Ekvivalence SQL dotazů • Optimalizace dotazů • Určení výpočetní síly jazyka Proč formalizovat SQL?
Rozšíření 2-hodnotového n-ticového predikátového kalkulu • Využívá tříhodnotovou logiku • Jednoduchá struktura • Snadnější manipulace s daty (např. optimalizace) • Schopnost vyjádřit vše, co lze vyjádřit v SQL Extended three-valued Tuple Predicate Calculus - E3VPC
E3VPC výraz má strukturu: {t(v1, ..., vn): ||P(v1, ..., vn)||α} v1, ..., vnn-ticové proměnné t(v1, ..., vn) cílový seznam výrazu (specifikuje strukturu výsledku výrazu) v1R1, ..., vn Rn, R1, ..., Rn jsou relace P(v1, ..., vn) predikátová formule || · ||αinterpretační operátor α{T, F} E3VPC - Výrazy
Konstanta je term • Pro každou proměnnou v a atribut a jsou v.a a v.a termy • Pokud S je E3VPC výraz, a atribut a F je agregační funkce, potom F(a)S je term, kde F {COUNT, AVG, SUM, MIN, MAX,COUNTD, AVGD, SUMD} Funkce xxxD odpovídají funkcím xxx DISTINCT E3VPC - Termy
=, , <, mají klasický význam • Pokud jeden z operandů má hodnotu null, výsledek je unknown porovnává s hodnotou null • Liší se od operátoru ‘=‘ v tom, že výsledek porovnání dvou operandů s hodnotou null dává výsledek true ·unární operátor vnější vazby || · ||α unární operátor interpretace, α{T,F} E3VPC - Operátory
5 1 Null 5 True False unknown 1 False True unknown Null unknown unknown True příklad
t1, t2 termy, operátor porovnaní, potom t1 t2 je atomická formule • T, F, U (True, False, Unknown) jsou atomické formule • P je atomická formule, potom ||P|| je atomická formule • atomická formule je formule • P, Q jsou formule, potom P, P Q a P Q jsou formule • P je výraz, Q jeformule, potom PQ a PQ jsou formule • Žádné další výrazy nejsou formule E3VPC – Formule
||.||T interpretuje unknown jako true • ||.||F interpretuje unknown jako false • Výsledkem vyhodnocení formule ||P||α je jedna z hodnot true, false Interpretace E3VPC formulí
P(x) je E3VPC formule, Q(x) je 2VPC formule • Q(x) je pozitivně interpretovaný 2-hodnotový ekvivalent P(x), značíme ||P||T, pokud pro každé x: P(x) = T => Q(x) = T P(x) = F => Q(x) = F P(x) = U => Q(x) = T • Q(x) je negativně interpretovaný 2-hodnotový ekvivalent P(x), značíme ||P||F, pokud pro každé x: P(x) = T => Q(x) = T P(x) = F => Q(x) = F P(x) = U => Q(x) = F Interpretace formálně
Operátor vnější vazby mění rozsah platnosti proměnné • v se odkazuje na proměnnou na nejbližší vyšší úrovni • Kupříkladuve výrazu {vS: {v R: || v.a = v.b ||T} ... } je proměnná v dvakrát – na levé straně operátoru '=' se jedná o v R, na pravé straně je díky operátoru vnější vazby vS Vnější vazba
{v1 R1, ..., vkRk: Q(v1, ..., vk)} • Výsledkem vyhodnocení výrazu je množina n-tic vybraných z relací R1, ..., Rk, které po dosazení za příslušné proměnné v1, ..., vk splňují formuli Q • Q musí být formule 2VPC • Předpokládá se, že n-tice v relacích jsou navzájem různé Význam E3VPC výrazu
U := {xR: P(x)} Q(x) E := {xR: P(x)} Q(x), kde P(x) je formule 2VPC Nechť M = {xR: P(x)}, potom platí: Kvantifikace U true (x M) Q(x) =true Ufalse (x M) Q(x) =false U=unknown v ostatních případech E true (x M) Q(x) =true Efalse (x M) Q(x) =false Eunknown v ostatních případech
Cíl • Syntaxí řízený překlad dotazu SQL na výraz E3VPC • Je potřeba popsat syntaxi SQL gramatikou
Výrazy „Boolean expression of“ a „list of“ jsou zkratkou pro množinu zřejmých pravidel • Aritmetické výrazy s atributy nejsou uvažovány • Používání aliasů relací je povinné • Některá pravidla byla rozdělena a byly zavedeny další neterminály Úpravy SQL
Vrací n-tici: <QUERY> ::= SELECT [ALL | DISTINCT] <SELECT LIST><FROM CLAUSE> [<WHERE CLAUSE>][<GROUP BY CLAUSE>][<HAVING CLAUSE>] • Vrací hodnotu nebo sloupec: <SUBQ> ::= SELECT [ALL | DISTINCT] <COL OR VAL><FROM CLAUSE> [<WHERE CLAUSE>][<GROUP BY CLAUSE>][<HAVING CLAUSE>] • Vrací výsledek agregační funkce: <AF SUBQ> ::= SELECT [ALL | DISTINCT] <FUNCTION><FROM CLAUSE> [<WHERE CLAUSE>][<GROUP BY CLAUSE>][<HAVING CLAUSE>] Gramatika SQL (pod)dotazu
<SELECT LIST> ::= “list of <SELECT ELEMENT>” <SELECT ELEMENT> ::= <COL OR VAL> | <FUNCTION> <COL OR VAL> ::= <alias>.<column> | <literal> <FUNCTION> ::= <COUNT> | <AGGR> <COUNT> ::= <COUNT DISTINCT> | COUNT(<alias>.<column>) <COUNT DISTINCT>::= COUNT (DISTINCT <alias>.<column>) <AGGR> ::= <AGGR DISTINCT> | <AGGR ALL> <AGGR DISTINCT> ::= <AGGR NAME>(DISTINCT <alias>.<column>) <AGGR ALL> ::= <AGGR NAME>([ALL ]<alias>.<column>) <AGGR NAME> ::= AVG | MAX | MIN | SUM Pravidlo <SELECT LIST>
<FROM CLAUSE> ::= FROM “list of <TABLE REFERENCE>” <TABLE REFERENCE> ::= <table> <alias> <WHERE CLAUSE> ::= WHERE <WHERE CONDITION> <HAVING CLAUSE> ::= HAVING <HAVING CONDITION> <GROUP BY CLAUSE> ::= GROUP BY “list of <alias>.<column>” • do klauzule FROM nelze vnořit SELECT • SELECT je možné je možné vnořit pouze do klauzulí WHERE, HAVING, za [NOT] IN, EXISTS, SOME a ALL Pravidla <* CLAUSE>
<WHERE CONDITION>::=“Boolean expression of <WHERE PRED>” <WHERE PRED>::=<SIMPLE PRED> | <COMPLEX PRED> <SIMPLE PRED>::=<COL OR VAL><comp op><COL OR VAL> <COMPLEX PRED>::= <SOME QUANTIFIED PRED> | <SOME QUANTIFIED AFPRED> | <ALL QUANTIFIED PRED> | <ALL QUANTIFIED AF PRED> | <COMPLEX IN PRED> | <COMPLEX IN AF PRED> | <COMPLEX NOT IN PRED> | <COMPLEX NOT IN AF PRED> | <COMPLEX COMP PRED> | <COMPLEX COMP AF PRED> | <EXISTS PRED> Pravidlo<WHERE CONDITION>
Bez agregační funkce v poddotazu: <SOME QUANTIFIED PRED>::=<COL OR VAL><comp op>SOME<SUBQ> <ALL QUANTIFIED PRED>::=<COL OR VAL><comp op>ALL<SUBQ> <COMPLEX IN PRED>::=<COL OR VAL>IN<SUBQ> <COMPLEX NOT IN PRED>::=<COL OR VAL>NOT IN<SUBQ> <COMPLEX COMP PRED>::=<COL OR VAL><comp op><SUBQ> • Analogicky s agregační funkcí v poddotazu: <SOME QUANTIFIED AF PRED>::= <COL OR VAL><comp op>SOME<AF SUBQ> <ALL QUANTIFIED AF PRED>::=<COL OR VAL><comp op>ALL<AF SUBQ> <COMPLEX IN AF PRED>::=<COL OR VAL>IN<AF SUBQ> <COMPLEX NOT IN AF PRED>::=<COL OR VAL>NOT IN<AF SUBQ> <COMPLEX COMP AF PRED>::=<COL OR VAL><comp op><AF SUBQ> <EXISTS PRED>::=EXISTS <SUBQ> Pravidla <* [AF] PRED>
<HAVING CONDITION>::=“Boolean expression of <HAVING PRED>” <HAVING PRED>::=<H SIMPLE PRED> | <H COMPLEX PRED> | <H AF COLUMN PRED> | <H AF FUNCTION PRED> | <H AF COMPLEX PRED> <H SIMPLE PRED>::=<SIMPLE PRED> <H COMPLEX PRED>::=<COMPLEX PRED> <H AF COLUMN PRED>::=<FUNCTION><comp op><COL OR VAL> <H AF FUNCTION PRED>::=<FUNCTION><comp op><FUNCTION> Pravidlo<HAVING CONDITION>
<H AF COMPLEX PRED>::= <AF SOME Q PRED> | <AF SOME Q AF PRED> | <AF ALL Q PRED> | <AF ALL Q AF PRED> | <AF COMPLEX IN PRED> | <AF COMPLEX IN AF PRED> | <AF COMPLEX NOT IN PRED> | <AF COMPLEX NOT IN AF PRED> | <AF COMPLEX COMP PRED> | <AF COMPLEX COMP AF PRED> Pravidlo<H AF COMPLEX PRED>
Bez agregační funkce v poddotazu: <AF SOME Q PRED>::=<FUNCTION><comp op>SOME<SUBQ> <AF ALL Q PRED>::=<FUNCTION><comp op>ALL<SUBQ> <AF COMPLEX IN PRED>::=<FUNCTION>IN<SUBQ> <AF COMPLEX NOT IN PRED>::=<FUNCTION>NOT IN<SUBQ> <AF COMPLEX COMP PRED>::=<FUNCTION><comp op><SUBQ> • Analogicky s agregační funkcí v poddotazu: <AF SOME Q AF PRED>::=<FUNCTION><comp op>SOME<AF SUBQ> <AF ALL Q AF PRED>::=<FUNCTION><comp op>ALL<AF SUBQ> <AF COMPLEX IN AF PRED>::=<FUNCTION>IN<AF SUBQ> <AF COMPLEX NOT IN AF PRED>::=<FUNCTION>NOT IN<AF SUBQ> <AF COMPLEX COMP AF PRED>::=<FUNCTION><comp op><AF SUBQ> Pravidla <AF * [AF] PRED>
Pravidla překladu • Překladové pravidlo pro symbol w • w::= posloupnost symbolů • Sevšemi pravidly gramatiky SQL jsou spojena překladová pravidla • Explicitní – pravidla popsaná metajazykem • Implicitní – ostatní pravidla • Některá syntaktická pravidla mohou mít i více překladových pravidel.Rozlišíme je indexem: i • Použití závisí na kontextu.
Překlad terminálů • Je-li w terminál, pak w ::= w. • Význam přeložených SQL terminálů v E3VPC: • <alias> proměnná • <column> atribut • <table> relace • <literal> konstanta • <comp op> operátor porovnání
Implicitní překlad • BuďLHS::=RHS syntaktické pravidlo, w1, ..., wk neterminály na jeho pravé straně v pořadí zleva doprava. • Nechť neexistuje explicitní pravidlo překladu pro LHS::=RHS. • Pak LHS ::= w1...wk • syntaktické pravidlo: • <WHERE CLAUSE>::=WHERE <WHERE CONDITION> • překlad: • <WHERE CLAUSE> ::= <WHERE CONDITION>
Pravidla popsaná metajazykem 1<FUNCTION> ::= odpovídající jméno agregační funkce a v závorkách její parametr “boolean expression of <X>” ::= odpovídající výraz v E3VPC, v němž jsou predikátové formule nahrazeny svými překlady “list of <X>” ::= seznam přeložených neterminálů oddělených čárkami <COL OR VAL> ::= proměnná.atribut nebo konstanta
negativní interpretace • <GROUP BY CLAUSE> se projeví až při překladu <HAVING CLAUSE> a při překladu agregačních funkcí • <SELECT LIST> není použit – jedná se o vnější SELECT <QUERY> syntaktické pravidlo: <QUERY> ::= SELECT [ALL | DISTINCT] <SELECT LIST><FROM CLAUSE> [<WHERE CLAUSE>][<GROUP BY CLAUSE>][<HAVING CLAUSE>] pravidlo překladu: <QUERY> ::= {<FROM CLAUSE>: ||<WHERE CLAUSE><HAVING CLAUSE>||F}
<* CLAUSE> <FROM CLAUSE> ::= FROM “list of <TABLE REFERENCE>” <TABLE REFERENCE> ::= <table> <alias> <WHERE CLAUSE> ::= WHERE <WHERE CONDITION> <HAVING CLAUSE> ::= HAVING <HAVING CONDITION> <GROUP BY CLAUSE> ::= GROUP BY “list of <alias>.<column>” pravidla překladu spojená s těmito syntaktickými pravidly: <FROM CLAUSE> ::= “list of <TABLE REFERENCE>” <TABLE REFERENCE> ::= <alias> <table> <WHERE CLAUSE> ::= <WHERE CONDITION> <HAVING CLAUSE > ::= < HAVINGCONDITION> <GROUP BY CLAUSE> ::= <alias>.<column><alias>.<column> [<alias>.<column><alias>.<column>] ... zbývá definovat: <WHERE CONDITION>, <HAVING CONDITION>
<* CONDITION> implicitní překlad a překlad popsaný metajazykem: <WHERE CONDITION>::=“boolean expression of <WHERE PRED>” <WHERE CONDITION>::= “boolean expression of <WHERE PRED>” <WHERE PRED>::=<SIMPLE PRED> | <COMPLEX PRED> <SIMPLE PRED>::=<COL OR VAL><comp op><COL OR VAL> <SIMPLE PRED>::=<COL OR VAL><comp op><COL OR VAL> <COMPLEX PRED>::= ... | <ALL QUANTIFIED PRED> | ... <COMPLEX PRED>::= ... | <ALL QUANTIFIED PRED>| ... <HAVING CONDITION>::=“boolean expression of <HAVING PRED>” <HAVING PRED>::= ... | <H AF COLUMN PRED> | ... <HAVING PRED>::= ... | <H AF COLUMN PRED> | ... zbývá tedy přeložit: <ALL QUANTIFIED PRED>, <H AF COLUMN PRED>, ...
<ALL QUANTIFIED PRED>, ... <ALL QUANTIFIED PRED>::=<COL OR VAL><comp op>ALL<SUBQ> 1<SUBQ><COL OR VAL> <comp op> 2<SUBQ> <SOME QUANTIFIED PRED>::=<COL OR VAL><comp op>SOME<SUBQ> 1<SUBQ><COL OR VAL> <comp op> 2<SUBQ> <COMPLEX IN PRED>::=<COL OR VAL>IN<SUBQ> 1<SUBQ><COL OR VAL> = 2<SUBQ> <COMPLEX NOT IN PRED>::=<COL OR VAL>NOT IN<SUBQ> 1<SUBQ><COL OR VAL> 2<SUBQ> <EXISTS PRED>::=EXISTS <SUBQ> 1<SUBQ> ...
<SUBQ> <SUBQ> ::= SELECT [ALL | DISTINCT] <COL OR VAL><FROM CLAUSE> [<WHERE CLAUSE>][<GROUP BY CLAUSE>][<HAVING CLAUSE>] výsledek poddotazu může být množina hodnot: 1<SUBQ> = {<FROM CLAUSE>: ||<WHERE CLAUSE><HAVING CLAUSE>||F} výsledek poddotazumusí být jenom jedna hodnota: 2<SUBQ> = <COL OR VAL>
<H AF COLUMN PRED>, ... <H AF COLUMN PRED>::=<FUNCTION><comp op><COL OR VAL> 1<FUNCTION> {<FROM CLAUSE>:||<WHERE CLAUSE> <GROUP BY CLAUSE>||F} <comp op> <COL OR VAL> <H AF FUNCTION PRED>::=<FUNCTION><comp op><FUNCTION> 1<FUNCTION> {<FROM CLAUSE>:||<WHERE CLAUSE> <GROUP BY CLAUSE>||F} <comp op> 1<FUNCTION> {<FROM CLAUSE>:||<WHERE CLAUSE> <GROUP BY CLAUSE>||F} <H SIMPLE PRED>::=<SIMPLE PRED> {<FROM CLAUSE>:||<WHERE CLAUSE> <GROUP BY CLAUSE>||F} <SIMPLE PRED> ...
Příklad dept(id, nofemp, location,manager) emp(empId, deptId, residence) SQL:SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
<QUERY> • <QUERY> ::= {FRCLAUSE||WHCLAUSEHCLAUSE||F} • FRCLAUSE::<alias name>intable name • WHCLAUSE::WHERE SEARCH COND • HCLAUSE ::= HAVING SEARCH COND{d in DEPT:||WHERE SEARCH CONDHAVING SEARCH COND||F} • SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
WHERE SEARCH COND • WHERE SEARCH COND::= ..::= ALL QUANTIFIED PRED • <ALL QUANTIFIED PRED>::=<COL OR VAL><comp op>ALL<SUBQ> • ALL QUANTIFIED PRED::1<SUBQ><COL or VAL><comp op>2<SUBQ>1<SUBQ> d.location = 2<SUBQ> • <SUBQ> = {FRCLAUSE:||WHCLAUSE>HCLAUSE>||F}1<SUBQ> => {e in EMP: ||e.deptId = d.id||F } • <SUBQ> = <COL or VAL>2<SUBQ> => e.residence • SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
WHERE SEARCH COND • {e in EMP: ||e.deptID = d.id||F } d.location = e.residence • SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
HAVING SEARCH COND • <HAVING SEARCH COND> = ”Boolean expression of <HPRED>” • <HPRED> = <HAFCOLUMN PRED>|... • <HAFCOLUMN PRED>::= • <FUNCSPEC> • {<FRCLAUSE>: ||<WHCLAUSE><GBCLAUSE>||F} <comp op><COL or VAL>AVG(d.nofemp){<FRCLAUSE>:||<WHCLAUSE><GBCLAUSE>||F} > 500 • SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
HAVING SEARCH COND • AVG(d.nofemp){<FRCLAUSE>:||<WHCLAUSE><GBCLAUSE>||F} > 500 • AVG(d.nofemp) • {d in DEPT:: • ||{e in EMP: ||e.deptID = d.id||F } d.location = e.residence • • <GBCLAUSE>||F} > 500 • SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
<GBCLAUSE> • <GBCLAUSE> = <alias name><column name> <alias name><column name>d.manager dmanager • SELECTd.manager FROM dept dWHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.idGROUP BY d.managerHAVING AVG(d.nofEmp)>500
HAVING SEARCH COND AVG(d.nofemp){d in DEPT::||{e in EMP: ||e.deptID = d.id||F } d.location = e.residence<GBCLAUSE>||F} > 500 AVG(d.nofemp){d in DEPT::||{e in EMP: ||e.deptID = d.id||F } d.location = e.residenced.manager dmanager||F} > 500
Dokončení příkladu SQL: schéma: SELECTd.manager FROM dept d WHERE d.location = ALL SELECT e.residence FROM emp e WHERE e.deptId = d.id GROUP BY d.manager HAVING AVG(d.nofEmp)>500 dept(id, nofEmp, location, manager) emp(id, deptId, residence) E3VPC: {d dept: ||({e emp: || e.deptId = d.id ||F} d.location = e.residence) AVG(d.nofEmp){d dept: ||({e emp: || e.deptId = d.id ||F}d.location = e.residence) d.managerd.manager||F}>500 ||F}
Úkol • Zjišťujeme, zda dané SQL výrazy jsou ekvivalentní. • Uděláme to přes E3VPC • SQL výrazy přeložíme di E3VPC a zjistíme ekvivalenciE3VPC výrazů. • Jak to provedeme?
E3VPC výraz je kanonický, pokud • interpretační operátor je aplikován na každou atomickou formuli • interpretační operátor není aplikován na jinou než atomickou formuli • neobsahuje zkrácené kvantifikované výrazy: {xS: P(x)} Q(x), {xS: P(x)} Q(x) Kanonická forma E3VPC výrazu
S kanonickým výrazem lze pracovat ve 2VPC. • Ve 2VPC umíme zjistit ekvivalenci dvou výrazů. • Má každý E3VPC výraz svůj kanonický tvar? • Ano – následuje lemma, jejichž násobnou aplikací dostaneme kanonickou formu výrazu Pozorování