La nivelul algebrei relationale sunt definiti urmatorii operatori de baza: proiectie, restrictie (selectie), produs cartezian, diferenta, reuniune si redenumire. Cu ajutorul operatorilor de baza poate fi definita orice interogare din algebra relationala.
Proiectia
Fiind data o relatie R si o multime de atribute corespunzatoare acesteia (X = A1, …, Ak), proiectia lui R pe multime de atribute X este o relatie care se obtine prin extragerea din R a atributelor lui X (in ordinea precizata in X) si prin eliminarea tuplurilor duplicat din rezultat.
πA1,…,Ak(R)
Prin intermediul operatiei de proiectie este selectata o submultime a atributelor relatiei initiale.
Consideram relatia tutori(id_tutor, nume_tutor, grad_tutor, birou_tutor, id_departament) cu urmatoarele tupluri:
+----------+-------------------+------------+-------------+----------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | +----------+-------------------+------------+-------------+----------------+ | 1 | Marian Cubos | Sl | B226 | COM | | 2 | Radu Vasilescu | Prof | A210 | COM | | 3 | Lucian Cornea | Conf | A102 | EA | | 4 | Iana Dumitrescu | Asoc | A210 | COM | | 5 | Alexandru Dragota | Prof | B228 | COM | | 6 | Bogdana Isarescu | Drd | B225 | COM | | 7 | Mihai Ionita | As | B226 | NULL | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +----------+-------------------+------------+-------------+----------------+
Proiectia relatiei tutori pe lista de atribute (grad_tutor, birou_tutor) va avea urmatorul rezultat: atributele care nu sunt prezente in multimea de atribute (grad_tutor, birou_tutor) sunt ignorate; sunt pastrate in relatia rezultat doar valorile corespunzatoare atributelor din lista pe care se realizeaza proiectia; sunt eliminate tuplurile duplicat (As, B226), (Prof, NULL) din relatia obtinuta. Tuplurile duplicat apar in rezultat in cazul in care lista de atribute pe care se realizeaza proiectia nu contine atribute de tip cheie.
πgradTutor,birouTutor(tutori)
+------------+-------------+ | grad_tutor | birou_tutor | +------------+-------------+ | Sl | B226 | | Prof | A210 | | Conf | A102 | | Asoc | A210 | | Prof | B228 | | Drd | B225 | | As | B226 | | Prof | NULL | | Prof | C303 | +------------+-------------+
SQL
In limbajul SQL, proiectie se obtine prin intermediul unei instructiuni SELECT in care lista de selectie cuprinde lista atributelor de proiectie. Este necesara prezenta clauzei DISTINCT in instructiunea SQL pentru a elimina posibilele tupluri duplicat din rezultat.
SELECT DISTINCT grad_tutor, birou_tutor FROM tutori
Restrictia
Fiind data o relatie R si o conditie de selectie C, restrictia lui R in raport cu conditia C este o relatie care se obtine prin selectarea tuturor tuplurilor din R care verifica conditia.
σC(R)
Schema relatiei obtinute in urma aplicarii restrictiei este aceeasi cu schema relatiei initiale. Conditia de selectie se defineste prin intermediul unei expresii logice (predicat) care contine operatori logici (AND, OR, NOT) sau de comparare (>, <, =, >=, <=, <>, !=), nume de atribute ale relatiei sau constante din domeniul atributelor relatiei.
Consideram relatia tutori(id_tutor, nume_tutor, grad_tutor, birou_tutor, id_departament) cu urmatoarele tupluri:
+----------+-------------------+------------+-------------+----------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | +----------+-------------------+------------+-------------+----------------+ | 1 | Marian Cubos | Sl | B226 | COM | | 2 | Radu Vasilescu | Prof | A210 | COM | | 3 | Lucian Cornea | Conf | A102 | EA | | 4 | Iana Dumitrescu | Asoc | A210 | COM | | 5 | Alexandru Dragota | Prof | B228 | COM | | 6 | Bogdana Isarescu | Drd | B225 | COM | | 7 | Mihai Ionita | As | B226 | NULL | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +----------+-------------------+------------+-------------+----------------+
σgradTutor='As' AND birouTutor='B226'(tutori)
Restrictia relatiei tutori conform conditiei gradTutor=’As’ and birouTutor=’B226′ este o noua relatie care contine doar tuplurile corespunzatoare tutorilor care au gradul didactic asistent si au biroul in sala B226.
+----------+---------------+------------+-------------+----------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | +----------+---------------+------------+-------------+----------------+ | 7 | Mihai Ionita | As | B226 | COM | | 8 | Iasmina Lolea | As | B226 | COM | +----------+---------------+------------+-------------+----------------+
SQL
Restrictia se exprima in limbajul SQL prin intermediul unei instructiuni SELECT in care lista de selectie cuprinde toate atributele relatiei initiale (*), iar clauza WHERE introduce conditia de selectie.
SELECT * FROM tutori WHERE grad_tutor='As' AND birou_tutor='B226';
Produsul cartezian
Fiind date relatiile R si S, produsul cartezian al acestora, R × S, este multimea tuplurilor formate prin concatenarea fiecarui tuplu al relatiei R cu fiecare tuplu al relatiei S.
R(A1,...,Am) × S(B1,...,Bn) = T(A1,...,Am,B1,...,Bn)
Pentru produsul cartezian gradul relatiei rezultat este egal cu suma gradelor relatiilor operand, in timp ce cardinalitatea relatiei rezultat este egala cu produsul cardinalitatilor relatiilor operand.
Numarul de atribute care contribuie la definirea unei relatii constituie gradul relatiei.
Numarul de tupluri continute de o relatie reprezinta cardinalitatea relatiei respective.
Din punct de vedere relational numele atributelor unei relatii este unic. Daca in rezultatul produsului cartezian sunt prezente atribute cu acelasi nume, se va apela la calificarea numelor atributelor, cu numele relatiilor (nume_relatie.numea_atribut).
Consideram urmatoarele doua relatii: tutori(id_tutor, nume_tutor, grad_tutor, birou_tutor, id_departament) si departamente(id_departament, nume_departament, telefon_departament, id_facultate).
+----------+-------------------+------------+-------------+----------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | +----------+-------------------+------------+-------------+----------------+ | 1 | Marian Cubos | Sl | B226 | COM | | 2 | Radu Vasilescu | Prof | A210 | COM | | 3 | Lucian Cornea | Conf | A102 | EA | | 4 | Iana Dumitrescu | Asoc | A210 | COM | | 5 | Alexandru Dragota | Prof | B228 | COM | | 6 | Bogdana Isarescu | Drd | B225 | COM | | 7 | Mihai Ionita | As | B226 | NULL | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +----------+-------------------+------------+-------------+----------------+
+----------------+----------------------------------------+---------------------+--------------+ | id_departament | nume_departament | telefon_departament | id_facultate | +----------------+----------------------------------------+---------------------+--------------+ | COM | Comunicatii | +40.256.403.301 | 5 | | EA | Electronica aplicata | +40.256.403.331 | 5 | | MEO | Masurari si electronica optica, | +40.256.403.361 | 5 | | AIA | Automatica si informatica aplicata | NULL | 2 | | CTI | Calculatoare si tehnologia informatiei | +40.256.403.261 | 2 | | MAT | Matematica | +40.256.403.000 | 0 | | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | 6 | | MNG | Management | +40.256.404.284 | 8 | | ESU | Stiinte economice si socio-umane | +40.256.404.284 | 8 | +----------------+----------------------------------------+---------------------+--------------+
tutori × departamente
Schema relatia corespunzatoare produsului cartezian este obtinuta prin concatenarea schemelor celor doua relatii (tutori, departamente).
+----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+-----------------------------+--------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | id_departament | nume_departament | telefon_departament | web_departament | id_facultate | +----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+-----------------------------+--------------+ | 1 | Marian Cubos | Sl | B226 | COM | ESU | Stiinte economice si socio-umane | +40.256.404.284 | NULL | 8 | | 1 | Marian Cubos | Sl | B226 | COM | MNG | Management | +40.256.404.284 | NULL | 8 | | 1 | Marian Cubos | Sl | B226 | COM | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | https://www.et.utt.ro/bfi/ | 6 | | 1 | Marian Cubos | Sl | B226 | COM | MAT | Matematica | +40.256.403.000 | https://mat.utt.ro/ | 0 | | 1 | Marian Cubos | Sl | B226 | COM | CTI | Calculatoare si tehnologia informatiei | +40.256.403.261 | https://www.cs.utt.ro/ | 2 | | 1 | Marian Cubos | Sl | B226 | COM | AIA | Automatica si informatica aplicata | NULL | https://www.aut.utt.ro/ | 2 | | 1 | Marian Cubos | Sl | B226 | COM | MEO | Masurari si electronica optica, | +40.256.403.361 | https://www.meo.etc.utt.ro/ | 5 | | 1 | Marian Cubos | Sl | B226 | COM | EA | Electronica aplicata | +40.256.403.331 | https://www.ea.etc.utt.ro/ | 5 | | 1 | Marian Cubos | Sl | B226 | COM | COM | Comunicatii | +40.256.403.301 | https://www.tc.etc.utt.ro/ | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | ESU | Stiinte economice si socio-umane | +40.256.404.284 | NULL | 8 | | 2 | Radu Vasilescu | Prof | A210 | COM | MNG | Management | +40.256.404.284 | NULL | 8 | | 2 | Radu Vasilescu | Prof | A210 | COM | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | https://www.et.utt.ro/bfi/ | 6 | | 2 | Radu Vasilescu | Prof | A210 | COM | MAT | Matematica | +40.256.403.000 | https://mat.utt.ro/ | 0 | | 2 | Radu Vasilescu | Prof | A210 | COM | CTI | Calculatoare si tehnologia informatiei | +40.256.403.261 | https://www.cs.utt.ro/ | 2 | | 2 | Radu Vasilescu | Prof | A210 | COM | AIA | Automatica si informatica aplicata | NULL | https://www.aut.utt.ro/ | 2 | | 2 | Radu Vasilescu | Prof | A210 | COM | MEO | Masurari si electronica optica, | +40.256.403.361 | https://www.meo.etc.utt.ro/ | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | EA | Electronica aplicata | +40.256.403.331 | https://www.ea.etc.utt.ro/ | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | COM | Comunicatii | +40.256.403.301 | https://www.tc.etc.utt.ro/ | 5 | ... +----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+-----------------------------+--------------+
In cazul in care relatiile contin atribute cu acelasi nume, referirea acestora se va realiza prin numele calificat al atributelor. O alternativa la aceasta abordare o reprezinta utilizarea operatorului de redenumire, pentru atributele cu acelasi nume.
ρresult(id_tutor,nume_tutor,grad_tutor,birou_tutor,id_departament1,id_departament2,nume_departament,telefon_departament,id_facultate)(tutori × departamente)
SQL
Produsul cartezian se exprima in limbajul SQL prin intermediul unei instructiunii SELECT in care lista de selectie contine atributele celor doua relatii operand, iar clauza FROM contine numele relatiilor operand.
SELECT * FROM tutori, departamante;
Redenumirea
Operatia de redenumire permite stabilirea unei noi scheme pentru o relatie. Prin aplicarea operatorului de redenumire asupra unei relatii R(A1,…,Am) se obtine o noua relatie, identica cu cea initiala, care detine un nou nume si/sau care detine nume noi pentru atributele ei.
ρS(B1,...,Bm)(R)
Daca se doreste doar modificarea numelui relatiei, numele atributelor ramanand aceleasi, atunci se poate utiliza o versiune simplificata a operatorului de redenumire.
ρS(R)
Pentru relatia tutori(id_tutor, nume_tutor, grad_tutor, birou_tutor, id_departament) consideram urmatoarele situatii: redenumirea relatiei; redenumirea atributelor relatiei; redenumirea relatiei si a atributelor relatiei.
+----------+-------------------+------------+-------------+----------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | +----------+-------------------+------------+-------------+----------------+ | 1 | Marian Cubos | Sl | B226 | COM | | 2 | Radu Vasilescu | Prof | A210 | COM | | 3 | Lucian Cornea | Conf | A102 | EA | | 4 | Iana Dumitrescu | Asoc | A210 | COM | | 5 | Alexandru Dragota | Prof | B228 | COM | | 6 | Bogdana Isarescu | Drd | B225 | COM | | 7 | Mihai Ionita | As | B226 | NULL | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +----------+-------------------+------------+-------------+----------------+
Redenumirea relatiei tutori la valoare personal, pastrand numele atributelor din relatia tutori, se realizeaza astfel:
ρpersonal(tutori)
Daca se doreste doar modificarea numelui atributelor relatiei tutori, este suficienta precizarea unei liste cu noile denumiri ale atributelor.
ρ(idT,numeT,gradT,birouT,idD)(tutori)
+-----+-------------------+-------+--------+------+ | idT | numeT | numeT | birouT | idD | +-----+-------------------+-------+--------+------+ | 1 | Marian Cubos | Sl | B226 | COM | | 2 | Radu Vasilescu | Prof | A210 | COM | | 3 | Lucian Cornea | Conf | A102 | EA | | 4 | Iana Dumitrescu | Asoc | A210 | COM | | 5 | Alexandru Dragota | Prof | B228 | COM | | 6 | Bogdana Isarescu | Drd | B225 | COM | | 7 | Mihai Ionita | As | B226 | NULL | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +-----+-------------------+-------+--------+------+
Pentru a modifica atat numele relatiei, din tutori in personal, cat si numele atributelor (id_tutor, nume_tutor, grad_tutor, birou_tutor, id_departament) la valorile (idT, numeT, gradT, birouT, idD), este necesara urmatoarea expresie:
ρpersonal(idT,numeT,gradT,birouT,idD)(tutori)
SQL
In limbajul SQL, redenumirea se obtine cu ajutorul alias-urilor, indiferent daca facem referire la atribute sau relatii.
SELECT * FROM tutori AS personal;
SELECT id_tutor AS idT, nume_tutor AS numeT, grad_tutor AS numeT, birou_tutor AS birouT, id_departament AS idD FROM tutori;
SELECT personal.id_tutor AS idT, personal.nume_tutor AS numeT, personal.grad_tutor AS numeT, personal.birou_tutor AS birouT, personal.id_departament AS idD FROM tutori AS personal;
Reuniunea
Fiind date relatiile R si S, reuniunea acestora, R ∪ S, este o relatie definita pe schema lui R sau S, care include toate tuplurile care apartin uneia din cele doua relatii sau ambelor relatii.
R ∪ S
Reuniunea a doua relatii este posibila daca acestea detin acelasi numar de atribute si domeniul atributelor care ocupa aceeasi pozitie este acelasi.
Relatiile tutori(id_tutor, nume_tutor, grad_tutor, birou_tutor, id_departament) si studenti(id_student, nume_student) nu sunt compatibile din punct de vedere al operatiilor corespunzatoare multimilor (reuniune, intersectie, diferenta).
+----------+-------------------+------------+-------------+----------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | +----------+-------------------+------------+-------------+----------------+ | 1 | Marian Cubos | Sl | B226 | COM | | 2 | Radu Vasilescu | Prof | A210 | COM | | 3 | Lucian Cornea | Conf | A102 | EA | | 4 | Iana Dumitrescu | Asoc | A210 | COM | | 5 | Alexandru Dragota | Prof | B228 | COM | | 6 | Bogdana Isarescu | Drd | B225 | COM | | 7 | Mihai Ionita | As | B226 | NULL | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +----------+-------------------+------------+-------------+----------------+
+------------+-------------------+ | id_student | nume_student | +------------+-------------------+ | 1 | Flavian Raicovici | | 2 | Adrian Popescu | | 3 | Radu Vasilescu | | 4 | Marius Cornea | | 5 | Elena Ionescu | | 6 | Ioana Cernea | | 7 | Irinel Pop | | 8 | Corina Dragota | | 9 | Ion Baciu | | 10 | Carmen Draghici | +------------+-------------------+
Totusi, putem considera proiectiile celor doua relatii pe atributul corespunzator numelui persoanei, caz in care putem aplica operatiile preluate din teoria multimilor.
Dorim sa obtinem o noua relatie care contine nume de persoane, indiferent de relatia in care acestea sunt inregistrate. Daca exista tupluri duplicat (tutori cu acelasi nume, studenti cu acelasi nume, tutori si studenti care au acelasi nume), acestea vor fi eliminate din rezultat.
πnume_tutor (tutori) ∪ πnume_student (studenti)
ρpersoane(nume)(πnume_tutor (tutori) ∪ πnume_student (studenti))
+-------------------+ | nume | +-------------------+ | Marian Cubos | | Radu Vasilescu | | Lucian Cornea | | Iana Dumitrescu | | Alexandru Dragota | | Bogdana Isarescu | | Mihai Ionita | | Iasmina Lolea | | Traian Paunescu | | Ivan Popov | | Cornel Duran | | Flavian Raicovici | | Adrian Popescu | | Marius Cornea | | Elena Ionescu | | Ioana Cernea | | Irinel Pop | | Corina Dragota | | Ion Baciu | | Carmen Draghici | +-------------------+
Reuniunea este o operatie comutativa si asociativa pentru relatii compatibile.
R ∪ S = S ∪ R (R ∪ S) ∪ T = R ∪ (S ∪ T)
SQL
In limbajul SQL, reuniunea se obtine prin intermediul operatorului UNION (UNION DISTINCT), care permite combinarea rezultatelor mai multor instructiuni SELECT.
SELECT nume_tutor FROM tutori UNION SELECT nume_student FROM studenti;
Diferenta
Fiind date relatiile R si S, diferenta acestora, R – S, este o relatie definita pe schema lui R sau S, care include toate tuplurile din relatia R care nu apar in relatia S.
R – S
Diferenta a doua relatii este posibila daca acestea detin acelasi numar de atribute si domeniul atributelor care ocupa aceeasi pozitie este acelasi.
Pentru a obtine numele de tutori care nu sunt utilizate de catre studenti consideram diferenta proiectiile celor doua relatii (tutori, studenti) pe atributul corespunzator numelui persoanei.
πnume_tutor (tutori) – πnume_student (studenti)
ρpersoane(nume)(πnume_tutor (tutori) – πnume_student (studenti))
+-------------------+ | nume | +-------------------+ | Marian Cubos | | Lucian Cornea | | Iana Dumitrescu | | Alexandru Dragota | | Bogdana Isarescu | | Mihai Ionita | | Iasmina Lolea | | Traian Paunescu | | Ivan Popov | | Cornel Duran | +-------------------+
SQL
In limbajul SQL, diferenta se exprima prin intermediul operatorului MINUS, care se aplica rezultatelor a doua instructiuni SELECT.
SELECT nume_tutor FROM tutori MINUS SELECT nume_student FROM studenti;
MySQL
Operatorul MINUS nu este disponibil in sistemul de gestiune a bazelor de date MySQL.
SELECT nume_tutor AS nume FROM tutori WHERE nume_tutor NOT IN (SELECT nume_student FROM studenti);
SELECT nume_tutor AS nume FROM tutori LEFT JOIN studenti ON nume_tutor=nume_student WHERE nume_student IS NULL;