Formální sémantika SQL

Slides:



Advertisements
Podobné prezentace
DOTAZOVACÍ JAZYKY slajdy přednášce DBI006
Advertisements

Aplikační a programové vybavení
DOTAZOVACÍ JAZYKY slajdy přednášce DBI006
KIV/ZIS Cvičení 6 SQL - SELECT.
SQL Další dotazy a pohledy
J. Pokorný 1 DOTAZOVACÍ JAZYKY slajdy přednášce DBI006 J. Pokorný MFF UK Odpřednášeno
Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Jazyk SQL Ing. Zdena DOBEŠOVÁ. SQL Structured Query Language 1974 SEQUEL (Structured English Query Language) neprocedurální relační dotazovací jazyk norma.
Predikátová logika 1. řádu
DB1 – 9. cvičení Optimalizace dotazu Konkurenční přístup a deadlock Indexace Transakce.
Databázové systémy SQL Výběr dat.
YDASYS1 Ing. Monika Šimková.
Fakulta elektrotechniky a informatiky
Predikátová logika1 Predikátová logika 1. řádu Teď „logika naostro“ !
Programovací jazyk Prolog
Programování v Pascalu Přednáška 3
Informační systémy Nástroje pro sběr dat, návrh a realizace databáze.
AGREGACE Distinct, Group By, Having, SUM, …. DISTINCT  Slučování stejných řádků ve výsledku dotazu. AGREGACE 2 JménoPříjmeníID FrantišekVomáčka1 JosefPokorný2.
Další dotazy SQL Structured Query Language. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
SQL Structured Query Language
Informatika pro ekonomy II přednáška 11
Databázové systémy 1 Cvičení č. 2 Fakulta elektrotechniky a informatiky Univerzita Pardubice.
Databázové systémy I Přednáška č. 5 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Object Query Language (OQL)
Generování mezikódu Jakub Yaghob
VISUAL - Grafický dotazovací jazyk David Hoksza. Obsah  Model systému, práce se systémem  VISUAL do OQL  VISUAL do Komplexní algebry  D-VISUAL.
Radek Špinka Přepínače MSSQL výběr.
Databáze Jiří Kalousek.
Databázové systémy II Přednáška č. 8 – Pohledy (Views)
Školení správců II. Petr Pinkas RNDr. Vít Ochozka.
Databázové systémy II Přednáška č. 9 RNDr. David Žák, Ph.D. Fakulta elektrotechniky a informatiky
Fakulta elektrotechniky a informatiky
Databázové systémy I Cvičení č. 9 Fakulta elektrotechniky a informatiky Univerzita Pardubice 2013.
Sémantická analýza Jakub Yaghob
Syntaxí řízený překlad
1IT D OTAZOVACÍ JAZYKY V RELAČNÍCH DATABÁZÍCH Ing. Jiří Šilhán.
KIV/ZIS cvičení 6 Tomáš Potužák. Pokračování SQL Klauzule GROUP BY a dotazy nad více tabulkami Stáhnout soubor studenti_dotazy_sql.mdb.
Databázové systémy Přednáška č. 6.
SQL – základní pojmy Ing. Roman Danel, Ph.D.
Predikátová logika.
Predikátová logika.
Fakulta elektrotechniky a informatiky
Výroková logika.
Databázové systémy Tomáš Skopal
Databázové systémy UIN010 N-ticový (řádkový) relační kalkul Hodnoty proměnných n-tice relací (řádky) Konstanty hodnoty atributů Unární funkční.
Informatika II PAA DOTAZOVACÍ JAZYKY
Aplikační a programové vybavení
XQuery Dotazovací jazyk XML Daniel Privalenkov. O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů.
Databázové systémy SQL Výběr dat.
Marie Duží vyučující: Marek Menšík Logika: systémový rámec rozvoje oboru v ČR a koncepce logických propedeutik pro mezioborová studia.
Rezoluční metoda 3. přednáška
Predikátová logika1 Predikátová logika 1. řádu Teď „logika naostro“ !
Datové typy a operátory. Co jsou datové typy  Charakterizují proměnnou nebo konstantu – jaká data obsahuje  Data jsou v počítači ukládána jako skupiny.
SQL Další dotazy a pohledy Databázové systémy. Některé SQL příkazy mohou mít v sobě obsaženy další kompletní příkazy SELECT. Využijeme je tam, kde potřebujeme.
CUBE - Operátor relační agregace
J. Pokorný, I Halaška1 DBS: SQL92 Jaroslav Pokorný MFF UK, Praha
SQL Structured Query Language
Příkazy jazyka SQL ve VFP a na SQL Serveru
David Gešvindr MCT | MSP | MCITP | MCPD. Jak se zpracovává dotaz? Když norma nestačila Práce s XML Geografická data CTE Zpracování hierarchií a grafů.
Databázové systémy I Přednáška 7 Databázové systémy 1 – KIT/IDAS1
SQL – příkaz SELECT Ing. Roman Danel, Ph.D.
Databázové systémy I Přednáška 8 Databázové systémy 1 – KIT/IDAS1
Databázové systémy a SQL
Predikátová logika (1. řádu).
Optimalizace SQL dotazů
Formální sémantika SQL
Gödelova(y) věta(y).
Sémantika PL1 Interpretace, modely
Predikátová logika.
Vyhodnocování aritmetického výrazu (1)
Transkript prezentace:

Formální sémantika SQL Daniel Matteoni, Pavel Kadlec

Obsah Formální model tříhodnotového kalkulu E3VPC Gramatika SQL Převod SQL na E3VPC Ekvivalence SQL dotazů

Proč formalizovat SQL? Ekvivalence SQL dotazů Optimalizace dotazů Určení výpočetní síly jazyka

E3VPC

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

{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}

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

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}

 příklad True unknown Null False 1 5 

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

Interpretace E3VPC formulí ||.||T interpretuje unknown jako true ||.||F interpretuje unknown jako false Výsledkem vyhodnocení formule ||P||α je jedna z hodnot true, false

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

{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

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é

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

Gramatika SQL

Cíl Syntaxí řízený překlad dotazu SQL na výraz E3VPC Je potřeba popsat syntaxi SQL gramatikou

Ú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

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>

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

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

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>

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>

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>

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>

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>

Překlad SQL => E3VPC

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.

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

<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

<* 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>

<* 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> 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>

<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> ...

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

<QUERY> <QUERY> ::= {FRCLAUSE||WHCLAUSEHCLAUSE||F} FRCLAUSE::<alias name>intable 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

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

{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

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

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

<GBCLAUSE> <GBCLAUSE> = <alias name><column name> <alias name><column name> d.manager dmanager 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

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 dmanager||F} > 500

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}

Ekvivalence SQL dotazů

Ú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?

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)

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

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}

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}

Množina kritické ekvivalence <Q1> = {x in R: ||P(x)||F } <Q2> = {x in R: ||P(x)||T }

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 }

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)||

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

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

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)||

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

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)

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í.

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.