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
1

j
a

j
a

j 1, m =
) E (a .cimp
1
, ..., a .cimp
m
) (T
1
b
1
) ...(T
q
b
q
), unde T
i
,
1 i q sunt tabele, b
i
este aliasul
lui T
i
, 1 i q,
, 1 j m sunt alias-uri, astfel nct: {b
1
,..., b
q
},
i 1, q =
j
a

j
a

j
a

Evident, b
i
sunt distincte, .Dar pot s coincid. Dac
= b
i
, atunci i este unic i cimp
j
este definit n tabela T
i
.
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: cimp
j
este definit n tabela T
i
,
unde i are proprietatea
= b
i
. Reprezentarea expresiei E ca segment al unei fraze
SELECT, notat prin TRAN(E) va fi:
SELECT a
.cimp
1
, ..., a
.cimp
m
FROM T
1
b
1
,...,T
q
b
q
1
...
h
v

1
...
h
v

1
...
h
v

1
...
h
v

1
...
h
v

1
TRUE dac v T[cimp']
FALSE altfel

4) E a
j
.cimp (T b) [b.cimp']
Variabila cimp este definit ntr-o tabel cu aliasul a
j
, 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
este vectorul curent de nregistrri, pentru care se evalueaz
aceast expresie, atunci s notm cu v
1
valoarea lui a
j
.cimp
pentru acest vector, adic v
1
= a
j
.cimp(
). S notm cu E(
) valoarea expresiei E pentru vectorul
Atunci definim:
E(
) =
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) a
j
.cimp IN (SELECT b.cimp' FROM T b).
n continuare definim o expresie similar cu cea de tipul 4),
dar mai general:
5) E (a
1
.cimp
1
, ..., a
m
.cimp
m
) (T
1
b
1
) ...(T
m
b
m
)[
1 1 m m
b .cimp ,..., b .cimp

] unde T
i
sunt tabele cu aliasul b
i
,
i 1, m =
i i
b .cimp

j 1, m =
este un atribut definit n tabela T
i
, 1 i m, iar a
j
.cimp
j
este
un cmp definit n tabela cu aliasul a
j
,
i 1, m =
1 m
cimp ,..., cimp

1
...
h
v

1
...
h
v

1
...
h
v

i 1, m =
1
...
h
v

Semantica expresiei E este: vectorul valorilor curente pentru
a
i
.cimp
i
,
aparine mulimii definite de produsul catezian
al tabelelor T
1
, ..., T
m
proiectat pe atributele
Ca i n cazul 4) pentru vectorul de nregistrri curent
definim E( ), deci valoarea expresiei E pentru acest
vector.
Fie vectorul de valori w= (w
1
, ..., w
m
), unde w
i
= a
i
.cimp
i
(
),
, deci w
i
este valoarea atributului a
i
.cimp
i
pentru
j 1, m =
Fie M= T
1
T
2
... T
m
, produsul cartezian al coninutului curent
al tabelelor T
j
,
1
...
h
v

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

Definim:
E(
) =
1 1 m m
b .cimp ,..., b .cimp

1 1 m m
b .cimp ,..., b .cimp

unde M[ ] noteaz proiecia relaiei
M pe atributele

1 1 m m
b. ci mp , . . . , b . ci mp
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) (a
1
.cimp
1
, ..., a
m
.cimp
m
) IN
(SELECT
FROM T
1
b
1
, ..T
m
b
m
).

1 1 m m
b. ci mp , . . . , b . ci mp
Se tie c aceast condiie elementar este echivalent cu:
EXISTS (SELECT

1 1
b. ci mp =

=
m m
b . ci mp
FROM T
1
b
1
, ..T
m
b
m
WHERE(
a
1
.cimp
1
)AND...
AND (
a
m
.cimp
m
)
1 m
i 1 i m
b .cimp ,..., b .cimp

j 1, q =
6) Considerm tot operatorul , dar cu o
expresie mai general dect cea de la punctul 5).
E (a
1
.cimp
1
, ..., a
m
.cimp
m
) (T
1
b
1
) ...(T
q
b
q
)
[
] unde T
j
sunt tabele,
j
i j
b .cimp

j
i
T
j 1, m =
j 1, m =
j 1, m =
cu aliasurile b
j
, respectiv; este un cmp definit n tabela
,
, deci i
j
{1, 2, ...,q},
Aliasurile b
1
, ...,b
q
sunt distincte, iar a
j
.cimp
j
este un atribut
definit ntr-o tabel de alias a
j
,
1
...
h
v

1
...
h
v

i 1, m =
Definim valoarea expresiei E pentru vectorul curent de nregistrri
. Fie w = (w
1
, ..,w
m
), unde w
i
= a
i
.cimp
i
( ),
i M = T
1
... T
q
, produsul cartezian al tabelelor T
i
,
i 1, q =
1
...
h
v

1 m
i 1 i m
TRUE dac w M[b .cimp ,..., b .cimp ]
FALSE altfel

E( ) =
1 m
i 1 i m
b .cimp ,..., b .cimp

1 m
i 1 i m
b .cimp ,..., b .cimp

j
i j
b .cimp

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

1 m
i 1 i m
b . ci mp , . . . , b . ci mp
Transformarea lui E ca segment al frazei SELECT, care va fi o
condiie elementar a componentei WHERE, este urmtoarea:
TRAN(E) (a
1
.cimp
1
, ..., a
m
.cimp
m
) IN
(SELECT
FROM T
1
b
1
, ..., T
q
b
q
)
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
j
i j
b .cimp

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.
1
...
h
v

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

1
...
h
v

1
...
h
v

1
...
h
v

. Pentru o valoare v cu tip(v)=tip(a
j
.cimp) i vectorul
, s notm prin E
1
(v, ) rezultatul evalurii
expresiei E
1
. Definim E(
) prin:
1
...
h
v

( )
1 h
j
...
1
TRUE, dac v T[a.cimp], astfel nct: E v, v TRUE
FALSE altfel

E( ) =
Expresia T(a
j
.cimp) noteaz proiecia tabelei T pe atributul a
j
.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) WE1
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))
1
T
P
T

8) E (a
1
.cimp
1
, ..., a
m
.cimp
m
)[ a
1
.cimp
1
(T
1
a
1
) ...
a
m
.cimp
m
(T
m
a
m
) E
1
]
Semantica lui E este: exist un vector de valori pentru a
1
.cimp
1
, ...,
a
m
.cimp
m
, astfel nct s fie satisfcut expresia E
1
. Variabila
a
j
.cimp
j
este definit n tabela t
j
cu aliasul a
j
, 1jm. Evident
expresia E
1
poate depinde de variabilele a
j
.cimp
j
, 1 jm.
Cmpurile a
j
.cimp
j
, 1 jm se mai numesc variabile
individuale ale expresiei E. Transformarea lui E n limbajul
L
SEL
va fi o expresie elementar a componentei WHERE:
TRAN(E) EXISTS (SELECT a
1
.cimp
1
, ..., a
m
.cimp
m
FROM b
p
WHERE TRAN(E
1
) )
b1,....,
k
T

1
...
h
v

1
...
h
v

1
...
h
v

1
...
h
v

1
...
h
v

unde b
1
, ..., b
p
sunt aliasurile distincte din irul a
1
, ..., a
m
.
Pentru fiecare a
j
exist un unic b
k
, cu proprietatea a
j
= b
k
; n
acest caz a
j
.cimp
j
este definit n tabela
cu aliasul b
k
. 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 alias-
uri diferite.
S specificm formal semantica expresiei E pentru vectorul de
nregistrri curente . n general, expresia E
1
depinde de
a
1
.cimp
1
, ..., a
m
.cimp
m
i de
Dac v
j
este o valoare de tip egal cu tipul lui a
j
.cimp
j
, atunci
E
1
se evalueaz pentru v
1
, ..., v
m
i
S notm rezultatul acestei evaluri cu E
1
(v
1
, ..., v
m
,
).
Evaluarea expresiei E pentru vectorul curent
o vom defini prin:
1
...
h
v

( )
1 h
...
j j j j 1 1 m
TRUE, dac v T[a .cimp ], j 1, m a.. E v ,..., v , v TRUE
FALSE altfel

= =

E( ) =
Notaia T[a
j
.cimp
j
] specific proiecia tabelei T pe a
j
.cimp
j
,
j 1, m =
9) E (a
j
.cimp)[a
j
.cimp (T a
j
)E
1
]
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.
1
...
h
v

Semantica lui E este urmtoarea: E este adevrat dac
pentru orice valoare a cmpului a
j
.cimp din tabela T, avem
adevrat expresia E
1
. Formal, aceast semantic o vom
exprima astfel: fie
1
...
h
v

1
...
h
v

1
...
h
v

1
...
h
v
1 h
...
E(v )

vectorul de nregistrri curente la care se aplic E. Expresia
E
1
depinde de a
j
.cimp i de vectorul de nregistrri
S notm cu E
1
(v, ) valoarea expresiei E
1
pentru
valoarea v a cmpului a
j
.cimp i pentru vectorul de nregistrri
. Valoarea lui E pentru , notat
1
...
h
v
( )
1 h
...
j 1
TRUE, dac pentru v T[a .cimp], avem E v, v TRUE
FALSE altfel

va fi definit astfel:
E(
) =
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))
i 1, m =
j 1, m =
j 1, m =
1
...
h
v

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

j 1, m =
1
...
h
v

Dac v
j
este o valoare de tip egal cu tip(a
j
.cimp
j
),
atunci s notm prin E
1
(v
1
, ..., v
m
,
), evaluarea lui
E
1
pentru irul de valori v
j
,
i vectorul de nregistrri
1
...
h
v

1
...
h
v

( )
1 h
j j j j
...
1 1 m
TRUE, dac pentru v T[a .cimp ], j 1, m , avem
E v ,..., v , v TRUE
FALSE altfel

j 1, m =
1
T

P
T

k
T

Valoarea lui E pentru vectorul este astfel definit:


E(
) =
T
j
[a
j
.cimp
j
] noteaz proiecia tabelei T
j
pe atributul a
j
.cimp
j
,
Este posibil ca mai multe cmpuri a
j
.cimp
j
s fie definite n
aceeai tabel. De aceea, ca i la expresiile 8), s notm cu b
1
,
..., b
p
aliasurile distincte din irul a
1
, ..., a
m
. Avem astfel
tabelele
,....,
cu aliasurile b
1
, ..., b
p
, respectiv. Pentru
fiecare a
j
(1jm), exist unic b
k
, (1kp), astfel inct a
j
= b
k
.
Atunci a
j
.cimp
j
este definit n tabela
cu aliasul b
k
. 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:
1
T

P
T

TRAN(E) NOT EXISTS


(SELECT a
1
.cimp
1
, ..., a
m
.cimp
m
FROM
b
1
,....,
b
p
WHERE NOT TRAN (E
1
))
Desigur n expresiile de tip 7), 8), 9) i 10), expresia E
1
poate fi
o expresie n limbaj intermediar sau orice expresie logic a
limbajului L
SEL
. n ultimul caz, considerm TRAN(E
1
) = E
1
.
Rezult c, utiliznd expresiile 1) -10), putem construi expresii
n L
int
i n acelai timp s obinem transformarea lor n expresii
n L
SEL
, rezultnd n final o fraz SELECT corespunztoare
expresiei L
int
.
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) WE1
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) WE1
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((c
1
, c
2
) IN (SELECT...)) prin (c
1
, c
2
) 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(E
1

1
E

).
1
E

1
E

2
E

2
E

2
E

E
1
este expresia din interogarea precedent. Rmne s
exprimm expresia
. Aceasta corespunde la interogarea
n limbajul L
nat
: 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)
FURNIZEAZA F [F.CODP, F.CODF]
]
(G.CODS)[G.CODS(SECTII G) (G.ETAJ 1) (A.CODP,
G.CODS) NOT
FURNIZEAZA H[H.CODP, H.CODS]]
TRAN(
) NOT EXISTS
(SELECT G.CODS
FROM SECTII G
WHERE (G.ETAJ<>1)AND
(A.CODP,G.CODS)IN
(SELECT H.CODP, H.CODS
FROM FURNIZEAZA H))
1
E

2
E

1
E

TRAN( ) NOT EXISTS


(SELECT E.CODF
FROM FURNIZOR E
WHERE (A.CODP, E.CODF) IN
(SELECT F.CODP, F.CODF
FROM FURNIZEAZA F)
AND NOT TRAN(
))
TRAN(E) SELECT A.CODP, A.DENP
FROM PRODUS A
WHERE TRAN(E
1
) AND TRAN(
)
nlocuind TRAN(E
1
) din exemplul precedent i TRAN(
1
E

)
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 T
1
a
1
, ..., T
h
a
h
T
i
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
' '
1 h
T ,..., T
j
T , j 1, h

=
2
E
Subseleciile din FROM definesc tabele temporare, notate cu
, avnd aliasurile A
1
, ... ,A
h
, respectiv. Aceste aliasuri
sunt obligatorii pentru a face referin la cmpurile tabelelor
. Din punct de vedere al execuiei acestei comenzi
SELECT, se evalueaz nti aceste tabele temporare. Evident
aliasurile A
1
, A
2
,... ,A
h
sunt distincte.
Am notat expresia general n limbajul L
int
ce corespunde
unei interogri fr GROUP i HAVING prin:
E O(exp
1
c
1
, ..., exp
q
c
q
) I(T
1
a
1
, ..., T
h
a
h
) WE
1
,
unde E
1
este o expresie n limbajul L
int
, construit utiliznd
expresiile de tip 1) 10) ale lui L
int
.
n cazul n care, interogarea implic funcii agregat, atunci
vom nota expresia n limbajul L
int
prin:
E O(exp
1
c
1
, ..., exp
q
c
q
) I(T
1
a
1
, ..., T
h
a
h
) WE
1
G g
1
, ...,
g
s
H
i 1, s =
j 1, q =
unde E
1
i E
2
sunt expresii n limbaj intermediar, g
i
,
sunt expresiile de grupare. Expresiile exp
j
,
pot conine funcii agregat. Expresia E
2
are una din
urmtoarele forme:
1) E
2
exp
i
<constant>, unde exp
i
este una din expresiile
de ieire ale comenzii, este un operator de comparare, iar
<constant> are tipul lui exp
i
. Semantica lui E
2
: se rein clasele
de nregistrri calculate de componenta Gg
1
, ...,g
s
care satisfac
expresia E
2
.
2) E
2
COUNT(cimp) <constant>, unde cimp este
definit n una din tabelele de intrare, este operator de
comparare, <constant> este de tip numeric. Se calculeaz
E
2
pentru fiecare clas de nregistrri definit de componenta Gg
1
,
...,g
s
. Se rein clasele ce satisfac expresia E
2
.
1 h
g ,..., g

2
E

j
g , j 1, t

=
2
E

2
E

3) E
2
exp
i
(E"), unde E" este o expresie n limbajul L
int
de
forma E" O(exp')I(T
1
b
1
, ..., T
r
b
r
) WE
3
G
H
unde exp' este unica expresie de ieire a expresiei E" i are
acelai tip cu exp
i
, E
3
este expresia din componenta
WHERE,
sunt cmpurile dup care se face gruparea, iar
este expresia din componenta HAVING. Simbolul este un
operator de comparare.
Expresia
poate utiliza, ca operanzi, expresiile de
ieire exp
j
ale expresiei E.
Pentru 1) i 2) transformarea lui E
2
ca secven a frazei
SELECT se realizeaz prin TRAN(E
2
) = E
2
. Pentru 3) avem:
TRAN(E
2
) exp
i
(TRAN(E")).
Expresia E
2
din 3) este adevrat pentru clasa de nregistrri
curent, dac valoarea lui exp
i
pentru clasa curent este n relaia
cu valoarea lui exp', calculat de fraza SELECT
corespunztoare lui E".
4) E
2
<constant> (E"), unde E" se definete ca la 3).
Expresia E
2
este adevrat pentru clasa curent, dac valoarea
constantei <constant> este n relaia cu exp' calculat de fraza
SELECT corespunztoare lui E". Dac expresia
2
E

din expresia E" face referiri la expresiile exp
j
, 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(E
2
) constant (TRAN(E")).
Observaie: n cazurile 3) i 4) TRAN(E
2
) va avea forma
sintactic:
exp
i
(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: exp
1
, ..exp
q
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