La nivelul algebrei relationale sunt definiti urmatorii operatori derivati: jonctiune, intersectie si diviziune. Rolul operatorilor derivati este acela de a simplifica expresii mult prea lungi, introduse folosind operatorii de baza.
Jontiunea theta
Jonctiunea este o operatie binara care permite combinarea tuplurilor a doua relatii intr-o noua relatie. Jonctiunea permite stabilirea unor asocieri intre tuplurile relatiilor, prin intermediul evaluarii unei conditii de jonctiune (conditie de legatura sau join).
Fiind date relatiile R si S, jonctiunea theta, R ⋈θ S, este o relatie in care fiecare tuplu este o asociere a doua tupluri, unul din R, celalalt din S, unde asocierea indeplineste conditia de jonctiune θ.
R ⋈θ S
Jonctiunea theta permite combinarea produsului cartezian si a restrictiei intr-o singura operatie. Schema relatiei rezultat se obtine prin alaturarea schemelor relatiilor initiale (este identica cu cea obtinuta prin aplicarea produsului cartezian). Conditia de jonctiune se defineste prin intermediul unei expresii logice care contine operatori logici (and, or, not) sau de comparare (>, <, =, >=, <=, <>, !=), nume de atribute ale relatiilor initiale sau constante din domeniul atributelor relatiilor initiale.
R ⋈θ S = σθ (R × S)
Un caz particular al jonctiunii theta il reprezinta echi-jonctiunea (equi join), caz in care conditia de jonctiunea este implementata folosind doar operatorul de egalitate (=).
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 | +----------------+----------------------------------------+---------------------+--------------+
Dorim sa obtinem o relatie in care precizam pentru fiecare tutor datele departamentului la care acesta este inregistrat. Conditia de jonctiune are, in acest caz, urmatoarea forma: t.id_departament = d.id_departament. Deoarece cele doua relatii detin atribute cu acelasi nume, este necesara utilizarea numelui calificat al atributelor (nume_relatie.nume_atribut).
tutori ⋈t.id_departament=d.id_departament departamente
+----------+-------------------+------------+-------------+----------------+----------------+-------------------------------+---------------------+--------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | id_departament | nume_departament | telefon_departament | id_facultate | +----------+-------------------+------------+-------------+----------------+----------------+-------------------------------+---------------------+--------------+ | 1 | Marian Cubos | Sl | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 3 | Lucian Cornea | Conf | A102 | EA | EA | Electronica aplicata | +40.256.403.331 | 5 | | 4 | Iana Dumitrescu | Asoc | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 5 | Alexandru Dragota | Prof | B228 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 6 | Bogdana Isarescu | Drd | B225 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 8 | Iasmina Lolea | As | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 9 | Traian Paunescu | Prof | NULL | MAT | MAT | Matematica | +40.256.403.000 | 0 | | 10 | Ivan Popov | Prof | C303 | BFI | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | 6 | | 11 | Cornel Duran | Prof | NULL | MNG | MNG | Management | +40.256.404.284 | 8 | +----------+-------------------+------------+-------------+----------------+----------------+-------------------------------+---------------------+--------------+
Tuplurile in care atributele din conditia de jonctiune au valori NULL nu apar in relatia rezultat (pentru tutorul Mihai Ionita nu este precizat departamentul, in relatia tutori). Putem observa faptul ca rezultatul este similar cu rularea unei restrictii in raport cu conditia t.id_departament = d.id_departament, pe produsul cartezian al relatiilor tutori, departamente.
SQL
Jonctiunea theta se exprima in limbajul SQL prin intermediul unei instructiunii SELECT in care clauza FROM contine numele relatiilor operand, iar conditia de jonctiune este precizata in clauza WHERE (eventual, alaturi de conditia de selectie (AND)).
SELECT * FROM tutori t, departamente d WHERE t.id_departament=d.id_departament;
SELECT * FROM tutori t JOIN departamente d ON t.id_departament=d.id_departament;
Jonctiunea naturala
Fiind date relatiile R si S, jonctiunea naturala, R ⋈ S, este proiectia echi-jonctiunii celor doua relatii pe reuniunea atributelor lor.
R ⋈ S
Jonctiunea naturala este un caz particular de echi-jonctiune in care atributele comune din cele doua relatii apar o singura data in relatia rezultat. Atributele comune sunt reprezentate de una sau mai multe perechi de atribute care participa la conditia de jonctiune si care detin acelasi nume in ambele relatii. Daca atributele care sunt necesare in conditia de jonctiune nu detin acelasi nume, este necesara utilizarea operatorului de redenumire.
Pentru exemplul precedent (tutorii si departamentele in care acestia sunt inregistrati), conditia de jonctiune este realizata prin intermediul celor doua atribute idDepartament din relatiile tutori, respectiv departamente. Jonctiunea naturala, in acest caz, are urmatoarea forma:
tutori ⋈ departamente
+----------------+----------+-------------------+------------+-------------+-------------------------------+---------------------+--------------+ | id_departament | id_tutor | nume_tutor | grad_tutor | birou_tutor | nume_departament | telefon_departament | id_facultate | +----------------+----------+-------------------+------------+-------------+-------------------------------+---------------------+--------------+ | COM | 1 | Marian Cubos | Sl | B226 | Comunicatii | +40.256.403.301 | 5 | | COM | 2 | Radu Vasilescu | Prof | A210 | Comunicatii | +40.256.403.301 | 5 | | EA | 3 | Lucian Cornea | Conf | A102 | Electronica aplicata | +40.256.403.331 | 5 | | COM | 4 | Iana Dumitrescu | Asoc | A210 | Comunicatii | +40.256.403.301 | 5 | | COM | 5 | Alexandru Dragota | Prof | B228 | Comunicatii | +40.256.403.301 | 5 | | COM | 6 | Bogdana Isarescu | Drd | B225 | Comunicatii | +40.256.403.301 | 5 | | COM | 8 | Iasmina Lolea | As | B226 | Comunicatii | +40.256.403.301 | 5 | | MAT | 9 | Traian Paunescu | Prof | NULL | Matematica | +40.256.403.000 | 0 | | BFI | 10 | Ivan Popov | Prof | C303 | Bazele fizice ale inginerieie | +40.256.403.398 | 6 | | MNG | 11 | Cornel Duran | Prof | NULL | Management | +40.256.404.284 | 8 | +----------------+----------+-------------------+------------+-------------+-------------------------------+---------------------+--------------+
Putem observa ca in relatia rezultat atributele comune, cu numele id_departament, sunt precizate o singura data. Atributele comune vor detine roluri de chei in relatiile operand, mai exact cheie primara in relatia departamente), respectiv cheie externa in relatia tutori.
Expresia corespunzatoare jonctiunii naturale, pentru relatiile tutori si departamente, poate fi rescrisa cu ajutorul operatorilor pentru proiectie, respectiv echi-jonctiune.
πid_departament,id_tutor,nume_tutor,grad_tutor,birou_tutor,nume_departament,telefon_departament,id_facultate (tutori ⋈t.id_departament=d.id_departament departamente)
Daca tuplurile dintr-o relatie nu prezinta corespondent in cea de-a doua relatie, atunci acestea nu contribuie la operatia de jonctiune (tupluri marioneta).
SQL
Exprimarea jonctiunii naturale in limbajul SQL se face prin precizarea atributelor comune si necomune o singura data, in lista de selectie a unei instructiuni SELECT. Similar jonctiunii theta clauza FROM contine numele relatiilor operand, iar conditia de jonctiune este precizata in clauza WHERE.
SELECT t.id_departament, id_tutor, nume_tutor, grad_tutor, nume_departament, telefon_departament, id_facultate FROM tutori t, departamente d WHERE t.id_departament=d.id_departament;
O alta modalitate, mai eficienta, de exprimare a jonctiunii naturale in limbajul SQL o reprezinta utilizarea operatorului NATURAL JOIN in clauza FROM.
SELECT * FROM tutori NATURAL JOIN departamente;
Semi-jonctiunea
Fiind date relatiile R si S, semi-jonctiunea, R ᐅᐸ S, este proiectia jonctiunii naturale a celor doua relatii pe atributele relatiei R.
R ᐅᐸ S = πR(R ᐅᐊ S)
Semi-jonctiunea permite obtinerea unei relatii care este formata din tuplurile primei relatii operand care participa la jonctiune.
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 | +----------------+----------------------------------------+---------------------+--------------+
Putem exprima semi-jonctiunea relatiilor tutori si departamente pentru a obtine tutorii care sunt inregistrati intr-un departament valid (prin verificarea tuplurilor din relatia tutori care prezinta un corespondent in relatia departament).
tutori ᐅᐸ departamente
+----------+-------------------+------------+-------------+----------------+ | 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 | | 8 | Iasmina Lolea | As | B226 | COM | | 9 | Traian Paunescu | Prof | NULL | MAT | | 10 | Ivan Popov | Prof | C303 | BFI | | 11 | Cornel Duran | Prof | NULL | MNG | +----------+-------------------+------------+-------------+----------------+
SQL
In limbajul SQL, semi-jonctiunea se exprima prin precizarea in lista de selectie a unei instructiuni SELECT a atributelor din prima relatie, si prin utilizarea unei subinterogari pe a doua relatie in clauza WHERE, pentru filtrarea tuplurilor din prima relatie care au corespondent in cea de-a doua.
SELECT * FROM tutori t WHERE EXISTS (SELECT d.id_departament FROM departamente d WHERE t.id_departament=d.id_departament);
MySQL
SELECT * FROM tutori t WHERE EXISTS (SELECT d.id_departament FROM departamente d WHERE t.id_departament=d.id_departament);
SELECT * FROM tutori WHERE idDepartament IN (SELECT idDepartament FROM departamente);
Jonctiunea externa
Jonctiunile descrise anterior, jonctiuni interne, nu permit obtinerea in rezultat a tuplurile din relatiile operand care nu au corespondent. Introducerea in relatia rezultat si a tuplurilor faca corespondent se face cu ajutorul jonctiunilor externe, care permit completarea tuplului lipsa cu valori NULL. Intalnim trei tipuri de jonctiuni externe: jonctiune externa completa (FULL OUTER JOIN), jonctiune externa stanga (LEFT OUTER JOIN), respectiv jonctiune externa dreapta (RIGHT OUTER JOIN).
Jonctiunea externa completa (⟗) permite includerea in relatia rezultat si a tuturor tuplurilor fara corespondent, indiferent de relatia operand din care acestea fac parte. Atributele corespunzatoare tuplurilor lipsa vor lua valoarea NULL.
Jonctiunea externa stanga (⟕) permite includerea in relatia rezultat si a tuplurilor din prima relatie operand (stanga) care nu au corespondent in a doua relatie. Atributele corespunzatoare tuplului lipsa din a doua relatie vor lua valoarea NULL.
Jonctiunea externa dreapta (⟖) permite includerea in relatia rezultat si a tuplurilor din a doua relatie operand (dreapta) care nu au corespondent in prima relatie. Atributele corespunzatoare tuplului lipsa din prima relatie vor lua valoarea NULL.
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 | +----------------+----------------------------------------+---------------------+--------------+
Putem introduce cele trei tipuri de jonctiuni externe (jonctiune externa completa, jonctiune externa stanga, jonctiune externa dreapta) cu ajutorul celor doua relatii.
tutori ⟗ departamente
+----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+--------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | id_departament | nume_departament | telefon_departament | id_facultate | +----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+--------------+ | 1 | Marian Cubos | Sl | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 3 | Lucian Cornea | Conf | A102 | EA | EA | Electronica aplicata | +40.256.403.331 | 5 | | 4 | Iana Dumitrescu | Asoc | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 5 | Alexandru Dragota | Prof | B228 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 6 | Bogdana Isarescu | Drd | B225 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 7 | Mihai Ionita | As | B226 | NULL | NULL | NULL | NULL | NULL | | 8 | Iasmina Lolea | As | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 9 | Traian Paunescu | Prof | NULL | MAT | MAT | Matematica | +40.256.403.000 | 0 | | 10 | Ivan Popov | Prof | C303 | BFI | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | 6 | | 11 | Cornel Duran | Prof | NULL | MNG | MNG | Management | +40.256.404.284 | 8 | | NULL | NULL | NULL | NULL | NULL | MEO | Masurari si electronica optica, | +40.256.403.361 | 5 | | NULL | NULL | NULL | NULL | NULL | AIA | Automatica si informatica aplicata | NULL | 2 | | NULL | NULL | NULL | NULL | NULL | CTI | Calculatoare si tehnologia informatiei | +40.256.403.261 | 2 | | NULL | NULL | NULL | NULL | NULL | ESU | Stiinte economice si socio-umane | +40.256.404.284 | 8 | +----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+--------------+
tutori ⟕ departamente
+----------+-------------------+------------+-------------+----------------+----------------+-------------------------------+---------------------+--------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | id_departament | nume_departament | telefon_departament | id_facultate | +----------+-------------------+------------+-------------+----------------+----------------+-------------------------------+---------------------+--------------+ | 1 | Marian Cubos | Sl | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 3 | Lucian Cornea | Conf | A102 | EA | EA | Electronica aplicata | +40.256.403.331 | 5 | | 4 | Iana Dumitrescu | Asoc | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 5 | Alexandru Dragota | Prof | B228 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 6 | Bogdana Isarescu | Drd | B225 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 7 | Mihai Ionita | As | B226 | NULL | NULL | NULL | NULL | NULL | | 8 | Iasmina Lolea | As | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 9 | Traian Paunescu | Prof | NULL | MAT | MAT | Matematica | +40.256.403.000 | 0 | | 10 | Ivan Popov | Prof | C303 | BFI | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | 6 | | 11 | Cornel Duran | Prof | NULL | MNG | MNG | Management | +40.256.404.284 | 8 | +----------+-------------------+------------+-------------+----------------+----------------+-------------------------------+---------------------+--------------+
tutori ⟖ departamente
+----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+--------------+ | id_tutor | nume_tutor | grad_tutor | birou_tutor | id_departament | id_departament | nume_departament | telefon_departament | id_facultate | +----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+--------------+ | 1 | Marian Cubos | Sl | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 2 | Radu Vasilescu | Prof | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 3 | Lucian Cornea | Conf | A102 | EA | EA | Electronica aplicata | +40.256.403.331 | 5 | | 4 | Iana Dumitrescu | Asoc | A210 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 5 | Alexandru Dragota | Prof | B228 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 6 | Bogdana Isarescu | Drd | B225 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 8 | Iasmina Lolea | As | B226 | COM | COM | Comunicatii | +40.256.403.301 | 5 | | 9 | Traian Paunescu | Prof | NULL | MAT | MAT | Matematica | +40.256.403.000 | 0 | | 10 | Ivan Popov | Prof | C303 | BFI | BFI | Bazele fizice ale inginerieie | +40.256.403.398 | 6 | | 11 | Cornel Duran | Prof | NULL | MNG | MNG | Management | +40.256.404.284 | 8 | | NULL | NULL | NULL | NULL | NULL | MEO | Masurari si electronica optica, | +40.256.403.361 | 5 | | NULL | NULL | NULL | NULL | NULL | AIA | Automatica si informatica aplicata | NULL | 2 | | NULL | NULL | NULL | NULL | NULL | CTI | Calculatoare si tehnologia informatiei | +40.256.403.261 | 2 | | NULL | NULL | NULL | NULL | NULL | ESU | Stiinte economice si socio-umane | +40.256.404.284 | 8 | +----------+-------------------+------------+-------------+----------------+----------------+----------------------------------------+---------------------+--------------+
SQL
In limbajul SQL, cele trei tipuri de jonctiuni externe se exprima prin intermediul unei instructiunii SELECT in care clauza FROM contine numele relatiilor operand despartite de unul din operatorii FULL OUTER JOIN, LEFT OUTER JOIN, respectiv RIGHT OUTER JOIN.
SELECT * FROM tutori t FULL OUTER JOIN departamente d ON t.id_departament=d.id_departament;
SELECT * FROM tutori t LEFT OUTER JOIN departamente d ON t.id_departament=d.id_departament;
SELECT * FROM tutori t RIGHT OUTER JOIN departamente d ON t.id_departament=d.id_departament;
MySQL
Operatorul FULL OUTER JOIN nu este disponibil in sistemul de gestiune a bazelor de date MySQL.
SELECT * FROM tutori t LEFT OUTER JOIN departamente d ON t.id_departament=d.id_departament UNION SELECT * FROM tutori t RIGHT OUTER JOIN departamente d ON t.id_departament=d.id_departament;
Intersectia
Fiind date relatiile R si S, intersectia acestora, R ∩ S, este o relatie definita pe schema lui R sau S care include toate tuplurile din relatia R care apar si in relatia S.
R ∩ S
Intersectia 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 sunt utilizate de catre studenti consideram intersectia proiectiilor 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 | +----------------+ | Radu Vasilescu | +----------------+
Intersectia este un operator derivat; orice operatie de intersectia poate fi exprimata folosind diferenta (–) sau jonctiunea (⋈).
R ∩ S = R – (R – S)
R ∩ S = R ⋈ S
SQL
In limbajul SQL, intersectia este obtinuta prin intermediul operatorului INTERSECT, care se aplica rezultatelor a doua instructiuni SELECT. Operatorul nu este disponibil in sistemul de gestiune a bazelor de date MySQL.
SELECT nume_tutor FROM tutori INTERSECT SELECT nume_student FROM studenti;
MySQL
SELECT nume_tutor AS nume FROM tutori JOIN studenti ON nume_tutor=nume_student;
Diviziunea
Fiind date relatiile R si S, cu schema relatiei S inclusa in schema relatiei R, diviziunea R / S (R ÷ S), este o relatie definita pe diferenta atributelor celor doua relatii operand (toate atributele lui R care nu apar in S) care contine tuplurile din R pentru care orice tuplu din S prezinta un corespondent in R.
R / S = πR-S (R) – πR-S ((πR-S (R) × S) – R)
Consideram urmatoarele relatii: studenti(id_student, nume_student), cursuriT(id_curs, denumire_curs, nume_tutor), studenti_cursuri(id_student, id_curs).
+------------+-------------------+ | 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 | +------------+-------------------+
+---------+--------------------------------------------+-------------------+ | id_curs | denumire_curs | nume_tutor | +---------+--------------------------------------------+-------------------+ | 1 | Sisteme de gestiune a datelor | Marian Cubos | | 2 | Programare orientata pe obiecte | Marian Cubos | | 3 | Proiect de software | Radu Vasilescu | | 4 | Compresie audio video | Radu Vasilescu | | 5 | Testarea echipamentelor de telecomunicatii | Radu Vasilescu | | 6 | Proiect de dezvoltare | Iana Dumitrescu | | 7 | Tehnologii Web 2.0 | Iana Dumitrescu | | 8 | Securitatea transmiterii informatiei | Alexandru Dragota | | 9 | Circuite integrate analogice | Lucian Cornea | | 10 | Microeconomie | Cornel Duran | | 11 | Analiza matematica | Traian Paunescu | | 12 | Fizica | Ivan Popov | +---------+--------------------------------------------+-------------------+
+---------+------------+ | id_curs | id_student | +---------+------------+ | 1 | 2 | | 1 | 5 | | 1 | 6 | | 2 | 1 | | 3 | 1 | | 3 | 3 | | 3 | 4 | | 3 | 7 | ... +---------|------------|
Dorim sa obtinem numele studentilor care au urmat toate cursurile predate de tutorul Radu Vasilescu. Pentru a exprima aceasta interogare cu ajutorul diviziunii, obtinem mai intai lista identificatorilor (id_curs) tuturor cursurilor predate de acest tutor (relatia rvCid).
ρrvCid (πid_curs (σnume_tutor='Radu Vasilescu' (cursuriT)))
+---------+ | id_curs | +---------+ | 3 | | 4 | | 5 | +---------+
Putem aplica operatia diviziune pe relatiile studenti_cursuri(id_student, id_curs), rvCid(id_curs), pentru a obtine identificatorii studentilor care au urmat toate cursurile predate de Radu Vasilescu.
ρrvSid (studenti_cursuri / rvCid)
+------------+ | id_student | +------------+ | 1 | | 3 | | 4 | | 7 | +------------+
Proiectia jonctiunii naturale a relatiilor rvSid(id_student) si studenti(id_student, nume_student) pe atributele id_student, nume_student determina obtinerea unei relatii care contine numele studentilor care au urmat toate cursurile predate de tutorul Radu Vasilescu.
πid_student,nume_student (rvSid ⋈ studenti)
+------------+-------------------+ | id_student | nume_student | +------------+-------------------+ | 1 | Flavian Raicovici | | 3 | Radu Vasilescu | | 4 | Marius Cornea | | 7 | Irinel Pop | +------------+-------------------+
Exprimarea operatiei diviziune din exemplul precedent se poate face cu ajutorul operatorilor de baza (proiectie, diferenta, produs cartezian) astfel:
ρrvSid (studenti_cursuri / rvCid) = πid_student (studenti_cursuri) – πid_student ((πid_student (studenti_cursuri) × rvCid) – studenti_cursuri)
sql
-- grouping SELECT id_student FROM studenti_cursuri WHERE id_curs IN (SELECT id_curs FROM cursuriT WHERE nume_tutor='Radu Vasilescu') GROUP BY id_student HAVING COUNT(*) = (SELECT COUNT(*) FROM cursuriT WHERE nume_tutor='Radu Vasilescu');
-- existence SELECT DISTINCT sc1.id_student FROM studenti_cursuri AS sc1 WHERE NOT EXISTS (SELECT id_curs FROM cursuriT AS c WHERE nume_tutor='Radu Vasilescu' AND NOT EXISTS (SELECT id_curs FROM studenti_cursuri AS sc2 WHERE sc2.id_student=sc1.id_student AND sc2.id_curs=c.id_curs));