BD 07
BD 07
[Link]@[Link] 2
Proiectia
Proiectia (project) pe atributele A1, A2, .. Ak intr-o relatie r(R) se notează:
ΠA1, A2, …Ak(r), unde A1 ∈ R, A2 ∈ R, …Ak ∈ R
Rezultatul este o relatie cu k atribute, cele din lista data
Daca {A1, A2, …Ak} nu contine o supercheie, pot sa apara tupluri duplicat;
teoretic, tuplurile duplicat se elimina, deoarece rezultatul este o multime
In limbajul SQL proiectia se exprima astfel:
SELECT DISTINCT A1, A2, …Ak FROM R
Daca nu se introduce parametrul DISTINCT, nu se elimina tuplurile duplicat
Exemplu (db World): SELECT DISTINCT CountryCode FROM City;
[Link]@[Link] 3
Operația de joncțiune naturala (1)
Jonctiunea naturala (natural join) combina tuplurile din doua relatii
Fie multimile de atribute: A = {A1,A2,...Am} , B= {B1,B2,...Bn}, C={C1,C2,…Ck}
si doua relatii r(R) si s(S), unde:
R={A, B}, S = {B, C}
deciatributele R ∩S = B = {B1,B2,...Bn} sunt comune celor douărelaţii
Joncţiunea naturală este o relatie q = r ⋈ s, care se obţine în felul următor:
se calculează produsul cartesian al celor doua relatii: p = r x s, P = {A, R.B, S.B, C};
din tuplurile produsului cartesian se selecteza acele tupluri care au valori egale pentru atributele
comune (B1,B2,...Bn): R.B = S.B, adică R.B1=S.B1, R.B2=S.B2,..
se face proiectia rezultatului pe multimea de atribute R ∪S = {A, B, C}
Schema relatiei rezultat este Q = R ∪ S = {A, B, C}
q = r ⋈ s = ΠA,B,C σ(r.B1=s.B1 AND r.B2=s.B2 …AND [Link] = [Link])(r x s)
Atributele comune R.B si S.B trebuie să fie compatibile in cele doua relatii; daca
sunt compatibile, ele se considera identice chiar dacă au denumiri diferite, si în
reuniunea atributelor R ∪ S se introduc o singură dată
Cazul cel mai frecvent de jonctiune naturala: intre doua relatii asociate (1:N),
atributul comun fiind cheia straina – cheia primara (candidata) referita
[Link]@[Link] 4
Operatia de jonctiune naturala (2)
Exemplul 1: r ⋈ s = ΠA,B,C,D,E σ(r.D = s.D )(r x s)
In SQL trebuie sa fie introduse explicit lista atributelor rezultatului si condițiile de egalitate
ale atributelor comune: SELECT A,B,C,R.D,E FROM R, S WHERE R.D = S.D;
Exemplul 2: Angajat ⋈ SECTII; cheia straina: [Link]
SELECT IdAngajat, [Link], Prenume, DataNasterii, Adresa, Salariu, [Link], [Link],
Buget FROM Angajat a, Sectie s WHERE [Link]=[Link];
Exemplul 3:(bd World) city ⋈ country; cheia straina: [Link]
SELECT ID, [Link] Oras, CountryCode 'Cod Tara', [Link], [Link]
Tara,Continent, …. from city, country where [Link]=[Link] order by
[Link];
Daca nu se afiseaza toate atributele joncţiunii, înseamnă ca s-a combinat cu o proiecţie
[Link]@[Link] 5
Joncţiuni interne şi externe externe
Joncţiunea naturală se mai numeşte şi joncţiune internă şi se mai poate exprima in SQL cu cuvintele cheie
INNER JOIN
Exemplu de joncţiune (combinată cu o proiecţie si o selectie) (bd World)
SELECT [Link] Oras, Code 'Cod Tara', [Link] Tara, Continent FROM city INNER JOIN
country ON CountryCode=Code WHERE Continent='Antarctica' OR Continent = 'Europe'
ORDER BY Continent;
Joncţiunea externă introduce în plus toate liniile care exită în prima relaţie (pentru LEFT OUTER JOIN)
sau în cea de-a doua relaţie (pentru RIGHT OUTER JOIN) şi pentru care nu există linii în cealălaltă
relaţie care să îndeplinească condiţia de join; exemplu:
SELECT [Link] Oras, Code 'Cod Tara', [Link] Tara, Continent FROM city RIGHT OUTER
JOIN country ON CountryCode=Code WHERE Continent='Antarctica' OR Continent = 'Europe'
ORDER BY Continent;
Se vor afişa si ţările care nu au nici un oras înscris în tabelul city.
[Link]@[Link] 6
Operaţia de diviziune
[Link]@[Link] 7
Rezumat: operatiile algebrei relationale
Algebra relaţională este o colecţie de operaţii asupra relaţiilor
Cele opt operaţii propuse de [Link] nu constituie o mulţime minimală de
operaţii ale algebrei relaţionale
Mulţimea minimă de operaţii ale algebrei relaţionale consta din cinci operaţii
primitive, pe baza cărora se poate construi orice expresie de algebra
relaţionala:
Reuniunea
Diferenţa
Produsul Cartesian
Restricţia (selectia)
Proiecţia
Celelalte operaţii se pot exprima prin intermediul acestora:
Intersecţia se poate exprima prin expresia: R∩S = R – (R–S);
Joncţiunea este o proiecţie a unei restricţii a produsului cartezian al relaţiilor;
Diviziunea este o proiecţie a unei restricţii asupra relaţiei deîmpărţit
Si celelalte trei operaţii sunt deosebit de utile în formularea interogărilor, astfel
încât algebra relaţională a păstrat toate cele opt operaţii propuse de [Link],
la care s-a adăugat operaţia de redenumire a atributelor
[Link]@[Link] 8
Formularea interogărilor
Interogarea este operația prin care se obțin informaţiile dorite (care îndeplinesc o anumita
condiție) dintr-o bază de date. O interogare:
se formulează mai întâi în limbaj natural,
apoi se exprima într-un limbaj abstract de interogare (algebra relaţională sau calculul relaţional),
se transpune în limbajul de interogare al SGBD-ului folosit (ex., limbajul SQL),
iar aplicația client transmite SGBD-ului instrucțiunea (sau instrucțiunile) obținute
Sistemul SGBD prelucrează programul interogării în mai multe faze:
analiza lexicală, sintactică şi semantică
optimizarea interogării
generarea codului
execuția si returnarea rezultatului
În algebra relaţională o interogare se formulează printr-o expresie care definește următoarele
elemente:
Lista atributelor relaţiei rezultat, care se numesc atribute de proiecţie;
Lista relaţiilor din care se extrag informaţiile
Condiţiile pe care trebuie să le îndeplinească tuplurile relaţiei rezultat.
Sunt posibile două situaţii:
interogări care se rezolvă în cadrul unei singure relaţii
interogări care se rezolvă folosind două sau mai multe relaţii ale bazei de date
[Link]@[Link] 9
Interogări intr-o singură relaţie
Interogare in relatia r(R):
Expresia de algebra relationala: q = Πlista_atributeσp(r)
Instructiunea SQL: SELECT lista_atribute FROM R WHERE p = TRUE;
Exemplul 1: Fie relaţia Angajat şi interogarea: „Care sunt numele şi prenumele angajaţilor
care au un salariu mai mare sau egal cu 2000?”.
Expresia de algebră relaţională: q = ΠNume, PrenumeσSalariu >= 2000(Angajat)
Instrucţiunea SQL:
SELECT Nume, Prenume FROM Angajat WHERE Salariu >= 2000;
Exemplul 2: (bd - World): “Care sunt numele si populatia oraselor din tara cu codul
‘ROM’?”
Expresia de algebră relaţională: q = ΠName, Population σcountry_id=‘ROM’(city)
Instrucțiunea SQL:
SELECT Name, Population FROM city WHERE CountryCode=‘ROM';
Exemplul 3: Fie relaţia Angajat şi interogarea: „Care sunt numele, prenumele si adresa
angajaţilor care lucrează in secția numărul 1?”.
Expresia de algebră relaţională: q = ΠNume, Prenume, Adresa σIdSectie = 1(ANGAJATI)
Instrucțiunea SQL:
SELECT Nume, Prenume, Adresa FROM ANGAJATI WHERE IdSectie=1;
[Link]@[Link] 10
Interogări in două sau mai multe relaţii
Daca atributele de proiecţie şi atributele din condiţia de interogare nu aparţin unei
singure relaţii, pentru rezolvarea interogării trebuie să fie folosite toate acele
relaţiile care, împreună, conţin atributele şi asocierile necesare
Conceptual, o astfel de interogare se rezolvă astfel:
se construiește mai întâi o relaţie care să conţină toate atributele implicate prin combinarea relaţiilor
necesare, folosind operaţii de produs cartezian sau joncţiuni;
in relația obtinuta se aplica o selecție (restricție) (cu condiţia de interogare p);
apoi se face proiecţia (pe atributele de proiecţie).
Expresia generala de algebra relaționala a interogării este:
q= Πlista_atributeσp(r x s x t...)
Daca intre relațiile din produsul cartezian exista atribute comune care trebuie sa
aiba valori egale (de regula, perechile cheie străină - cheie candidata) atunci se pot
face operaţii de joncţiune:
q= Πlista_atributeσp AND conditii-join(r ⋈ s ⋈ t...)
O interogare poate conţine una sau mai multe subinterogări
In limbajul SQL, o interogare se exprima prin instrucțiuni SELECT in care:
clauza WHERE combina atat conditiile impuse valorilor atributelor cat si condițiile de jonctiuni
Joncțiunile se pot specifica şi în clauza FROM (cu INNER JOIN, OUTER JOIN)
[Link]@[Link] 11
Interogări in două relaţii
A. Fie interogarea: Care sunt numele, prenumele, funcţia, salariul şi denumireasecţiei în care
lucrează angajaţii?
Expresia de algebră relaţională este: q = ΠNume, Prenume,Salariul, Denumire(Angajat ⋈ Sectie)
Instructiunea SQL corespunzatoare acestei interogări:
SELECT Nume, Prenume, Salariul, Denumire FROM Angajat, Sectie WHERE [Link] =
[Link]
Se efectueaza o “navigare” în baza de date, pe atributul comun (IdSectie)
B. Fie interogarea: Care sunt numele, prenumele, funcţia şi salariul angajaţilor care lucrează în
secţia cu denumirea ‘Productie’?
q = ΠNume, Prenume, Functia, SalariulσDenumire= ‘Productie’(Angajat ⋈ Sectie)
SELECT Nume, Prenume, Functia, Salariul FROM Angajat, Sectie WHERE [Link]
= [Link] AND Denumire= ‘Productie’;
[Link]@[Link] 12
Interogări in trei relaţii (1)
Fie următoarele relații asociate din baza de date Cinemagia:
FILM(film_id, title, description, release_year, ....)
ACTOR(actor_id, first_name, last_name, last_update)
FILM_ACTOR(film_id, actor_id, last_update)
Interogarea: “În ce filme au jucat fiecare din actorii din baza de date Cinemagia?”
q = Πactor_id, first_name,last_name,title(film ⋈ film_actor ⋈ actor)
Instructiunea SQL:
SELECT ACTOR.actor_id, first_name, last_name, title
FROM FILM, FILM_ACTOR, ACTOR
WHERE FILM.film_id = FILM_ACTOR.film_id AND ACTOR.actor_id =
FILM_ACTOR.actor_id ORDER BY ACTOR.actor_id;
Se poate folosi şi sintaxa INNER JOIN:
SELECT ACTOR.actor_id, first_name, last_name, title
FROM (FILM INNER JOIN FILM_ACTORON
FILM.film_id=FILM_ACTOR.film_id) INNER JOIN ACTORON
ACTOR.actor_id = FILM_ACTOR.actor_id ORDER BY....;
[Link]@[Link] 13
Interogări in trei relaţii (2)
[Link]@[Link] 14
Interogări in trei relaţii (3)
[Link]@[Link] 15
Subinterogări
Subinterogările sunt operaţii care determină diferite date (valori scalare, tabele
rezultat, număr de elemete etc.) folosite în interogarea de bază
Subinterogările pot conţine la rândul lor alte subinterogări
Exemplul 1: Care sunt angajaţii (nume, prenume, adresa) care lucrează în aceeaşi
secţie cu angajatul cu numele Ionescu şi prenumele Ion?
Se determină printr-o subinterogare în ce secţie lucrează angajaul dat
Se selectează toţi angajaţii din acea secţie:
SELECT Nume, Prenume, Adresa FROM Angajat
WHERE IdSectie = (SELECT IdSectie FROM Angajat WHERE Nume = 'Ionescu'
AND Prenume = 'Ion');
Exemplul 2: Care sunt numele, prenumele, denumirea secţiei şi salariul angajaţilor
care au salariul egal cu salariul maxim pe una din secţii:
Se determină printr-o subinterogare tabelul cu valori maxime ale salariului în fiecare secţie
Se selecteză angajaţii care au salariul în mulţimea salariilor maxime pe sectii:
SELECT Nume, Prenume, Salariul, Denumire FROM Angajat INNER JOIN Sectie ON
[Link]=[Link]
WHERE Salariul IN (SELECT MAX(Salariul) FROM Angajat Group By
IdSectie);
[Link]@[Link] 16
Instrucţiuni pentru selecţia datelor
[Link]@[Link] 17
Cereri de interogare simple
Domeniu
Specifică o opţiune de includere sau eliminare din rezultatul
selecţiei, a înregistrărilor care conţin duplicate
Opţiunile posibile sunt:
ALL cere includerea tuturor înregistrărilor care îndeplinesc
condiţiile impuse
DISTINCT cere eliminarea înregistrărilor care conţin duplicate
în câmpurile selectate, afişând numai o apariţie a acesteia.
DISTINCTROW cere eliminarea înregistrărilor care conţin
duplicate în ansamblul lor, nu numai în câmpurile selectate,
afişând numai o apariţie a acesteia
[Link]@[Link] 18
Cereri de interogare simple
[Link]@[Link] 19
Cereri de interogare simple
[Link]@[Link] 20
Cereri de interogare complexe
[Link]@[Link] 21
Funcţiile de agregare (de grup)
[Link]@[Link] 22
Funcţiile de agregare (de grup)
SELECT [domeniu] funcţie_agregat(nume_câmp) AS alias [,listă_selecţie]
FROM nume_tabel1, nume_tabel2,…
GROUP BY câmp_de_grupare
[HAVING criteriu_de_grupare]
[ORDER BY câmpuri_criteriu [ASC|DESC]];
[Link]@[Link] 23
Joncțiunea (JOIN)
[Link]@[Link] 24
Joncțiunea (JOIN)
[Link]@[Link] 25
Joncțiunea (JOIN)
[Link]@[Link] 26
Joncțiunea (JOIN)
[Link]@[Link] 27
Joncțiunea (JOIN)
SELECT [domeniu] listă_selecţie
FROM nume_tabel1
{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabel2
ON criteriu_de_asociere
[{INNER|LEFT OUTER|RIGHT OUTER} JOIN nume_tabel3
ON criteriu_de_asociere]…
[WHERE criteriu_selecţie]
[ORDER BY câmpuri_criteriu [ASC|DESC]
[Link]@[Link] 28
Combinările (UNION)
[Link]@[Link] 29
Combinările (UNION)
[Link]@[Link] 30
Combinările (UNION)
SELECT nume, prenume, vârstă
FROM Colaboratori2001
UNION
SELECT nume, prenume, vârstă
FROM Colaboratori2002
ORDER BY nume;
[Link]@[Link] 31
Instrucţiuni pentru manipularea datelor
[Link]@[Link] 32
Instrucţiuni pentru manipularea datelor CREATE
[Link]@[Link] 33
Instrucţiuni pentru manipularea datelor INSERT
[Link]@[Link] 34
Instrucţiuni pentru manipularea datelor INSERT
In primul caz se adaugă o singură înregistrare într-un
tabel, menţionându-se câmpurile şi valorile acestora
Se utilizează pentru operaţii simple, care presupun lucrul cu
un număr redus de înregistrări
[Link]@[Link] 35
Instrucţiuni pentru manipularea datelor INSERT
Reguli
Valorile din clauza VALUES trebuie să aibă aceeaşi natură cu
câmpurile din clauza INTO
Mărimea valorii trebuie să fie mai mică decât dimensiunea
câmpului
Este obligatorie corespondenţă între câmp1 şi valoare1, etc.
Dacă un câmp are specificaţia NOT NULL, este obligatorie
introducerea unei valori pentru aceasta
[Link]@[Link] 36
Instrucţiuni pentru manipularea datelor INSERT
[Link]@[Link] 37
Instrucţiuni pentru manipularea datelor INSERT
[Link]@[Link] 38
Instrucţiuni pentru manipularea datelor DELETE
[Link]@[Link] 39
Instrucţiuni pentru manipularea datelor DELETE
DELETE *
FROM Vânzări
DELETE *
FROM Angajaţi
WHERE Vârsta>60
[Link]@[Link] 40
Instrucţiuni pentru manipularea datelor UPDATE
UPDATE nume_tabel
SET nume_câmp1=valoare1 [,nume_câmp2=valoare2]...
[WHERE criteriu_de_actualizare];
[Link]@[Link] 41
Instrucţiuni pentru manipularea datelor UPDATE
Exemplu
UPDATE Comunicaţii
SET Reţea=”Orange”
WHERE Reţea=”Dialog” AND Data>#12.12.2001;
[Link]@[Link] 42
Cereri de interogare imbricate
SELECT lista_câmpuri
FROM tabel1
WHERE tabel1.nume_câmp=
(SELECT nume_câmp
FROM tabel2
WHERE criteriu_de_selecţie);
[Link]@[Link] 43