Sunteți pe pagina 1din 14

Cap.

3 Interogarea bazelor de date

CAPITOLUL 3

INTEROGAREA BAZELOR DE DATE

Pentru formularea interogrilor bazelor de date s-au


dezvoltat dou formalisme, ca limbaje abstracte de interogare,
algebra relaional i calculul relaional. Algebra relaional
exprim interogrile prin aplicarea unor operatori specializai
(operatorii algebrei relaionale) asupra relaiilor.
Rezultatul unei operaii din algebra relaional este tot o
relaie, asigurnd astfel proprietatea de nchidere a operaiilor.
Calculul relaional este bazat pe calculul predicatelor i
exprim o interogare formulnd o definiie a rezultatului dorit
(de regul o relaie) printr-o expresie de calcul relaional.
Aceste limbaje de interogare abstracte , algebra relaional,
calculul relaional sunt echivalente din punct de vedere al
capacitii de exprimare a interogrilor, diferenele constnd n
modul de formulare a acestora. S-a demonstrat c, pentru orice
expresie de algebr relaional, se poate gsi o expresie de
calcul relaional echivalent i invers. n continuare se va
analiza algebra relaional pe care se bazeaz majoritatea
comenzilor SQL.

3.1. Algebra relaional


Algebra relaional const dintr-o mulime de operaii care
au ca operanzi relaii, iar rezultatul este tot o relaie. E.F. Codd
a propus opt operaii ale algebrei relaionale, grupate n dou
categorii:
Operaii pe mulimi: reuniunea (union), intersecia
(intersection), diferena (difference) i produsul cartezian
(Cartesian product). Aceste operaii reprezint adaptarea
operaiilor corespunztoare din teoria mulimilor i acioneaz

77
Cap.3 Interogarea bazelor de date

asupra relaiilor vzute ca mulimi de elemente (tupluri), fr a


lua n consideraie compozitia fiecrui element.
Operaii relaionale speciale : restricia (restriction),
proiecia (projection), jonciunea (join) i diviziunea (division).
Aceste operaii iau n consideraie compoziia tuplurilor,
formate din valori ale atributelor relaiilor.
Reunuinea (union) a dou relaii compatibile R i S este o
relaie T = R S care conine toate tuplurile care aparin fie
relaiei R, fie relaiei S, fie ambelor relaii. Tuplurile care
aparin ambelor relaii se introduc n relaia rezultat o singur
dat, adic nu se duplic. Operaia de reuniune se exprim n
SQL ca o reuniune a dou tabele obinute ca rezultat a dou
comenzi SELECT, cu sintaxa:
SELECT lista_coloane_1 FROM tabel_1 [WHERE
conditie_1]
UNION
SELECT lista_coloane_2 FROM tabel_2 [WHERE
conditie_2];
Intersecia (intersection) a dou relaii compatibile R i S
este o relaie T = R S care conine toate tuplurile care aparin
att relaiei R ct i relaiei S. La fel ca i reuniunea, operaia
de intersecie se exprim n SQL ca intersecie a dou tabele
obinute ca rezultat a dou instruciuni SELECT, cu sintaxa:
SELECT lista_atribute_1 FROM tabel_1
[WHERE conditie_1]
INTERSECT
SELECT lista_atribute_2 FROM tabel_2
[WHERE conditie_2];
Diferena (difference) a dou relaii compatibile R i S
este o relaie T = R - S care conine toate tuplurile care
aparin relaiei R, dar nu aparin relaiei S. Operaia de
diferen se exprim n SQL ca diferen a dou tabele obinute
ca rezultat a dou comenzi SELECT, cu sintaxa:

78
Cap.3 Interogarea bazelor de date

SELECT lista_atribute_1 FROM


nume_tabel_1[WHERE conditie_1]
MINUS
SELECT lista_atribute_2 FROM
nume_tabel_2[WHERE conditie_2];
Produsul cartezian (Cartesian product). Produsul
cartezian a dou relaii R(A1, A2, .An) i S(B1, B2, Bm)
este o relaie T: R S = T (A1, A2, .An, B1, B2, Bm) care
are ca atribute toate atributele primei relaii plus toate atributele
celei de-a doua relaii, deci gradul relaiei rezultat este egal cu
suma gradelor celor dou relaii operanzi. Pentru a se obine
relaia rezultat se combin (se concateneaz) valorile
atributelor fiecrui tuplu din prima relaie cu valorile tuturor
atributelor unui tuplu din cea de-a doua relaie. n limbajul
SQL, produsul cartezian a dou tabele R i S se obine ca o
variant a instruciunii SELECT, ntr-una din formele:
SELECT * FROM R,S;
SELECT lista_coloane FROM R,S;
n prima form, limbajul SQL admite operaia produs
cartezian i n situaia n care n cele dou relaii operand exist
dou atribute cu acelai nume, subnelegndu-se calificarea
atributelor cu numele fiecrei relaii. Pentru cea de-a doua
form, atributele cu acelai nume trebuie s fie calificate cu
numele relaiei respective.
Restricia (restriction) este o operaie unar care selecteaz
dintre tuplurile relaiei operand acele tupluri care ndeplinesc o
condiie dat. Operaia de restricie se noteaz: (R), unde
este o expresie boolean specificat asupra atributelor relaiei
R. n relaia rezultat sunt selectate acele tupluri ale relaiei R
pentru care expresia are valoarea 1 (TRUE). Relaia rezultat
are aceleai atribute ca i relaia operand. Operaia de restricie
se mai numete i selecie (ntr-adevar, restricia face o selecie
a tuplurilor), dar este mai bine s fie evitat aceast denumire

79
Cap.3 Interogarea bazelor de date

care se poate confunda cu instructiunea SELECT din SQL,


care are rolul de instruciune general de interogare.
n limbajul SQL restricia se exprim printr-o form
particular a instruiunii SELECT, n care lista de atribute este
format din toate atributele unei singure relaii, iar clauza
WHERE este obligatorie i introduce condiia de restricie:
SELECT * FROM nume_tabel WHERE conditie
[clauze_secundare];
Proiecia este o operaie unar prin care se selecteaz o
submulime a atributelor relaiei operand. Notaia obinuit
pentru proiecie este:
lista_atribute (nume_relatie).
Relaia rezultat a operaiei de proiecie conine numai
atributele din lista de atribute dat ca parametru, care este o
submulime nevid a mulimii atributelor relaiei operand.
Dac lista atributelor de proiecie este o cheie (sau conine
o cheie) a relaiei operand, atunci relaia rezultat are toate
tuplurile distincte. Dac lista de atribute nu este o cheie (sau nu
conine o cheie) a relaiei operand, atunci este posibil ca prin
proiecie s se obina dou sau mai multe tupluri identice, dar
n relaia rezultat sunt eliminate tuplurile duplicat. n aceast
situaie numrul de tupluri ale relaiei rezultat este mai mic
dect numrul de tupluri ale relaiei operand.
n limbajul SQL, operaia de proiectie se obine tot prin
instruciunea de interogare SELECT; lista de coloane introdus
n instruciunea SELECT este lista atributelor de proiecie:
SELECT DISTINCT lista_coloane FROM
nume_tabel;
Dac lipsete clauza DISTINCT rezultatul operaiei poate
conine tupluri duplicat (deci nu este o relaie n sensul
definiiei din modelul relaional).
Jonciunea (join), este o operaie binar a algebrei
relaionale prin care se combin tuplurile a dou relaii ntr-o
singur relaie. Jonciunea se noteaz cu semnul >< i este o

80
Cap.3 Interogarea bazelor de date

operaie foarte important n bazele de date relaionale


deoarece ea permite prelucrarea asocierilor ntre relaii. n
continuare vor fi prezentate dou forme ale operaiei de
jonciune: -jonciunea i jonciunea natural.
-Jonciunea a dou relaii R(A1, A2, .An) i S (B1, B2,
Bm) este o relaie T:
R >< S = T (A1, A2, .An, B1, B2, Bm)
n care fiecare tuplu este o combinaie a dou tupluri, unul din
relaia R (cu atributele A1, A2,.An), cellalt din relaia S (cu
atributele B1, B2,Bm), care satisfac condiia de jonciune.
Cea mai utilizat form de -jonciune este echi-jonciunea,
n care se folosete numai operatorul de comparaie de egalitate
(=).
Jonciunea natural. Jonciunea natural este o echi-
jonciune n care fiecare pereche de atribute comparate pentru
egalitate (n condiia de jonciune) se nlocuiete cu un singur
atribut. Se poate spune c jonctiunea natural este o echi-
joniune urmat de o proiecie pe mulimea atributelor celor
doua relaii minus cte un atribut din fiecare pereche de
atribute comparate pentru egalitate.
Jonciunea natural se reprezint numai cu semnul ><, fr
s mai fie nsoit de condiia de jonciune, nelegnd prin
aceasta c jonciunea are loc pe atributul (sau atributele)
comune ale celor dou relaii.
Operaia de jonciune natural este utilizat pentru a
combina date din dou sau mai multe relaii, astfel nct
informaia rezultat s fie cuprins ntr-o singur relaie. n
cazul cel mai frecvent, jonciunea natural se calculeaz ntre o
relaie care refer i relaia referit, atributul de jonciune fiind
cheia strin (n relaia care refer), respectiv cheia primar
(sau candidat) n relaia referit. Rezultatul obinut reflect
asocierea dintre cele dou relaii.
n limbajul SQL, instruciunea SELECT poate exprima o
-jonciune a dou sau mai multe tabele, condiia de jonciune

81
Cap.3 Interogarea bazelor de date

fiind introdus prin clauza WHERE. De exemplu, jonciunea


tabelelor SECTII i ANGAJATI se poate obine prin
instruciunea:
SELECT * FROM ANGAJATI,SECTII WHERE
ANGAJATI.IdSectie= SECTII.IdSectie;
Dac exist atribute cu aceleai nume n cele dou tabele, se
calific atributele cu numele tabelului respectiv, la fel ca la
produsul cartezian.
O jonciune natural se poate exprima n limbajul SQL
numai n mod explicit, adic trebuie ca lista de atribute a
instruciunii SELECT s conin un atribut de jonciune o
singur dat, iar n clauza WHERE trebuie introdus condiia de
egalitate a atributelor corespondente. De exemplu, jonciunea
natural SECTII >< ANGAJATI se poate introduce prin
comanda SQL:
SELECT
IdAngajat,ANGAJATI.Nume,Prenume,DataNaster
ii,Adresa,Salariu
SECTII.IdSectie,SECTII.Nume,Buget
FROM SECTII,ANGAJATI WHERE SECTII.IdSectie
= ANGAJATI.IdSectie;
Diviziunea. Fie dou mulimi de atribute: A = {A1, A2,
.An} i B = {B1 , B2, Bm}, dou relaii R (A B) i S
(B) astfel nct mulimea atributelor relaiei S s fie o
submulime a mulimii atributelor relaiei R. Relaia T obinut
prin operaia de diviziune T(A) = R S are ca atribute toate
atributele diferenei celor dou mulimi de atribute (adic acele
atribute care aparin relaiei R i nu aparin relaiei S) i conine
acele tupluri t care au proprietatea c pentru orice tuplu s din S
exist un tuplu n R care are atributul B (simplu sau compus)
egal cu atributul B al tuplului s:
T(A) = R S = A R.B = S.B (R)
n limbajul SQL, diviziunea se exprim printr-o
instruciune SELECT, introducnd explicit lista atributelor de

82
Cap.3 Interogarea bazelor de date

proiecie i condiia de egalitate a atributelor corespondente din


cele dou relaii prin clauza WHERE.

3.2. Crearea interogrilor


Interogrile se pot crea pe baza operaiilor din algebra
relaional sau a celor din calculul relaional. Majoritatea
comenzilor SQL se bazeaz pe algebra relaional i numai un
numar mic de comenzi (EXISTS, NOT EXISTS) provin din
operatori din calculul relaional.
n algebra relaional o interogare se formuleaz printr-o
expresie constnd dintr-o secven de identificatori (nume de
relaii, nume de atribute), constante (literale), operatori ai
algebrei relaionale (, , , , , , >< ), operatori de
comparaie ( =, ,<, , >, ) i operatori logici
(NOT,AND,OR).
n expresii se pot folosi i paranteze pentru a specifica o
anumit ordine de efectuare a operaiilor. Pentru exprimarea
unei interogri printr-o expresie de algebr relaional, trebuie
sa fie precizate urmtoarele elemente:
Lista atributelor relaiei rezultat, care se numete lista
atributelor de proiecie.
Lista relaiilor din care se extrag informaiile.
Condiia pe care trebuie s o ndeplineasc tuplurile
relaiei rezultat.
n funcie de aceste elemente, se pot studia dou situaii de
exprimare a interogrilor: interogri care se rezolv n cadrul
unei singure relaii i interogri care se rezolv folosind dou
sau mai multe relaii ale bazei de date. Pe lng acestea, mai
exist i interogri imbricate i subinterogri.
Interogri care se rezolv n cadrul unei singure relaii.
Dac toate atributele care intervin n interogare (atributele de
proiecie i atributele de condiie) sunt atribute ale unei singure
relaii R, atunci interogarea se poate rezolva la nivelul acelei

83
Cap.3 Interogarea bazelor de date

relaii, ca o proiecie (pe atributele relaiei rezultat) a restriciei


i condiia impus asupra relaiei date:
T = A1, A2, Ak condiie (R)
Fie, de exemplu, relaia:
ANGAJATI(IdAngajat,Nume,Prenume,DataNast
erii,Adresa,Salariu,IdSectie) i interogarea:
Care sunt numele, prenumele, data naterii i salariul
angajailor care lucreaz n secia 1 ?
Analiznd aceast interogare se constat c toate atributele
de proiecie (nume, prenume, data naterii i salariul unui
angajat) i atributul din condiia de interogare (numrul seciei)
sunt atribute ale relaiei ANGAJAT, deci interogarea poate fi
rezolvat la nivelul acestei relaii. Expresia de algebr
relaional care exprim interogarea data este:
T = Nume, Prenume, DataNasterii, Salariu IdSectie = 1
(ANGAJAT)
Instruciunea SQL care realizeaz aceast interogare este:
SELECT Nume,Prenume,DataNasterii,Salariu
FROM ANGAJATI
WHERE IdSectie = 1;
Interogri care se rezolv folosind dou sau mai multe
relaii. n situaia n care atributele de proiecie i atributele din
condiia de interogare nu aparin unei singure relaii, pentru
rezolvarea interogrii trebuie s fie folosite cel puin toate acele
relaii care, mpreun, conin aceste atribute.
Conceptual, o astfel de interogare se rezolv construind mai
nti o relaie care s conin toate atributele necesare prin
combinarea a dou sau mai multe relaii folosind operaii de
produs cartezian sau jonciuni, iar rezultatul interogrii se
obine prin restricia (cu condiia de interogare) i proiecia (pe
atributele de proiecie) a acestei relaii.
Cazul cel mai frecvent de interogare necesit jonciunea
natural a dou sau mai multe relaii aflate n situaie de

84
Cap.3 Interogarea bazelor de date

referire, folosind perechea de atribute cheia strin - cheia


primar referit pentru fiecare operaie de jonciune.
Fie relaiile SECTII i ANGAJATI i interogarea Care
sunt numele, prenumele, data naterii i salariul angajailor care
lucreaz n secia cu numele Productie?. Atributele de
proiecie (Nume,Prenume,DataNasterii,Salariu)
sunt atribute ale relaiei ANGAJATI; atributul numele seciei
(care apare n condiia de interogare) nu se afl n aceeai
relaie, ci n relaia SECTII i de aceea, pentru a rezolva
aceast interogare, este necesar combinarea celor dou relaii.
Expresia de algebr relaional care exprim interogarea data
este:
T = ANGAJAT.Nume, Prenume, DataNasterii, Salariu
SECTIE.Nume='Productie' (ANGAJAT >< SECTIE)
Instruciunea SQL care realizeaz aceast interogare este:
SELECT
ANGAJAT.Nume,Prenume,DataNasterii,Salariu
FROM SECTIE, ANGAJAT
WHERE SECTIE.IdSectie=ANGAJAT.IdSectie AND
SECTIE.Nume=Productie;
Aa cum s-a mai precizat, n SQL trebuie s fie introdus
explicit condiia de jonciune natural (SECTIE.IdSectie
= ANGAJAT.IdSectie), mpreun (prin conjuncia AND)
cu celelalte condiii de interogare (SECTIE.Nume =
Productie).
Interogri imbricate. Subinterogri. Instruciunile
SELECT se pot imbrica pe mai multe niveluri, o instruciune
avnd ca argument rezultatul unei altei instruciuni, numit
subinterogare.
Exist mai multe moduri de construire a subinterogrilor,
una din formele cele mai frecvent folosite fiind urmtoarea:
SELECT lista_atribute FROM tabel1
WHERE colx IN (SELECT colx FROM tabel2
WHERE conditie);
85
Cap.3 Interogarea bazelor de date

ntr-o astfel de construcie valoarea de comparaie (pentru


operatorul de comparaie IN) din clauza WHERE a primei
instruciuni SELECT se definete printr-o subinterogare care
const dintr-o alt instruciune SELECT.
Tot o subinterogare este folosit i n comanda SQL
EXISTS, care corespunde cuantificatorului universal din
calculul relaional. Expresia SQL este:
SELECT lista_coloane FROM lista_tabele
WHERE EXISTS(SELECT * FROM R WHERE P(X));
i este echivalent cu o formul de calcul relaional al
tuplurilor n care o variabil de tuplu X cu domeniu al
valorilor definit pe relatia R este cuantificat existenial.
Subinterogarea (interogarea intern) creia i se aplic funcia
EXISTS este, n mod normal, corelat cu interogarea extern,
adic n condiia WHERE se pot include unele coloane ale
tabelelor din interogarea extern. Clauza WHERE din
interogarea extern este evaluat la TRUE dac subinterogarea
returneaz un rezultat nevid, care conine una sau mai multe
linii i ia valoarea FALSE dac subinterogarea nu returneaz
nici o linie.

3.3. Particulariti de creare a interogrilor n diferite


SGBD
Implementarea limbajului SQL n diferite sisteme de
gestiune prezint unele particulariti n ceea ce privete modul
de realizare a operaiilor algebrei relaionale i formularea
interogrilor.
Operaiile pe mulimi nu sunt implementate complet n
toate sistemele de gestiune, cu excepia sistemului Oracle.
Produsul cartezian este implementat n toate sistemele, dat
fiind c este cuprins n sintaxa instruciunii SELECT, care nu
poate s lipseasc din nici o implementare, fiind instruciunea
de interogare de baz. n MySQL nu sunt implementate

86
Cap.3 Interogarea bazelor de date

operaiile UNION, INTERSECT i MINUS, iar n SQL Server


nu sunt implementate operaiile INTERSECT i MINUS.
n orice sistem de gestiune, operaiile INTERSECT i
MINUS se pot crea prin subinterogri cu comanda EXISTS.
De exemplu, intersecia i respectiv diferena, dintre dou
relaii obinute prin proiecia relaiilor ANGAJATI i
FURNIZORI pe atributele Nume i Prenume se pot realiza
astfel:
SELECT DISTINCT Nume,Prenume FROM ANGAJATI
WHERE EXISTS SELECT * FROM FURNIZORI
WHERE ANGAJATI.Nume =
FURNIZORI.Nume
AND ANGAJATI.Prenume = FURNIZORI.Prenume )
SELECT DISTINCT Nume,Prenume FROM ANGAJATI
WHERE NOT EXISTS (SELECT * FROM FURNIZORI
WHERE ANGAJATI.Nume = FURNIZORI.Nume
AND
ANGAJATI.Prenume=FURNIZORI.Prenume)

3.3.1. Crearea interogrilor n Access


n general, comenzile de interogare se transmit sistemului
de gestiune al bazelor de date ca i instruciuni SQL, dar
mediul MS Access ofer o modalitate mai simpl de construire
a interogrilor i memorare a interogrilor i anume printr-un
limbaj de interogare prin exemple (Query by Example - QBE).
Acest limbaj ofer o interfa utilizator care faciliteaz
formularea interactiv a interogrilor folosind variabile de
domeniu sau constante pentru a forma modelul (schema
conceptual) a tuplurilor (nregistrrilor) rezultat.
Pentru a crea o interogare folosind limbajul QBE, n
fereastra Database, se selecteaz panoul Queries i apoi
comanda New. Pe ecran este afiat caseta de dialog New
Query care conine mai multe opiuni pentru crearea
interogrilor. Pentru exemplificarea modului de creare a unei
87
Cap.3 Interogarea bazelor de date

interogri, se va alege opiunea Design View. La comanda OK


cu aceast selecie, se deschide caseta de dialog Show Table i
afieaz grila de construire a interogarii QBE.
Deoarece majoritatea interogrilor se bazeaz pe datele
existente n tabele, mediul Access ateapt ca utilizatorul s
selecteze o surs de date valid care poate fi att tabel, dar i o
interogare existent n baza de date, deoarece ambele tipuri
returneaz obiecte de tip tabel, din care interogrile pot extrage
date. Dup selectarea unei surse de date, caseta de dialog Show
Table poate fi nchis pentru a elibera ecranul i a vedea
ntreaga gril QBE. Aceast gril este format din dou
seciuni: seciunea din partea de sus conine tabelele (sau
interogrile) selectate, cu prezentarea asocierilor dintre acestea,
iar seciunea din partea de jos a ferestrei conine grila
interogrii (Query Grid ) i este cea n care se lucreaz efectiv.
Rndurile din grila interogrii sunt folosite astfel:
Field (Cmp). Intrarea n fiecare celul de pe acest rnd
este numele unui cmp din sursa de date. Introducerea numelui
unui cmp aici se poate face din dou motive: fie se urmrete
ca datele din cmpul respectiv s apar n rezultatele
interogrii, fie se dorete sortarea sau alegerea nregistrrilor
din sursa de date n funcie de o anumit valoare plasat n
acest cmp.
Table (Tabelul). Este sursa de date n care se gsesc
cmpurile listate mai sus. Poate fi o tabel sau o alt interogare.
Sort (Sortare). Reprezint modul n care trebuie sortate
nregistrrile returnate de interogare.
Intrrile valide n aceast celul sunt: ascending (0-9, A-Z),
descending (9-0, Z-A) i not sorted (nesortate sau
necompletate). Sortarea se aplic asupra cmpului afiat
deasupra ordinii de sortare; pot fi sortate oricte cmpuri din
gril.
Show (Afiare). Aceast caset este validat automat,
indicnd astfel c datele din cmpul selectat trebuie afiate ca

88
Cap.3 Interogarea bazelor de date

parte a rezultatelor interogrii. n cazul n care caseta nu este


validat, cmpul respectiv este folosit pentru sortare / criterii,
dar nu este afiat pe ecran.
Criteria (Criterii). Un ir introdus n aceast celul indic
faptul c respectivul cmp trebuie s corespund irului pentru
ca datele din nregistrrile asociate s fie incluse n rezultat.
Acest ir poate include oricte criterii pentru cmpul listat,
separate prin cuvntul cheie AND.
or (sau). Orice ir introdus n aceast celul face parte din
criteriile de selecie pentru cmpul corespunztor, dar aceste
criterii sunt diferite de cele introduse n celula anterioar. Dac
datele din cmpul listat respect criteriile din celula Criteria
sau pe cele din celula or, nregistrarea asociat va fi inclus n
setul de rezultate.
Cnd se deschide grila QBE, sistemul Access presupune c
utilizatorul dorete s construiasc o interogare
corespunztoare unei comenzi SQL se tip SELECT. Exist o
serie de caracteristici i funcii suplimentare utile n procesul
de construire a interogrilor SELECT cum ar fi utilizarea
funciilor statistice pe linia Totals a unei interogri n vederea
calculrii totalurilor i a altor valori.
Dac n modul de afiare Design View a unei interogri se
selecteaz de pe bara de instrumente butonul Totals (are o
pictogram reprezentnd litera greceasc sigma - ), n grila
QBE apare o linie nou intitulat Total. n cmpul Total pot fi
selectate dintr-o list derulant mai multe funcii care opereaz
asupra cmpului corespunztor i schimb modul n care acesta
este afiat n rezultat: Group by, Sum, Avg, Min, Max .a..
Pentru crearea celorlalte tipuri de interogri, se selecteaz din
meniul Query tipul de interogare dorit ceea ce conduce la
actualizarea cmpurilor din grila (Update Query, Delete Query
etc). Atunci cnd se specific mai multe tabele pentru o
interogare, tabelele sunt considerate asociate i se efectueaz
operaia de jonciune (join ). n Fig. 3.1 este prezentat grila

89
Cap.3 Interogarea bazelor de date

QBE pentru proiectarea interogrii Care sunt numele,


prenumele i salariul angajailor care lucreaz n secia cu
numele Productie? n sistemul de baze de date Microsoft
Access.

Fig. 3.1 Grila QBE pentru construirea interogrii Care sunt numele,
prenumele i salariul angajailor care lucreaz n secia cu numele
Productie?

90

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