Documente Academic
Documente Profesional
Documente Cultură
Q = R >< S = Π σ (R × S)
J A1,….An,B1,.…Bm,C1,.…Ck (R.B1=S.B1… AND R.Bm=S.Bm)
Asocierea de la dreapta la stânga a relaþiilor date (expresia R >< (S >< T)) nu este
posibilã, deoarece joncþiunea (S >< T) nu se poate evalua, dat fiind cã relaþiile S(B,C) ºi T
(A,D) nu au nici-un atribut comun.
Se poate remarca uºor cã existã ºi situaþii în care joncþiunea naturalã este asociativã,
ºi anume când fiecare pereche de relaþii din expresia datã au atribute comune.
Operaþia de joncþiune naturalã este utilizatã pentru a combina date din douã relaþii,
astfel încât informaþia rezultatã sã fie cuprinsã într-o singurã relaþie. În cazul cel mai
frecvent, joncþiunea naturalã se calculeazã între o relaþie care referã ºi relaþia referitã,
atributul de joncþiune fiind cheia strãinã (în relaþia care referã), respectiv cheia primarã
(sau candidatã) în relaþia referitã. Rezultatul obþinut reflectã asocierea dintre cele douã
relaþii. De exemplu, joncþiunea naturalã din figura 3.5 între relaþiile ANGAJATI ºi
SECTII reflectã asocierea N: 1 între acestea. Din acest exemplu se poate remarca faptul cã
prin operaþia de joncþiune se obþin informaþii combinate din cele douã relaþii operand.
Pentru fiecare tuplu din relaþia care referã (în exemplul de mai sus, relaþia ANGAJATI) se
obþin toate informaþiile din tuplul referit (în exemplul de mai sus, relaþia SECTII),
adicã acel tuplu care are valoarea cheii primare egalã cu valoarea cheii strãine care o referã.
În exemplul de mai sus, prima linie a tabelului rezultat conþine toate informaþiile (nume
secþie, buget) despre secþia în care lucreazã angajatul respectiv (secþia 1), etc.
Forþa modelului relaþional constã în posibilitatea de a combina informaþiile din
douã sau mai multe relaþii pentru a obþine rezultatul unei interogãri, combinare care se
poate face printr-una sau mai multe operaþii de joncþiune. Aceastã posibilitate de
combinare a informaþiilor este denumitã de unii autori ca o „navigare” prin baza de date.
În limbajul SQL, -joncþiunea se poate exprima direct cu o instrucþiune SELECT
pe douã sau mai multe tabele, condiþia de joncþiune fiind introdusã prin clauza WHERE.
De exemplu, -joncþiunea din figura 3.4 se poate obþine prin instrucþiunea:
SELECT * FROM ANGAJATI,SECTII WHERE ANGAJATI.IdSectie =
SECTII.IdAngajat;
O joncþiune naturalã se poate exprima în limbajul SQL numai în mod explicit,
adicã trebuie ca lista de atribute a instrucþiunii SELECT sã conþinã numai atributele
diferite din cele douã relaþii (fiecare atribut de joncþiune se introduce o singurã datã), iar în
clauza WHERE trebuie introdusã condiþia de egalitate a atributelor corespondente. De
exemplu, joncþiunea naturalã ANGAJATI >< SECTII din figura 3.5 se obþine prin
instrucþiunea SQL:
SELECT IdAngajat,ANGAJATI.Nume,Prenume,DataNasterii,
Adresa,Salariu,SECTII.IdSectie,SECTII.Nume,
Buget,IdAngajat FROM ANGAJATI,SECTII WHERE
ANGAJATI.IdSectie = SECTII.IdSectie;
Diviziunea (division) este o operaþie binarã a algebrei relaþionale prin care se
obþine o relaþie care conþine atributele diferenþei mulþimilor de atribute ale relaþiilor
operand.
Fie douã mulþimi de atribute: A = {A1,A2,..An} ºi B = {B1,B2,..Bm} ºi douã
relaþii R(A,B) ºi S(B) astfel încât mulþimea atributelor relaþiei S sã fie o submulþime a
mulþimii atributelor relaþiei R. Relaþia QD obþinutã prin operaþia de diviziune are ca
atribute toate atributele diferenþei celor douã mulþimi de atribute (adicã acele atribute care
aparþin relaþiei R ºi nu aparþin relaþiei S) ºi conþine acele tupluri t[A] care au
proprietatea cã pentru orice tuplu s din S existã un tuplu t în R care are atributul B egal cu
tuplul s. Se poate scrie:
QD(A) = R - S =nA aR.B = S.B(R)
În limbajul SQL, diviziunea se exprimã printr-o instrucþiune SELECT,
introducând explicit lista atributelor de proiecþie ºi condiþia de egalitate a atributelor
corespondente din cele douã relaþii prin clauza WHERE.
Algebra relaþionalã este o colecþie de operaþii asupra relaþiilor. Cele opt operaþii
propuse de E.F.Codd (reuniunea, intersecþia, diferenþa, produsul cartezian, restricþia,
proiecþia, joncþiunea, diviziunea), la care se adaugã operaþia de redenumire a atributelor,
nu constituie o mulþime minimã de operaþii ale algebrei relaþionale, deoarece o parte din
operaþii se pot exprima prin intermediul altora. Aºa cum s-a prezentat mai sus, joncþiunea
este o proiecþie a unei restricþii a produsului cartezian al celor douã relaþii, iar diviziunea
este o proiecþie a unei restricþii asupra relaþiei deîmpãrþit. La fel, intersecþia se poate
exprima printr-o expresie construitã pe baza operaþiei de diferenþã: R n S = R - (R -
S).
Cinci operaþii (reuniunea, diferenþa, produsul cartezian, restricþia, proiecþia) sunt
operaþii primitive ºi constituie mulþimea minimã de operaþii ale algebrei relaþionale. Pe
baza lor se poate construi orice expresie a algebrei relaþionale. Dar ºi celelalte trei operaþii
(ºi în special joncþiunea) sunt operaþii deosebit de utile în formularea interogãrilor, astfel
încât algebra relaþionalã a pãstrat toate cele opt operaþii propuse de E.F.Codd, la care s-a
adãugat operaþia de redenumire a atributelor.
Exemplul 3.1. Fie relaþia ANGAJATI definitã în figura 3.1 ºi interogarea: „Care
sunt numele ºi prenumele angajaþilor care au un salariu mai mare sau egal cu 3000?”.
Se observã cã aceastã interogare poate fi rezolvatã la nivelul unei singure relaþii,
relaþia ANGAJATI. Expresia de algebrã relaþionalã care exprimã interogarea datã este:
Q1 = Nume,Prenume σSalariu >3000 (ANGAJATI)
Instrucþiunea SQL care realizeazã aceastã interogare este:
SELECT Nume,Prenume FROM ANGAJATI WHERE
Salariu >= 3000; Rezultatul interogãrii este urmãtorul:
Nume Prenume
Ionescu Ion
Popescu Petre
Vasilescu Ana
Exemplul 3.2. Fie relaþia ANGAJATI definitã în figura 3.1 ºi interogarea: „Care
sunt numele, prenumele ºi salariul angajaþilor care lucreazã în secþia cu numãrul 1?”
Analizând aceastã interogare se constatã cã toate atributele de proiectie (nume,
prenume, data nasterii ºi salariul unui angajat) ºi atributul din condiþia de interogare
(numãrul sectiei) sunt atribute ale relaþiei ANGAJATI, deci interogarea poate fi rezolvatã
la nivelul acestei relaþii.
Expresia de algebrã relaþionalã care exprimã interogarea datã este:
Q = Π σ (ANGAJATI)
2 Nume,Prenume,Salariu IdSectie = 1
Combinarea celor douã relaþii se efectueazã prin joncþiunea naturalã (pe atributul
comun IdSectie) a celor douã relaþii. Relaþia rezultat al joncþiunii conþine toate
informaþiile necesare interogãrii: numele, prenumele ºi salariul angajaþilor ºi numele
secþiei corespunzãtor numãrului secþiei (IdSectie) în care lucreazã fiecare angajat.
Dupã aceasta se face restricþia (cu condiþia SECTII.Nume= ‘Productie’), urmatã de
proiecþia pe atributele de proiecþie. Expresia finalã de algebrã relaþionalã care exprimã
interogarea datã este:
Q =Π
3 ANGAJATI.Nume,Prenume,Salariu
σ (ANGAJATI >< SECTII)
SECTII.Nume='Productie'
ACHIZITII
IdComponenta IdFurnizor Cantitate PretUnitar
1 1 100 110
1 2 200 100
2 2 300 200
3 3 300 150
COMPONENTE
IdComponenta Denumire Culoare Greutate
1 Rezistenta Rosu 1
2 Condensator Alb 2
3 Ferita Negru 4
Nume Prenume
Mircescu Vasile
Amzulescu Ion
Eemplul 3.5. Pentru aceleaºi relaþii din figura 3.7, se considerã interogarea: "Care
sunt numele, prenumele ºi adresa furnizorilor care au livrat componenta cu denumirea
Rezistenta? ".
Atributele de proiecþie (Nume, Prenume, Adresa) aparþin relaþiei FURNIZORI,
iar atributul Denumire aparþine relaþiei COMPONENTE. Asocierea dintre aceste relaþii
este realizatã prin relaþia ACHIZITII, astfel încât aceastã interogare necesitã joncþiunea
tuturor celor trei relaþii. (fig. 3. 8).
A B A AND B A OR B
TRUE TRUE TRUE TRUE
TRUE FALSE FALSE TRUE
TRUE NULL NULL TRUE
FALS FALSE FALSE FALSE
FALS
E NULL FALSE NULL
NULL
E NULL NULL NULL
A NOT A
TRUE FALSE
FALSE TRUE
NULL NULL
Operatorii relaþionali sunt notaþi prin cuvinte cheie: UNION (reuniune),
INTERSECT (intersecþie), MINUS (diferenþa).
Funcþiile definite în SQL sunt de douã categorii: funcþii agregat ºi funcþii scalare.
Funcþiile agregat calculeazã un rezultat din mai multe linii ale unui tabel. Aceste funcþii
vor fi detaliate într-o secþiune urmãtoare, la descrierea instrucþiunii SELECT.
Funcþiile scalare primesc unul sau mai multe argumente ºi returneazã valoarea
calculatã sau NULL în caz de eroare. Argumentele funcþiilor pot fi constante (literale) sau
valori ale atributelor specificate prin numele coloanelor corespunzatoare. Existã mai multe
tipuri de funcþii scalare SQL:
• Funcþii numerice: Majoritatea versiunilor de SQL furnizeazã funcþii de calcul
trigonometric (sin, cos, etc.), funcþii de calcul al logaritmului (ln, log), al puterii
(pow), funcþii de rotunjire (floor, ceil), etc.
• Funcþii pentru manipularea ºirurilor de caractere.
• Funcþii pentru data calendaristicã ºi timp.
• Funcþii de conversie.
Funcþiile scalare se folosesc în expresii, care pot sã aparã în diferite clauze ale
instrucþiunilor SQL.
Clauza ORDER BY introduce numele atributului dupã care se face ordonarea liniilor
tabelului rezultat. Ordonarea se face în ordine crescãtoare în mod implicit sau dacã numele
atributului este urmat de cuvântul cheie ASC; dacã numele atributului este urmat de
cuvântul DESC, ordonarea liniilor se face în ordine descrescãtoare a valorilor acelui atribut.
Ordonarea liniilor astfel obþinutã este ordonare logicã, foarte utilã în prezentarea (afiºarea)
rezultatului ºi nu înseamnã ordonarea înregistrãrilor în fiºierele relaþiilor. De exemplu,
pentru afiºarea listei angajatilor ordonatã dupã numele acestora, se introduce comanda:
SELECT * FROM ANGAJATI ORDER BY Nume;
Clauza GROUP BY se foloseºte pentru gruparea rezultatelor funcþiilor agregat
(totalizatoare) în funcþie de valoarea uneia sau mai multor coloane.
Pentru aceasta, în instrucþiunea SELECT se introduce clauza GROUP BY, urmatã
de numele coloanei (sau al coloanelor) dupã valoarea cãrora se doreºte gruparea rezultatelor
funcþiei agregat. În acest caz, funcþia agregat se aplicã separat acelor linii care au aceeaºi
valoare a atributelor specificate de clauza GROUP BY.
De exemplu, salariul mediu calculat separat pe grupuri de angajati, fiecare grup
fiind compus din liniile care au aceeaºi valoare a atributului Functie, se obþine cu
urmãtoarea instrucþiune SQL:
SELECT AVG (Salariu) FROM ANGAJATI GROUP BY Functie;
Clauza HAVING. Funcþiile agregat (totalizatoare) nu pot fi utilizate în clauza
WHERE; de exemplu instrucþiunea urmãtoare (prin care se cere lista angajaþilor cu salariu
mai mare decât salariul mediu) este eronatã:
SELECT Nume,Prenume FROM ANGAJATI WHERE Salariu >= AVG(Salariu);
Pentru folosirea unei funcþii agregat într-o condiþie de selecþie se foloseºte clauza
HAVING. Clauza HAVING este asemãnãtoare clauzei WHERE, adicã introduce o
condiþie pe care trebuie sã o îndeplineasca tuplurile rezultat, ºi, în plus, permite utilizarea
funcþiilor agregat în expresia conditionalã. Exemplul de mai sus se scrie corect astfel:
SELECT Nume,Prenume
FROM ANGAJATI HAVING Salariu >= AVG (Salariu);
Instrucþiuni SELECT imbricate. Subinterogãri. Instrucþiunile SELECT se pot
imbrica pe mai multe niveluri, o instrucþiune având ca argument rezultatul unei altei
instrucþiuni, numitã subinterogare. Existã mai multe moduri de construire a
subinterogãrilor, una din formele cele mai frecvent folosite fiind urmãtoarea:
SELECT lista_atribute FROM tabel1
WHERE colx IN (SELECT colx FROM tabel2 WHERE conditie);
Într-o astfel de construcþie valoarea de comparaþie (pentru operatorul de
comparaþie IN) din clauza WHERE a primei instrucþiuni SELECT se defineºte printr-o
subinterogare care constã dintr-o altã instrucþiune SELECT. Alte forme de construire a
subinterogãrilor vor fi prezentate în capitolele urmãtoare.
Varianta 1.
Example:
select * from Table1, Table2
Table1 Table2 c1 c2 c3 c4
c1 c2 c3 c4 a 1 c 3
a 1 c 3 a 1 d 4
b 2 d 4 b 2 c 3
b 2 d 4
2) Inner join: Se adauga o conditie de potrivire intre cele doua tabele:se selecteazã doar acele
inregistrari care au in comun aceeasi valoare intr+o anumite coloana. De obicei se verifica o conditie
dintre coloane comune celor doua tabele.
Syntax:
On Grupe.codg=Studenti.codg
Example:
3) Outer Join
a) Left Outer Join: Include toate înregistrările din tabelul specificat în partea stanga a
clauzei LEFT OUTER, chiar daca nu se potrivesc.
Syntax:
Example:
Example: Select all titles and the play list they appear in (if a title does not appear in a play list, select null in
the PlaylistID column
Using Where
Using Group By
Combines records with identical values in the specified field list into a single record. A summary value is
created for each record if you include an SQL aggregate function, such as Sum or Count
Syntax
SELECT select_list
FROM table_list
WHERE condition
GROUP BY column_list