Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Formální sémantika SQL
Daniel Matteoni, Pavel Kadlec
2
Obsah Formální model tříhodnotového kalkulu E3VPC Gramatika SQL
Převod SQL na E3VPC Ekvivalence SQL dotazů
3
Proč formalizovat SQL? Ekvivalence SQL dotazů Optimalizace dotazů
Určení výpočetní síly jazyka
4
E3VPC
5
Extended three-valued Tuple Predicate Calculus - E3VPC
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
6
{t(v1, ..., vn): ||P(v1, ..., vn)||α}
E3VPC - Výrazy E3VPC výraz má strukturu: {t(v1, ..., vn): ||P(v1, ..., vn)||α} v1, ..., vn n-ticové proměnné t(v1, ..., vn) cílový seznam výrazu (specifikuje strukturu výsledku výrazu) v1 R1, ..., vn Rn, R1, ..., Rn jsou relace P(v1, ..., vn) predikátová formule || · ||α interpretační operátor α {T, F}
7
E3VPC - Termy 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
8
E3VPC - Operátory =, , <, 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}
9
příklad True unknown Null False 1 5
10
E3VPC – Formule 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 je formule, potom P Q a P Q jsou formule Žádné další výrazy nejsou formule
11
Interpretace E3VPC formulí
||.||T interpretuje unknown jako true ||.||F interpretuje unknown jako false Výsledkem vyhodnocení formule ||P||α je jedna z hodnot true, false
12
Interpretace formálně
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) = U => Q(x) = F
13
{v S: {v R: || v.a = v.b ||T} ... }
Vnější vazba Operátor vnější vazby mění rozsah platnosti proměnné v se odkazuje na proměnnou na nejbližší vyšší úrovni Kupříkladu ve výrazu {v S: {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 v S
14
Význam E3VPC výrazu {v1 R1, ..., vk Rk: 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é
15
Kvantifikace U := {x R: P(x)} Q(x) E := {x R: P(x)} Q(x),
kde P(x) je formule 2VPC Nechť M = {x R: P(x)}, potom platí: U true (x M) Q(x) = true U false (x M) Q(x) = false U = unknown v ostatních případech E true (x M) Q(x) = true E false (x M) Q(x) = false E unknown v ostatních případech
16
Gramatika SQL
17
Cíl Syntaxí řízený překlad dotazu SQL na výraz E3VPC
Je potřeba popsat syntaxi SQL gramatikou
18
Úpravy SQL 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
19
Gramatika SQL (pod)dotazu
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> Vrací výsledek agregační funkce: <AF SUBQ> ::= SELECT [ALL | DISTINCT] <FUNCTION><FROM CLAUSE>
20
Pravidlo <SELECT LIST>
<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
21
Pravidla <* 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>” 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
22
Pravidlo <WHERE CONDITION>
<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 AF PRED> | <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>
23
Pravidla <* [AF] PRED>
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>
24
Pravidlo <HAVING CONDITION>
<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>
25
Pravidlo <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>
26
Pravidla <AF * [AF] 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>
27
Překlad SQL => E3VPC
28
Pravidla překladu Překladové pravidlo pro symbol w
w ::= posloupnost symbolů Se vš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.
29
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í
30
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>
31
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
32
<QUERY> syntaktické pravidlo: pravidlo překladu:
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} 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
33
<* 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 > ::= < HAVING CONDITION> <GROUP BY CLAUSE> ::= <alias>.<column> <alias>.<column> [ <alias>.<column> <alias>.<column>] ... zbývá definovat: <WHERE CONDITION>, <HAVING CONDITION>
34
<* 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>, ...
35
<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> ...
36
<SUBQ> výsledek poddotazu může být množina hodnot:
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 poddotazu musí být jenom jedna hodnota: 2<SUBQ> = <COL OR VAL>
37
<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> <H SIMPLE PRED>::=<SIMPLE PRED> {<FROM CLAUSE>:||<WHERE CLAUSE> <GROUP BY CLAUSE>||F} <SIMPLE PRED> ...
38
Příklad dept(id, nofemp, location,manager)
emp(empId, deptId, residence) SQL: SELECT d.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
39
<QUERY> <QUERY> ::= {FRCLAUSE||WHCLAUSEHCLAUSE||F} FRCLAUSE::<alias name>intable name WHCLAUSE::WHERE SEARCH COND HCLAUSE ::= HAVING SEARCH COND {d in DEPT:||WHERE SEARCH COND HAVING SEARCH COND||F} SELECT d.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
40
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 SELECT d.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
41
{e in EMP: ||e.deptID = d.id||F } d.location = e.residence
WHERE SEARCH COND {e in EMP: ||e.deptID = d.id||F } d.location = e.residence SELECT d.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
42
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 SELECT d.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
43
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 SELECT d.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
44
<GBCLAUSE> <GBCLAUSE> = <alias name><column name> <alias name><column name> d.manager dmanager SELECT d.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
45
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.residence d.manager dmanager||F} > 500
46
Dokončení příkladu SQL: schéma: SELECT d.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.manager d.manager||F}>500 ||F}
47
Ekvivalence SQL dotazů
48
Ú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 ekvivalenci E3VPC výrazů. Jak to provedeme?
49
Kanonická forma E3VPC výrazu
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: {x S: P(x)} Q(x), {x S: P(x)} Q(x)
50
Pozorování 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
51
Lemma 1 ||P(x) Q(x)|| ||P(x)|| ||Q(x)||
||P(x)|| ||P(x)|| || ||P(x)|| || ||P(x)|| ||(x S): P(x)|| (x S): ||P(x)|| ||(x S): P(x)|| (x S): ||P(x)||, kde P(x), Q(x) jsou formule, S relace, , {T,F}
52
Lemma 2 ||{x S: ||P(x)||} Q(x)|| (x S): ||P(x)|| ||Q(x)|| ||{x S: ||P(x)||} Q(x)|| (x S): ||P(x)|| ||Q(x)||, kde P(x), Q(x) jsou formule, S relace, , {T,F}
53
Množina kritické ekvivalence
<Q1> = {x in R: ||P(x)||F } <Q2> = {x in R: ||P(x)||T }
54
Jednoduché dotazy Jednoduchý dotaz – bez negace a kvantifikace
Pravidlo 3 <Q1> = {x in R: ||¬P(x)||F } <Q2> = {x in R: ¬||P(x)||F } {x in R: ||¬P(x)||T } Pravidlo 4 <Q1> = {x in R: ||P(x)||F } <Q2> = {x in R: || ||P(x)||T ||F } {x in R: ||P(x)||T }
55
Univerzální kvantifikátor
||¬ {y in S: ||Q(x,y)P(y)||}|| ||¬ {y in S: ||Q(x,y)||}P(y)|| ||¬ {y in S: ||P(y)||}Q(x,y)|| || {y in S: ||Q(x,y)||}¬P(y)|| || {y in S: ||P(y)||}¬Q(x,y)||
56
Univerzální kvantifikátor II
Kanonické formy: y in S: ||¬ Q(x,y) || ||¬ P(y) || y in S: ||¬ Q(x,y) || ||¬ P(y) || y in S: ||¬ Q(x,y) || ||¬ P(y) || = 1 = 2
57
Příklad SELECT * FROM R x WHERE NOT EXISTS FROM S y
WHERE x.Ai = y.Bi y.Bj 'P' SELECT * FROM R x WHERE 'P' = ALL SELECT y.Bj FROM S y WHERE x.Ai = y.Bi
58
Existenční kvantifikátor
|| {y in S: ||Q(x,y)P(y)||}|| || {y in S: ||Q(x,y)||}P(y)|| || {y in S: ||P(y)||}Q(x,y)|| ||¬ {y in S: ||Q(x,y)||}¬P(y)|| ||¬ {y in S: ||P(y)||}¬Q(x,y)||
59
Existenční kvantifikátor II
Kanonické formy: y in S: || Q(x,y) || || P(y) || y in S: || Q(x,y) || || P(y) || y in S: || Q(x,y) || || P(y) || = 1 = 2
60
Ekvivalence SQL dotazů
SQL dotazy, které neobsahují univerzální kvantifikátor nikdy nevedou na množinu kritické ekvivalence SQL dotazy obsahující univerzální kvantifikátor vždy venou na množinu kritické ekvivalence Počet různých interpretací dotazů se stejnou kanonickou strukturou s alespoň jedným univerzálním kvantifikátorem se zvetšuje s každým dalším kvantifikátorem (univerzálním i existenčním)
61
Závěr Definovali jsme jazyk E3VPC.
Ukázali jsme si gramatiku SQL (zjednodušeně). Víme, že lze sestrojit syntaxí řízený překladač SQL => E3VPC. Viděli jsme překlad SQL dotazu. Umíme rozhodnout, zda jsou dva SQL dotazy ekvivalentní.
62
Použitá literatura Formal Semantics of SQL Queries - M. Negri et. al.
in ACM Transactions on Database Dystems, Vol.17, No.3, Sept. 1991, p. 513–534.
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.