Documente Academic
Documente Profesional
Documente Cultură
Theta şi echijoncţiunea
Dintre tipurile de joncţiuni prezentate în capitolul 3, vom insista în aceast subcapitol asupra theta –
joncţiunii şi echijoncţiunii. SQL nu prezintă clauze sau operatori speciali pentru joncţiune, însă după cum
am văzut, joncţiunea se constituie ca o combinaţie între produs cartezian şi selecţie.
Exemplu:
Exemplul algebrei relaţionale pentru theta – joncţionarea relaţiilor R1 şi R2 se scrie:
SELECT *
FROM R1, R2
WHERE R1.C1 > R2.C5
SELECT *
FROM R1, R2
WHERE R1.C1 = R2.C5
Joncţiunea naturală poate fi realizată numai prin specificarea numelor atributelor în clauza SELECT a
frazei de interogare. În standardul SQL-92 şi în implementările SQL ale multor SGBD-uri se poate folosi
o variantă mai elegantă, ţinând seama şi de faptul că tot ce înseamnă theta- şi echijoncţiune reprezintă
pentru SQL, INNER JOIN (joncţiune internă).
Prin urmare, cele două soluţii de mai sus pot fi rescrise, după cum urmează:
SELECT *
FROM R1 INNER JOIN R2 ON R1.C1 > R2.C5,
respectiv
SELECT *
FROM R1 INNER JOIN R2 ON R1.C1 = R2.C3.
Exemplu:
Să se afle numele, facultatea şi secţia studenţilor care stau la căminul Caminul Sportiv?.
- varianta 1 (generală):
Exemplu:
Care sunt cărţile scrise de Radu Irina?
- varianta 1 (generală):
SELECT titlu, AUTOR.nume autor
FROM AUTOR, AUTORCARTE, CARTE
WHERE AUTOR.cod autor =
AUTORCARTE.cod autor AND
AUTORCARTE.cota carte = CARTE.cota carte
AND nume autor = „Victor Stanciu”
Exemplu:
Numele studenţilor care au împrumutat cărţi din domeniul Informatică.
- varianta 1 (generală):
SELECT nume
FROM CARTE, STUDCARTE, STUDENT
WHERE CARTE.cota carte = STUDCARTE.cota carte AND STUDCARTE.numar
matricol = STUDENT.numar matricol AND domeniu = „Informatica”
Exemplu:
Numele şi secţia studenţilor Facultăţii de Ştiinţe Economice care au împrumutat cartea cu titlul Baze de
date în luna februarie 2017?
- varianta 1 (generală):
Exemplu:
Din ce localităţi sunt studenţii născuţi în anul 1995?
- varianta 1 (generală):
Exemplu:
Cum se numesc studenţii care nu sunt din Târgovişte, au bursă de merit şi sunt cazaţi în Caminul nr. 2?
Exemplu:
Care sunt studenţii Facultăţii de Ştiinţie Economice, născuţi înainte de anul 1992, care au împrumutat
cărţi în anul 2016.
Observaţie: Studentul Tudorache Ionelia apare de două ori, pentru că datele de împrumut sunt diferite.
Exemplu:
Din ce localităţi sunt studenţii care au împrumutat cărţile Baze de date şi SQL pentru începători?
Exemplu:
Cum se numesc studenţii care au împrumutat cărţi scrise de autori străini?
Exemplu:
În ce an s-au născut autorii ale căror cărţi au for împrumutate de studenţii Facultăţii de Ştiinţe
Economice care au bursă de merit?
5.8. Subconsultări
Una dintre cele mai importante facilităţi oferite de SQL constă în includerea unei consultări în alta,
pe două sau mai multe niveluri – cu alte cuvinte, utilizarea subconsultărilor. Prin aceste subconsultări se
obţin tabele temporare intermediare ce vor fi folosite drept „argumente” în frazele SELECT superioare.
În materie de subconsultări, cel mai utilizat operator este IN, pe care deja l-am întâlnit în capitolul
precedent, dar într-o cu totul altă ipostază – testarea încadrării valorii unui atribut într-o listă de constante.
În continuare, domeniul de testare este alcătuit din liniile unei tabele.
Exemplu:
Ce studenţi studiază la aceeaşi secţie cu „Danciu Daria”?
În cazul acestei interogări, execuţia se realizează în doi timpi. Mai întâi se execută subconsultarea
SELECT sectia
FROM STUDENT
WHERE nume = „Danciu Daria”
obţinându-se o tabelă intermediară ce conţine o singură linie (pe care apare Danciu Daria) şi o singură
coloană (sectia) În cel de-al doilea pas sunt selectate liniile tabelei STUDENT care îndeplinesc condiţia
sectia = „CIG”
nume Sectia
Buciumeanu Olivia CIG
Popescu Liviu CIG
Danciu Daria CIG
Observăm că în rezultat a fost inclus şi studentul de referinţă – Danciu Daria. Dacă se doreşte
excluderea din rezultat a acestui student, fraza SELECT se modifică astfel:
SELECT STUDENT.nume, STUDENT.Sectia
FROM STUDENT
WHERE (((STUDENT.nume)<>"Danciu Daria") AND ((STUDENT.[sectia]) In
(SELECT sectia FROM STUDENT
WHERE nume = "Danciu Daria")));
Exemplu:
Ce studenţi studiază la alte secţii decât „Danciu Daria”?
Exemplu:
În ce cămin sunt cazaţi studenţii care studiază la aceeaşi secţie cu „Danciu Daria”?
nume camin
Caminul nr. 1
Caminul nr. 2
Caminul Sportiv
Exemplu:
Din ce judeţe sunt studenţii care au împrumutat cărţi scrise de autori de naţionalitate română?
Am ales acest exemplu pentru a folosi în subconsultări cât mai multe tabele ale bazei de date:
SELECT distinct judet FROM LOCALITATE
WHERE [cod localitate] IN
(SELECT [cod localitate] FROM STUDENT
WHERE [numar matricol] IN
(SELECT [numar matricol] FROM
STUDCARTE WHERE [cota carte] IN
(SELECT [cota carte] FROM CARTE
WHERE [cota carte] IN
(SELECT [cota carte]
FROM
AUTORCARTE WHERE
[cod autor] IN
(SELECT [cod autor] FROM
AUTOR
WHERE nationalitate =
"roman")))))
judet
Arges
Constanta
Dambovita
Gorj
Iasi
Suceava
Timisoara