Sunteți pe pagina 1din 56

Exprimarea interogrilor complexe sub forma unei fraze SELECT n continuare vom considera trei limbaje: a) Limbajul natural,

n care se exprim interogarea asupra unui numr de tabele (Lnat). b) Limbajul intermediar, format cu anumite expresii ce au ca operanzi cmpurile tabelelor folosite n interogare (Lint). c) Limbajul frazei SELECT, ale crei cuvinte sunt secvene ale unei fraze SELECT (LSEL). Ne intereseaz modul de transformare a unei expresii din limbajul natural Lnat ntr-o expresie din limbajul intermediar Lint i modul de transformare a unei expresii din Lint ntr-o secven a unei fraze SELECT, deci LSEL. Scopul final este obinerea unei fraze SELECT corect pentru o interogare n limbajul natural Lnat. Evident, transformarea interogrii din limbaj natural n limbaj intermediar trebuie s in cont de semantica interogrii, precum i de elementele (tabelele, cmpurile), ce apar n interogare.

Transformarea din limbajul intermediar n limbajul frazei SELECT dorim s se realizeze numai sintactic. Exemplu: Fie interogarea n Lnat: s se gseasc persoanele care au vnzri. n acest caz o fraz SELECT ce realizeaz interogarea are forma: SELECT A.NUME, A.PRENUME FROM PERSONAL A WHERE A.MARCA IN (SELECT B.MARCAV FROM VANZARI B) Exemplificm cteva interogri complexe, care necesit utilizarea limbajului intermediar Lint. Fie tabela VANZARI cu cmpurile MARCAV, CODSV codul seciei, CODPV codul produsului vndut, CANTV cantitatea vndut i tabela SECTII cu cmpurile: CODS codul seciei, DENS denumirea seciei, ETAJ etajul corespunztor seciei. Fie date urmtoarele interogri n Lnat:

1) Se gseasc toate persoanele (MARCA, NUME, PRENUME) din tabela PERSONAL, cu proprietatea c persoana respectiv vinde cel puin un produs la toate seciile existente n tabela SECTII. 2) S se gseasc toate persoanele (MARCA, NUME, PRENUME) din tabela PERSONAL, care vnd cel puin dou produse la toate seciile de la etajul 2 i vnd cel puin 2 produse numai la seciile de la etajul 2 (la alte secii nu vnd cel puin 2 produse, adic nu vnd nimic sau vnd un singur produs). S separm 2 cazuri n ceea ce privete interogarea n limbaj natural: cazul cnd interogarea nu implic utilizarea funciilor de grupare(i) i desigur cazul contrar(ii).

(i).S considerm situaia cnd interogarea nu implic funcii de grupare. Atunci fraza SELECT va trebui s conin componenta de intrare, componenta de ieire i componenta WHERE. S notm prin I(T1 a1, ..., Th ah) componenta de intrare a comenzii SELECT, unde Tj, 1 j h sunt tabelele de intrare, iar aj este aliasul local al tabelei Tj, 1 j h. Tabelele Tj nu trebuie neaprat s fie distincte, dar obligatoriu aliasurile aj sunt distincte. Notm prin O(exp1 col1, ..., expq colq) ieirea comenzii SELECT, unde expi, 1 i q sunt numele expresiilor de ieire, iar coli este numele atribuit pentru cmpul de ieire de numr i, 1iq. Referirea la <cimp> definit n tabela Tj se va face prin <aj.cimp>. Notm prin W<expresie logic> componenta WHERE a frazei SELECT.

Forma general a unei expresii n limbajul Lint va fi: E I(T1 a1, ..., Th ah) O (exp1 col1,..., expq colq) W<expresie logic>. Rmne de exprimat <expresie logic> n limbajul Lint. S notm prin TRAN(E) transformata expresiei E ntr-o fraz SELECT. Avem TRAN(E): SELECT exp1 AS col1, ..., expq AS colq FROM T1 a1, ..., Th ah WHERE TRAN (<expresie logic>)

Vom defini expresii n limbajul Lint i pentru fiecare E Lint, definim TRAN(E), care va fi n general o secvent (subcuvnt) al unei fraze SELECT. Pentru unele expresii E, TRAN(E) va fi o expresie elementar a componentei WHERE a frazei SELECT. Expresiile limbajului intermediar Lint sunt urmtoarele: 1) E aj.cimp (T aj), n care T este o tabel cu aliasul local aj, iar cimp este definit n tabela T. Semantica expresiei E: cimp este definit n T (apare n structura lui T). Definim TRAN(E) astfel: SELECT aj.cimp FROM T aj Se remarc faptul c TRAN(E) reprezint mulimea valorilor pentru cimp din coninutul curent al tabelei T.

2) E (a1.cimp1, ..., am.cimpm) (T1 a1) ...(Tm am), unde Ti, 1 i m sunt tabele, ai este aliasul lui Ti, 1 i m, iar cimpi este definit n tabela Ti, 1 im. Semantica expresiei E este: cimpi este definit n tabela Ti, 1im. Transformarea expresiei E ca segment al frazei SELECT va fi TRAN(E): SELECT a1.cimp1, ..., am.cimpm FROM T1 a1,..., Tm am

) E (a

.cimp 1 1, ..., a

.cimpm) (T1 b1) ...(Tq bq), unde Ti, m 1 i q sunt tabele, bi este aliasul lui Ti, 1 i q, {b ,..., bq}, a j 1
j = 1, m

a , j1 j m sunt alias-uri, astfel nct:

i =.Dar 1, q pot s coincid. Dac Evident, bi sunt distincte, a j a =b , atunci i este unic i cimpj este definit n tabela Ti. ji Expresia de forma 3) este mai general dect cea de forma 2), permind n lista de cmpuri s apar mai multe cmpuri definite n aceeai tabel. Semantica expresiei E este: cimpj este definit n tabela Ti, unde i are proprietatea a j = b . Reprezentarea expresiei E ca segment al unei fraze

SELECT, notat prin TRAN(E) va fi: SELECT a .cimp 1 1, ..., a .cimp m m FROM T1 b1,...,Tq bq

4) E aj.cimp (T b) [b.cimp'] Variabila cimp este definit ntr-o tabel cu aliasul aj, T este o tabel cu aliasul b, iar cimp' este un cmp definit n tabela T. Operatorul este diferit de operatorul , deoarece va avea o alt semantic. Dac v 1 ... h este vectorul curent de nregistrri, pentru care se evalueaz aceast expresie, atunci s notm cu v1 valoarea lui aj.cimp pentru acest vector, adic v1 = aj.cimp( v 1 ... h). S notm cu E(

v 1 ... h ) valoarea expresiei E pentru vectorul v 1 ... h


Atunci definim: E( v 1 ... ) = h

TRUE dac v1 T[cimp'] FALSE altfel

Expresia T[cimp'] noteaz proiecia tabelei T pe atributul cimp'. Transformarea expresiei E ca segment al frazei SELECT (de ast dat va fi o condiie elementar a componentei WHERE a frazei SELECT) este definit astfel: TRAN(E) aj.cimp IN (SELECT b.cimp' FROM T b). n continuare definim o expresie similar cu cea de tipul 4), dar mai general: 5) E (a1.cimp1, ..., am.cimpm) (T1 b1) ...(Tm bm)[

,..., b m .cimp b1.cimp1 ] unde Ti sunt tabele cu aliasul bi, m


i = 1, m
bi .cimp i

este un atribut definit n tabela Ti, 1 i m, iar aj.cimpj este un cmp definit n tabela cu aliasul aj, j = 1, m

Semantica expresiei E este: vectorul valorilor curente pentru ai.cimpi, i = 1, m aparine mulimii definite de produsul catezian

,..., cimp al tabelelor T1, ..., Tm proiectat pe atributele cimp1 m

Ca i n cazul 4) pentru vectorul de nregistrri curent

v 1 ... h

definim E( v 1 ... h ), deci valoarea expresiei E pentru acest vector. Fie vectorul de valori w= (w1, ..., wm), unde wi = ai.cimpi( v 1 ... h ), i = 1, m , deci wi este valoarea atributului ai.cimpi pentru v 1 ... h Fie M= T1 T2 ... Tm, produsul cartezian al coninutului curent al tabelelor Tj, j = 1, m

Definim: E( v 1) ...= h

,..., b m .cimp TRUE dac w M[b1.cimp1 m] FALSE altfel

,..., b m .cimp noteaz proiecia relaiei unde M[ b1.cimp1 m ] ,..., b m .cimp M pe atributele b1.cimp1 m
Transformarea lui E ca segment al frazei SELECT, care va fi o condiie elementar a componentei WHERE (ca i n cazul 4), se realizeaz prin: TRAN(E) (a1.cimp1, ..., am.cimpm) IN (SELECT b1.cimp1 ,..., bm.cimpm FROM T1 b1, ..Tm bm ).

Se tie c aceast condiie elementar este echivalent cu: EXISTS (SELECT ,..., bm.cimpm b1.cimp1 FROM T1 b1, ..Tm bm a= WHERE( b1.cimp1 1.cimp1)AND... am.cimpm) bm.cimpm = AND (

6) Considerm tot operatorul , dar cu o expresie mai general dect cea de la punctul 5). E (a1.cimp1, ..., am.cimpm) (T1 b1) ...(Tq bq) ,..., b i .cimp [ bi .cimp1 j = 1, q ] unde Tj sunt tabele, m
1 m

cu aliasurile bj, respectiv;

bi j .cimpj este un cmp definit n tabela

Ti j

j = 1, m , deci ij{1, 2, ...,q}, j = 1, m Aliasurile b1, ...,bq sunt distincte, iar aj.cimpj este un atribut definit ntr-o tabel de alias aj, j = 1, m
,

Definim valoarea expresiei E pentru vectorul curent de nregistrri

v 1 ... h. Fie w = (w1, ..,wm), unde wi = ai.cimpi( v ... ), i = 1, m


1 h

i M = T1 ... Tq, produsul cartezian al tabelelor Ti, i = 1, q


... E( v 1 ) =h

,..., bim .cimp TRUE dac w M[bi1 .cimp1 m] FALSE altfel

,..., b im .cimp Prin M[ bi1 .cimp1 m ] se noteaz proiecia mulimii M ,..., bim .cimp pe cmpurile bi1 .cimp1 m
Att in cazul 5), ct i n cazul 6) trebuie ca tip(aj.cimpj) = tip( bi j .cimpj ), j = 1, m , iar pentru 4) tip(aj.cimp) = tip(b.cimp').

Transformarea lui E ca segment al frazei SELECT, care va fi o condiie elementar a componentei WHERE, este urmtoarea: TRAN(E) (a1.cimp1, ..., am.cimpm) IN ,..., bi .cimpm (SELECT bi .cimp1
1 m

FROM T1 b1, ..., Tq bq) Ca i n cazul 5), TRAN(E) este echivalent cu o condiie elementar exprimat prin EXISTS. Expresia 6) permite ca mai multe cmpuri de forma

bi j .cimpj s fie definite n aceeai tabel.

7) E ( aj.cimp) [aj.cimp(T aj)E1] T este o tabel de alias aj, cimp este definit n tabela T, iar E1 este o alt expresie n limbaj intermediar. Simbolul este cuantificatorul de existen. Semantica expresiei E este: expresia E este adevrat, dac exist o valoare pentru aj.cimp ntre valorile tabelei T proiectate pe aj.cimp, astfel nct s fie satisfcut expresia E1. Presupunnd c am definit TRAN(E1), atunci transformata expresiei E este urmtoarea: TRAN(E) EXISTS (SELECT aj.cimp FROM T aj WHERE TRAN(E1)) Evident TRAN(E) este o condiie elementar a componentei WHERE a frazei SELECT.

S definim formal semantica expresiei E pentru vectorul de nregistrri curente v 1 ... h . Expresia E1 depinde de aj.cimp i de

v 1 ... h

. Pentru o valoare v cu tip(v)=tip(aj.cimp) i vectorul

v 1 ... h , s notm prin E1(v, v 1 ... h ) rezultatul evalurii expresiei E1. Definim E( v 1 ... h ) prin:
E( v 1 ... ) = h
TRUE, dac v T[aj.cimp],astfel nct: E1 v, v1...h = TRUE FALSE altfel

Expresia T(aj.cimp) noteaz proiecia tabelei T pe atributul aj.cimp.

Exemplul 10: Fie date tabelele PERSONAL i VANZARI cu cmpurile specificate anterior. Se cere s se afieze toate persoanele care au cel puin o vnzare. Expresia E ce precizeaz intrarea i ieirea comenzii va fi: E O(A.MARCA, A.NUME, A. PRENUME) I (PERSONAL A) W E1 Expresia E1 trebuie s reprezinte faptul c valoarea lui A.MARCA s apar n VANZARI, n sensul s existe n VANZARI o nregistrare cu valoarea lui MARCAV egal cu valoarea curent pentru A.MARCA. E1 ( B.MARCAV) [B.MARCAV(VANZARI B) E2] E2 (B.MARCAV = A.MARCA) Rezult c TRAN(E2) E2.

TRAN(E1) EXISTS (SELECT B.MARCAV FROM VANZARI B WHERE TRAN(E2)) TRAN(E) SELECT A.MARCA, A.NUME, A.PRENUME FROM PERSONAL A WHERE TRAN(E1) Realiznd nlocuirile obinem comanda: SELECT A.MARCA, A.NUME, A.PRENUME FROM PERSONAL A WHERE EXISTS (SELECT B.MARCAV FROM VANZARI B WHERE (B.MARCAV = A.MARCA))

8) E (a1.cimp1, ..., am.cimpm)[ a1.cimp1 (T1 a1) ... am.cimpm (Tm am) E1] Semantica lui E este: exist un vector de valori pentru a1.cimp1, ..., am.cimpm, astfel nct s fie satisfcut expresia E1. Variabila aj.cimpj este definit n tabela tj cu aliasul aj, 1jm. Evident expresia E1 poate depinde de variabilele aj.cimpj, 1 jm. Cmpurile aj.cimpj, 1 jm se mai numesc variabile individuale ale expresiei E. Transformarea lui E n limbajul LSEL va fi o expresie elementar a componentei WHERE: TRAN(E) EXISTS (SELECT a1.cimp1, ..., am.cimpm T FROM T1b1,...., bPp WHERE TRAN(E1) )

unde b1, ..., bp sunt aliasurile distincte din irul a1, ..., am. Pentru fiecare aj exist un unic bk, cu proprietatea aj = bk; n acest caz aj.cimpj este definit n tabela Tk cu aliasul bk. Este deci posibil, ca mai multe atribute s fie definite n aceeai tabel. Desigur c, o aceeai tabel poate s apar de mai multe ori n componenta FROM, dar cu aliasuri diferite. S specificm formal semantica expresiei E pentru vectorul de nregistr ri curente v 1 ... h n general, expresia E1 depinde de . a1.cimp1, ..., am.cimpm i de v 1 ... h Dac vj este o valoare de tip egal cu tipul lui aj.cimpj, atunci E1 se evalueaz pentru v1, ..., vm i v 1 ... h S notm rezultatul acestei evaluri cu E1(v1, ..., vm, v 1 ... h ). Evaluarea expresiei E pentru vectorul curent v 1 ... h o vom defini prin:

E(

v 1 ... h

TRUE, dac v j Tj[a j .cimp j ], j = 1, m a.. E1 v1 ,..., vm , v1 ...h = TRUE = FALSE altfel

Notaia T[aj.cimpj] specific proiecia tabelei T pe aj.cimpj,


j = 1, m

9) E (aj.cimp)[aj.cimp (T aj) E1] aj.cimp este un atribut definit n tabela T cu aliasul aj, simbolul este cuantificatorul universal, iar simbolul "" este implicaia logic. E1 este o expresie a limbajului Lint.

Semantica lui E este urmtoarea: E este adevrat dac pentru orice valoare a cmpului aj.cimp din tabela T, avem adevrat expresia E1. Formal, aceast semantic o vom exprima astfel: fie v 1 ... h
vectorul de nregistrri curente la care se aplic E. Expresia E1 depinde de aj.cimp i de vectorul de nregistrri v 1 ... h S notm cu E1(v, v 1 ... h ) valoarea expresiei E1 pentru valoarea v a cmpului aj.cimp i pentru vectorul de nregistrri

v 1 ... h . Valoarea lui E pentru v 1 ... h , notat E(v ... )


1 h

va fi definit astfel: E( v 1 ... h ) = TRUE, dac pentru v T[a j .cimp], avem E1 ( v, v ... ) = TRUE
FALSE altfel
1 h

Notaia T[aj.cimp] specific proiecia tabelei T pe cmpul aj.cimp. Pentru exprimarea expresiei E n limbajul LSEL, va trebui s transformm formula E cu cuantificatorul "" ntr-o formul echivalent ce utilizeaz cuantificatorul "", deoarece n LSEL putem exprima numai cuantificatorul "", prin expresii elementare de forma: EXISTS (SELECT ...). Formula din limbajul Lint de forma E (x)[F E1] este echivalent cu (x)[(F E1)] (x)[(F E1)] ( x)[F E1]. Rezult c transformarea lui E n limbajul LSEL va fi: TRAN(E) NOT EXISTS (SELECT aj.cimp FROM T aj WHERE NOT TRAN(E1))

Desigur c, se calculeaz n prealabil TRAN(E1). Simbolul "" noteaz negaia logic. 10) E ( a1.cimp1, ..., am.cimp)[ a1.cimp1 (T1 a1) ... am.cimpm (Tm am) E1], unde Ti sunt tabele cu aliasurile ai, i = 1, m iar ai.cimpi este definit n tabela Ti. Semantica lui E: expresia E este adevrat dac pentru orice valoare a cmpurilor aj.cimpj din tabela Tj, j = 1, m avem expresia E1 adevrat. Expresia E1 poate depinde att de aj.cimpj, j = 1, m , ct i de v 1 ... h

Dac vj este o valoare de tip egal cu tip(aj.cimpj), j = 1, m atunci s notm prin E1(v1, ..., vm, v 1 ... h ), evaluarea lui E1 pentru irul de valori vj, j = 1, m i vectorul de nregistrri

v 1 ... h

este astfel definit: Valoarea lui E pentru vectorul v 1 ... h E( v 1 ... h ) = TRUE, dac pentru v j Tj[a j .cimp j ], j = 1, m , avem
E1 v1 ,..., v m , v 1 ...h = TRUE FALSE altfel

Tj[aj.cimpj] noteaz proiecia tabelei Tj pe atributul aj.cimpj, j = 1, m Este posibil ca mai multe cmpuri aj.cimpj s fie definite n aceeai tabel. De aceea, ca i la expresiile 8), s notm cu b1, ..., bp aliasurile distincte din irul a1, ..., am. Avem astfel tabelele T1 ,...., T P cu aliasurile b1, ..., bp, respectiv. Pentru fiecare aj (1jm), exist unic bk, (1kp), astfel inct aj = bk. Atunci aj.cimpj este definit n tabela Tk cu aliasul bk. O tabel poate s apar de mai multe ori n componenta FROM, dar cu alias-uri diferite. innd cont de transformarea cuantificatorului "" ntr-o expresie n care se utilizeaz cuantificatorul "" i negaia "", definit la expresiile de tip 9), rezult c transformata TRAN(E) a expresiei E va fi:

TRAN(E) NOT EXISTS (SELECT a1.cimp1, ..., am.cimpm FROM Tb1,...., b T 1 P p WHERE NOT TRAN (E1)) Desigur n expresiile de tip 7), 8), 9) i 10), expresia E1 poate fi o expresie n limbaj intermediar sau orice expresie logic a limbajului LSEL. n ultimul caz, considerm TRAN(E1) = E1. Rezult c, utiliznd expresiile 1) -10), putem construi expresii n Lint i n acelai timp s obinem transformarea lor n expresii n LSEL, rezultnd n final o fraz SELECT corespunztoare expresiei Lint.

Exemplul 11. Considerm tabelele: a) SECTII cu atributele: CODS (codul seciei) cheie unic, DENS denumirea seciei, ETAJ etajul seciei respective. b) PRODUS cu atributele: CODP- codul produsului cheie unic, DENP denumire produs, PRET- preul unitar al produsului respectiv. c) FURNIZOR cu CODF- codul furnizorului cheie unic, NUMEF nume furnizor, ADRESAF adresa furnizorului. d) FURNIZEAZA cu CODF codul furnizorului, CODS codul seciei n care se face furnizarea, CODP codul produsului furnizat, CANT cantitatea furnizat din produsul CODP la secia CODS de ctre furnizorul CODF.

1) Fie dat interogarea: s se gseasc produsele (A.CODP, A.DENP) din PRODUS (aliasul A) cu proprietatea c A.CODP este furnizat la toate seciile din tabela SECTII. E O(A.CODP, A.DENP) I (PRODUS A) W E1 E1 corespunde la proprietatea A.CODP este furnizat la toate seciile din tabela SECTII. E1 ( B.CODS) [B.CODS (SECTII B) E2] E2 corespunde la faptul c perechea (A.CODP, B.CODS) apare n tabela FURNIZEAZA. E2 (A. CODP, B. CODS) (FURNIZEAZA C) [C.CODP, C.CODS] Folosind regulile de transformare definite pentru expresii, obinem:

TRAN(E2) (A.CODP, B.CODS) IN (SELECT C.CODP, C.CODS FROM FURNIZEAZA C) TRAN(E1) NOT EXISTS (SELECT B. CODS FROM SECTII B WHERE NOT TRAN(E2)) TRAN(E) SELECT A.CODP, A.DENP FROM PRODUS A WHERE TRAN(E1)

innd cont de faptul c expresia NOT ((A.CODP, B.CODS) IN (SELECT...)) este echivalent cu (A.CODP, B.CODS) NOT IN (SELECT ...), obinem: TRAN(E) SELECT A.CODP, A.DENP FROM PRODUS A WHERE NOT EXISTS (SELECT B.CODS FROM SECTII B WHERE (A.CODP,B.CODS) NOT IN (SELECT C.CODP, C.CODS FROM FURNIZEAZA C))

2) Considerm acum interogarea: S se gseasc produsele din tabela PRODUS cu proprietatea c pentru orice secie din tabela SECTII situat la etajul 1, produsul este furnizat de toi furnizorii din tabela FURNIZORI. E O(A.CODP, A.DENP) I (PRODUS A) W E1 E1 ( B.CODS) [(B.CODS)(SECTII B)(B.BETAJ = 1)E2] E2 ( C.CODF) [(C.CODF)(FURNIZOR C) E3] E3 se asociaz pentru proprietatea: tripleta A.CODP, B.CODS, C.CODF apare n tabela FURNIZEAZA. E3 (A.CODP, B.CODS, C.CODF) (FURNZEAZA D) [D.CODP, D.CODS, D.CODF]

Rezult expresiile respective din limbajul LSEL: TRAN(E3) (a.codp, b.cods, c.codf) IN (SELECT D.CODP, D.CODS, D.CODF FROM FURNIZEAZA D) TRAN(E2) NOT EXISTS (SELECT C.CODF FROM FURNIZOR C WHERE NOT TRAN(E3)) TRAN(E1) NOT EXISTS (SELECT B.CODS FROM SECTII B WHERE B.ETAJ = 1 AND NOT TRAN(E2)) TRAN(E) SELECT A.CODP, A.DENP FROM PRODUS A WHERE TRAN(E1)

Realiznd nlocuirile se obine comanda SELECT pentru interogarea dat. Desigur, se poate nlocui subexpresia NOT((c1, c2) IN (SELECT...)) prin (c1, c2) NOT IN (SELECT..) i NOT NOT EXISTS (SELECT ...) prin EXISTS (SELECT ...). 3) Fie dat interogarea: s se gseasc produsele din PRODUS cu proprietatea c pentru orice secie din SECTII, situat la etajul 1, produsul respectiv este furnizat de toi furnizorii din FURNIZORI i produsul respectiv este furnizat de toi furnizorii din FURNIZORI numai la seciile de la etajul 1. Se remarc c interogarea are o prim parte ce coincide cu interogarea precedent, iar partea a doua trebuie analizat separat. ). E O(A.CODP, A.DENP) I (PRODUS A) W (E1 E1

E1 este expresia din interogarea precedent. Rmne s . Aceasta corespunde la interogarea exprimm expresia E1 n limbajul Lnat: dac produsul respectiv (A.CODP) este furnizat de toi furnizorii, atunci acest produs este furnizat numai seciilor de la etajul 1(pentru orice secie s cu ETAJ diferit de 1, A.CODP nu ii este furnizat). (E.CODF) [E.CODF (FURNIZOR E) (A.CODP, E.CODF) E1 FURNIZEAZA F [F.CODP, F.CODF] ] E 2
E 2

(G.CODS)[G.CODS(SECTII G) (G.ETAJ 1) (A.CODP, G.CODS) NOT FURNIZEAZA H[H.CODP, H.CODS]] TRAN( ) NOT EXISTS E 2 (SELECT G.CODS FROM SECTII G WHERE (G.ETAJ<>1)AND (A.CODP,G.CODS)IN (SELECT H.CODP, H.CODS FROM FURNIZEAZA H))

TRAN(

NOT EXISTS E1 ) (SELECT E.CODF FROM FURNIZOR E WHERE (A.CODP, E.CODF) IN (SELECT F.CODP, F.CODF FROM FURNIZEAZA F) AND NOT TRAN( ))E2 TRAN(E) SELECT A.CODP, A.DENP FROM PRODUS A )1 WHERE TRAN(E1) AND TRAN( E

) nlocuind TRAN(E1) din exemplul precedent i TRAN( E1 calculat mai sus, se obine TRAN(E) o interogare SELECT ce realizeaz interogarea dorit (evident nu este singura comand SELECT pentru interogarea dat). (ii).S considerm acum cazul cnd interogarea n limbaj natural conine expresii de grupare pentru calcule de forma minim, maxim, sum, numrare, medie de valori. O metod pentru abordarea unor astfel de interogri va fi utilizarea definirii de tabele temporare n componenta FROM a comenzii SELECT. n acest caz componenta FROM a comenzii SELECT are forma: FROM T1 a1, ..., Th ah Ti este fie numele unei tabele, fie o expresie de forma (SELECT ...), deci o subselecie ce definete prin comanda SELECT o tabel numit tabel temporar

O astfel de subselecie conine componenta expresiile de ieire, componenta FROM (obligatorii) i poate conine GROUP BY, HAVING cu expresii funcii de grupare i subselecii n operandul al doilea al unei expresii din HAVING. Subinterogarea ce definete tabela temporar poate avea un numr oarecare de subselecii i nivele de selecie. Rezult c o comand SELECT ce are n componenta FROM numai tabele temporare va avea componentele de ieire i componenta FROM de tipul urmtor: SELECT exp1[AS c1], ..., expq[AS cq] FROM (SELECT ...) A1, (SELECT ...) A2,..., (SELECT ...) Ah

Subseleciile din FROM definesc tabele temporare, notate cu , avnd aliasurile A1, ... ,Ah, respectiv. Aceste aliasuri sunt obligatorii pentru a face referin la cmpurile tabelelor T, j = 1, h . Din punct de vedere al execuiei acestei comenzi SELECT, se evalueaz nti aceste tabele temporare. Evident aliasurile A1, A2,... ,Ah sunt distincte. Am notat expresia general n limbajul Lint ce corespunde unei interogri fr GROUP i HAVING prin: E O(exp1 c1, ..., expq cq) I(T1 a1, ..., Th ah) W E1, unde E1 este o expresie n limbajul Lint, construit utiliznd expresiile de tip 1) 10) ale lui Lint. n cazul n care, interogarea implic funcii agregat, atunci vom nota expresia n limbajul Lint prin: E O(exp1 c1, ..., expq cq) I(T1 a1, ..., Th ah) W E1 G g1, ..., gs H E 2
j

T1' ,..., Th'

unde E1 i E2 sunt expresii n limbaj intermediar, gi, i = 1,s sunt expresiile de grupare. Expresiile expj, j = 1, q pot conine funcii agregat. Expresia E2 are una din urmtoarele forme: 1) E2 expi <constant>, unde expi este una din expresiile de ieire ale comenzii, este un operator de comparare, iar <constant> are tipul lui expi. Semantica lui E2: se rein clasele de nregistrri calculate de componenta Gg1, ...,gs care satisfac expresia E2. 2) E2 COUNT(cimp) <constant>, unde cimp este definit n una din tabelele de intrare, este operator de comparare, <constant> este de tip numeric. Se calculeaz E2 pentru fiecare clas de nregistrri definit de componenta Gg1, ...,gs. Se rein clasele ce satisfac expresia E2.

3) E2 expi (E"), unde E" este o expresie n limbajul Lint de ,..., gH forma E" O(exp')I(T1 b1, ..., Tr br) W E3 G g1 E h 2 unde exp' este unica expresie de ieire a expresiei E" i are acelai tip cu expi, E3 este expresia din componenta t WHERE, gj , j = 1, sunt cmpurile dup care se face gruparea, iar este expresia din componenta HAVING. Simbolul este un E 2 operator de comparare. poate utiliza, ca operanzi, expresiile de E Expresia 2 ieire expj ale expresiei E. Pentru 1) i 2) transformarea lui E2 ca secven a frazei SELECT se realizeaz prin TRAN(E2) = E2. Pentru 3) avem: TRAN(E2) expi (TRAN(E")). Expresia E2 din 3) este adevrat pentru clasa de nregistrri curent, dac valoarea lui expi pentru clasa curent este n relaia cu valoarea lui exp', calculat de fraza SELECT corespunztoare lui E".

4) E2 <constant> (E"), unde E" se definete ca la 3). Expresia E2 este adevrat pentru clasa curent, dac valoarea constantei <constant> este n relaia cu exp' calculat de fraza SELECT corespunztoare lui E". Dac expresia E 2 din expresia E" face referiri la expresiile expj, 1 j q de ieire ale expresiei E, atunci valoarea exp' din E" depinde de clasele definite de expresia E. Transformarea ca secven a frazei SELECT va fi: TRAN(E2) constant (TRAN(E")). Observaie: n cazurile 3) i 4) TRAN(E2) va avea forma sintactic: expi (SELECT exp' FROM ...), respectiv constanta (SELECT exp' FROM ...) Att n expresiile de tipul 1) ct i n cele de tipul 3), drept prin operand, putem avea o expresie, ce are ca elemente primare expresiile de ieire: exp1, ..expq

De asemenea, drept prim operand poate fi o expresie ce conine funcii agregat, expresie ce corespunde unei clase de nregistrri definit de componenta GROUP BY (G g1, ..., gs) i care se evalueaz pentru fiecare clas definit de GROUP BY. Rezult c, n cadrul componentei H avem o clas curent de considerat, spre deosebire de componenta W, unde avem un vector curent de nregistrri. Clasele sunt calculate de componenta G n maniera descris n paragraful I.1.

Exemplul 12. Considerm tabelele SECTII, PRODUS, FURNIZOR, FURNIZEAZA, VANZARI specificate mai sus. Se cer produsele (din tabela PRODUS) furnizate la cel puin o secie s cu proprietatea c valoarea total a vnzrilor realizate n s este mai mare dect o treime din valoarea total de vnzare. Pentru realizarea interogrii, putem defini dou tabele temporare: T1 ce utilizeaz funcia agregat SUM pentru a calcula valoarea total a vnzrilor pentru o secie i T2 ce calculeaz valoarea total a vnzrilor pentru toate seciile. Tabela T1 va calcula pentru fiecare s, valoarea de vnzare realizat la secia s, iar T2 va calcula valoarea tuturor vnzrilor. Pentru T1 avem expresia E1:

E1 O(F.CODSV, SUM(F.CANTV * E.PRET) AS VAL1) I (PRODUS E, VANZARI F) W (E.CODP = F.CODPV) G F.CODSV Pentru T2 avem expresia E2: E2 O(SUM(H.CANTV * I.PRET) AS VAL2) I (VANZARI H, PRODUS I) W (H.CODPV = I.CODP) Interogarea dat va avea expresia E: E O(C.CODP, C.DENP) I((E1) A, (E2) B, PRODUS C) W (D.CODS) [D.CODS SECTII D ] (C.CODP, D.CODS) FURNIZEAZA [H.CODP, H.CODS] (D.CODS = A.CODSV)(A.VAL1* 3 > B.VAL2)

Transformrile ca secvene ale frazei SELECT vor fi: TRAN() (C.CODP, D.CODS) IN (SELECT H.CODP, H.CODS FROM FURNIZEAZA H) TRAN() (D.CODS = A.CODSV) AND (A.VAL1*3>B.VAL2) TRAN() EXISTS (SELECT D.CODS FROM SECTII D WHERE TRAN() AND TRAN())

TRAN(E) SELECT C.CODP, C.DENP FROM (TRAN(E1)) A,(TRAN(E2)) B,PRODUS C WHERE TRAN() TRAN(E1) SELECT F.CODSV, SUM(F.CANTV*E.PRET) AS VAL1 FROM PRODUS E, VANZARI F WHERE (E.CODP =F.CODPV) GROUP BY F.CODSV TRAN(E2) SELECT SUM(H.CANTV*I.PRET) AS VAL2 FROM VANZARI H, PRODUS I WHERE (H.CODPV = I.CODP)

Realiznd nlocuirile, vom avea comanda ce corespunde interogrii date: SELECT C.CODP, C.DENP FROM (SELECT F.CODSV,SUM(F.CANTV*E.PRET) AS VAL1 FROM PRODUS E, VANZARI F WHERE (E.CODP =F.CODPV) GROUP BY F.CODSV) A, (SELECT SUM(H.CANTV*I.PRET) AS VAL2 FROM VANZARI H, PRODUS I WHERE (H.CODPV = I.CODP)) B,

PRODUS C WHERE EXISTS (SELECT D.CODS FROM SECTII D WHERE (C.CODP, D.CODS) IN (SELECT H.CODP, H.CODS FROM FURNIZEAZA H) AND (D.CODS = A.CODSV) AND (A.VAL1*3>B.VAL2) )

Exemplul 13.S se gseasc seciile s (din SECTII) cu proprietatea c valoarea total a vnzrilor n acea secie s este mai mare dect jumtate din valoarea total furnizat seciei s. Vom considera dou tabele temporare T1 i T2, n care T1 va conine perechi de forma (s1,v1), unde v1 este valoarea vnzrilor din secia s1, iar T2 conine perechile de forma (s2, v2), unde v2 este valoarea total a produselor furnizate seciei s2. T1 este definit de expresia E1: E1 (E.CODSV, SUM(E.CANTV*F.PRET)AS VAL1)I(VANZARI E, PRODUS F) W (E.CODPV = F.CODP) G E.CODSV TRAN(E1) SELECT E.CODSV, SUM(E.CANTV*F.PRET) AS VAL1 FROM VANZARI E, PRODUS F WHERE (E.CODPV = F.CODP) GROUP BY E.CODSV

T2 va fi definit de expresia E2: E2 (I.CODS, SUM(I.CANT*J.PRET) AS VAL2) I (FURNIZEAZA I, PRODUS J) W(I.CODP = J.CODP) G I.CODS TRAN (E2) SELECT I.CODS, SUM(I.CANT*J.PRET) AS VAL2 FROM FURNIZEAZA I, PRODUS J WHERE (I.CODP = J.CODP) GROUP BY I.CODS

Pentru interogarea dat considerm expresia E din limbajul Lint: E O(C.CODS) I ((E1) A, (E2) B, SECTII C) W (C.CODS = A.CODSV) (C.CODS = B.CODS) (A.VAL1*2>B.VAL2) TRAN (E) SELECT C.CODS FROM (TRAN(E1)) A, (TRAN(E2)) B, SECTII C WHERE TRAN()

TRAN() se obine din nlocuind conjuncia cu AND. Realiznd substituiile, obinem: SELECT C.CODS FROM (SELECT E.CODSV, SUM(E.CANTV*F.PRET) AS VAL1 FROM VANZARI E, PRODUS F WHERE (E.CODPV = F.CODP) GROUP BY E.CODSV) A, (SELECT I.CODS, SUM(I.CANT*J.PRET) AS VAL2 FROM FURNIZEAZA I, PRODUS J WHERE (I.CODP = J.CODP) GROUP BY I.CODS) B, SECTII C WHERE (C.CODS = A.CODSV) AND (C.CODS = B.CODS) AND (A.VAL1*2>B.VAL2)

Aceeai interogare o putem exprima printr-o fraz SELECT n maniera urmtoare: SELECT C.CODS FROM SECTII C, VANZARI A, PRODUS F WHERE (C.CODS=A.CODSV) AND (A.CODPV=F.CODP) GROUP BY C.CODS HAVING SUM(A.CANTV*F.PRET)*2> (SELECT SUM(I.CANT*J.PRET) FROM FURNIZEAZA I, PRODUS J WHERE (I.CODP=J.CODP) AND (I.CODS=C.CODS) GROUP BY I.CODS)

Primul operand al componentei HAVING calculeaz pentru o secie C.CODS, dublul valorii totale vndute de produse n secia C.CODS. Al doilea operand al componentei HAVING calculeaz valoarea total a produselor furnizate seciei C.CODS.

S-ar putea să vă placă și