CATEGORII DOCUMENTE |
Theta si echijonctiunea
Dintre tipurile de jonctiuni prezentate in capitolul 3, vom insista in aceast subcapitol asupra theta - jonctiunii si echijonctiunii. SQL nu prezinta clauze sau operatori speciali pentru jonctiune, insa dupa cum am vazut, jonctiunea se constituie ca o combinatie intre produs cartezian si selectie.
Exemplul 15 al algebrei relationale pentru theta - jonctionarea relatiilor R1 si R2 (figura3.19.), se scrie:
SELECT *
FROM R1, R2
WHERE R1.C1 > R2.C5
iar pentru echijonctiunea din exemplul 16 (figura 3.20.):
SELECT *
FROM R1, R2
WHERE R1.C1 = R2.C5
Jonctiunea naturala poate fi realizata numai prin specificarea numelor atributelor in clauza SELECT a frazei de interogare. In standardul SQL-92 si in implementarile SQL ale multor SGBD-uri se poate folosi o varianta mai eleganta, tinand seama si de faptul ca tot ce inseamna theta- si echijonctiune reprezinta pentru SQL, INNER JOIN (jonctiune interna).
Prin urmare, cele doua solutii de mai sus pot fi rescrise, dupa cum urmeaza:
SELECT *
FROM R1 INNER JOIN R2 ON R1.C1 > R2.C5
respectiv
SELECT *
FROM R1 INNER JOIN R2 ON R1.C1 = R2.C3
Reluam, pentru comparatie, exemplele din algebra relationala.
Exemplul 19. Sa se afle numele, facultatea si sectia studentilor care stau la caminul Miclas?.
- varianta 1 (generala):
SELECT NUME, facultate, sectia,
STUDCAMIN.nume_camin
FROM STUDENT, STUDCAMIN
WHERE STUDENT.nr_matricol =
STUDCAMIN.nr_matricol AND
STUDCAMIN.nume_camin = "Miclas"
- varianta 2 (Visual Fox Pro):
SELECT nume, facultate, sectia, ;
STUDCAMIN.nume_camin ;
FROM STUDENT INNER JOIN STUDCAMIN ON ;
STUDENT.nr_matricol = STUDCAMIN.nr_matricol ;
AND STUDCAMIN.nume_camin = "Miclas"
nume |
facultate |
sectia |
nume_camin |
Popescu Ion Octavian |
Stiinte Economice |
CIG |
Miclas |
Danciu Mihaela |
Colegiul Economic |
BIR |
Miclas |
Moraru Octavian |
Colegiul Economic |
BIR |
Miclas |
Simionescu Dorin |
Stiinte Economice |
FA |
Miclas |
Delca Simona |
Colegiul Economic |
MU |
Miclas |
Radu Denisa |
Stiinte Economice |
FA |
Miclas |
Figura 4.18. Studentii din caminul Miclas
Numai atributul nume_camin a fost prefixat cu numele tabelei din care provine (STUDCAMIN). Prefixarea este obligatorie atunci cand campul exista in doua sau mai multe dintre tabelele enumerate in clauza FROM
Exemplul 20. Care sunt cartile scrise de Victor Stanciu?
- varianta 1 (generala):
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"
- varianta 2 (Visual Fox Pro):
SELECT titlu, AUTOR.nume_autor ;
FROM AUTOR INNER JOIN AUTORCARTE ON ;
AUTOR.cod_autor = AUTORCARTE.cod_autor ;
INNER JOIN CARTE ON AUTORCARTE.cota_carte = ;
CARTE.cota_carte ;
WHERE nume_autor = "Victor Stanciu"
titlu |
nume_autor |
Contabilitate generala |
Victor Stanciu |
Bazele contabilitatii |
Victor Stanciu |
Contabilitate generala |
Victor Stanciu |
Contabilitate de gestiune |
Victor Stanciu |
Figura 4.19. Cartile scrise de Victor Stanciu
Exemplul 21. Numele studentilor care au imprumutat carti din domeniul Informatica.
- varianta 1 (generala):
SELECT nume
FROM CARTE, STUDCARTE, STUDENT
WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND STUDCARTE.nr_matricol = STUDENT.nr_matricol AND domeniu = "Informatica"
- varianta 2 (Visual Fox Pro):
SELECT nume ;
FROM CARTE INNER JOIN STUDCARTE ON ;
CARTE.cota_carte = STUDCARTE.cota_carte ;
INNER JOIN STUDENT ON STUDCARTE.nr_matricol = ;
STUDENT.nr_matricol ;
WHERE domeniu = "Informatica"
nume |
Popescu Ion Octavian |
Tudorache Octavian |
Chivu Mihai |
Petrescu Daniel |
Goia Simona |
Stanciu Maria |
Figura 4.20. Studentii care au imprumutat carti din domeniul informatica
Exemplul 22. Numele si sectia studentilor Facultatii de Stiinte Economice care au imprumutat cartea Informatica de gestiune in februarie 2004?
- varianta 1 (generala):
SELECT nume, sectia
FROM CARTE, STUDCARTE, STUDENT
WHERE CARTE.cota_carte = STUDCARTE.cota_carte AND STUDCARTE.nr_matricol = STUDENT.nr_matricol AND titlu = "Informatica de gestiune" AND facultate = "Stiinte Economice" AND data_imprumut BETWEEN "01/02/2004" AND "29/02/2004"
- varianta 2 (Visual Fox Pro):
SELECT nume, sectia
FROM CARTE INNER JOIN STUDCARTE ON CARTE.cota_carte = STUDCARTE.cota_carte INNER JOIN STUDENT ON STUDCARTE.nr_matricol = STUDENT.nr_matricol
WHERE titlu = "Informatica de gestiune" AND facultate = "Stiinte Economice" AND data_imprumut BETWEEN AND
nume |
sectia |
Stanciu Maria |
CIG |
Figura 4.21. Studentii care au imprumutat cartea
Informatica de gestiune in februarie 2004
Exemplul 23. De la ce sectii sunt studentii care au imprumutat si cartea Informatica de gestiune si Contabilitate generala?
- solutia 1 - varianta 1 (nu functioneaza in Visual Fox Pro):
SELECT DISTINCT sectia
FROM STUDENT, STUDCARTE, CARTE
WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol AND STUDCARTE.cota_carte = CARTE.cota_carte AND titlu = "Informatica de gestiune"
INTERSECT
SELECT DISTINCT sectia
FROM STUDENT, STUDCARTE, CARTE
WHERE STUDENT.nr_matricol = STUDCARTE.nr_matricol AND STUDCARTE.cota_carte = CARTE.cota_carte AND titlu = "Contabilitate generala"
- solutia 1 - varianta 2 (SQL - 92):
SELECT DISTINCT sectia
FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte
WHERE titlu = "Informatica de gestiune"
INTERSECT
SELECT DISTINCT sectia
FROM STUDENT INNER JOIN STUDCARTE ON STUDENT.nr_matricol = STUDCARTE.nr_matricol INNER JOIN CARTE ON STUDCARTE.cota_carte = CARTE.cota_carte
WHERE titlu = "Contabilitate generala"
De notat folosirea clauzei DISTINCT pentru eliminarea eventualelor dubluri. Pentru variantele solutiei 2 vom avea nevoie de ceea ce se numeste jonctiunea unei tabele cu ea insasi, care va fi prezentata in subcapitolul urmator.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1372
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved