CATEGORII DOCUMENTE |
Operatorii algebrei relationale
Algebra relationala este reprezentata de multimea operatiilor formale ce actioneaza asupra unor relatii (tabelele bazei de date) si au ca rezultat alte relatii.
Operatorii algebrei relationale sunt:
SELECT (operatorul selectie) extrage tupluri (linii) ce satisfac o conditie specificata, producand o submultime pe orizontala; este operator unar si are
sintaxa urmatoare:
SELECT c1 [, c2, .] | * FROM R WHERE p
unde: ci, i Є - reprezinta campurile/ atribute sau expresii cu atribute
- selecteaza toate coloanele tabelului;
R - relatia (tabelul) din care se extrag informatii;
p - predicat ce trebuie sa aiba valoarea de adevar True; se aplica tuplurilor.
Observatii:
q O interogare permite obtinerea de informatii dintr-o baza de date, pornind de la o schema relationala si se realizeaza cu ajutorul comenzii SELECT.
q Echivalenta notiunilor tabel - relatie este relativa, astfel: intr-o relatie nu pot exista doua linii identice, iar in limbajul SQL, tabelul obtinut dintr-o interogare poate contine mai multe tupluri identice.
Exemple: Fie baza de date FIRMA (de la tema 8) cu tabelele: DEPART (departamente), ANG (angajati), SALGRD (grade salarii).
Sa se afiseze departamentele din Ploiesti:
SELECT * FROM depart WHERE loc='Ploiesti'
Sa se afiseze departamentele din Bucuresti si Arad (figura 1):
SELECT nrdepart, numedepart,loc FROM depart WHERE loc ='Arad';
OR loc='Bucuresti'
Acelasi rezultat se poate obtine si in urma interogarii:
SELECT nrdepart, numedepart FROM depart;
WHERE INLIST(loc,'Bucuresti','Arad')
Sa se afiseze angajatii nascuti in perioada 1 ianuarie 1968 - 31 decembrie 1972:
SELECT nume, functie, datan FROM ang;
WHERE datan>= AND datan<=
Sa se afiseze departamentele unde lucreaza angajatii cu functiile presedinte, manager:
SELECT DISTINCT nrdepart FROM ang;
WHERE functie='MANAGER' or functie='PRESEDINTE'
Observatie: Clauza DISTINCT a comenzii SELECT elimina tuplurile identice din rezultat.
PROJECT (operatorul proiectie) extrage atributele specificate, producand o submultime pe verticala; este operator unar si are sintaxa urmatoare:
SELECT c1 [, c2, .] | * FROM R
unde: ci, i Є - reprezinta campuri/ atribute sau expresii cu atribute;
- selecteaza toate coloanele tabelului;
R - relatia (tabelul) din care se extrag informatii.
Exemple:
Sa se afiseze departamentele firmei:
SELECT nrdepart, numedepart, loc FROM depart
Sa se afiseze angajatii firmei:
SELECT nume, functie,nrdepart FROM ang
UNION (operatorul reuniune) reuneste doua relatii. Operatorul UNION elimina automat liniile identice din rezultat. Reuniunea a doua relatii R si S se poate realiza folosind urmatoarea sintaxa:
SELECT * FROM R
UNION
SELECT * FROM S
Observatie: Operatorul UNION ALL permite preluarea tuturor liniilor celor doua relatii.
Exemple:
Sa se afiseze numele si functia angajatilor care lucreaza in departamentele 10, respectiv 20:
select nume, functie,nrdepart from ang where nrdepart=10;
union;
select nume, functie,nrdepart from ang where nrdepart=20
Rezultatele reuniunii sunt prezentate in figura 2:
Sa se afiseze departamentele unde lucreaza angajatii cu functiile PROIECTANT sau VANZATOR:
Metoda 1 - folosind operatorul UNION:
select nrdepart from ang where functie='PROIECTANT' ;
union ;
select nrdepart from ang where functie='VANZATOR'
Rezultatele interogarii ce contine operatorul UNION sunt prezentate in figura 3:
Metoda 2 - folosind operatorul UNION ALL (figura 4):
select nrdepart from ang where functie='PROIECTANT' ;
union all;
select nrdepart from ang where functie='VANZATOR'
INTERSECT (operatorul intersectie) nu este implementat in limbajul SQL - Visual FoxPro.
DIFFERENCE (operatorul diferenta) nu este implementat in limbajul SQL - Visual FoxPro.
PRODUCT (operatorul produs cartezian) genereaza toate perechile posibile de tupluri, primul element al perechii fiind din prima relatie, al doilea element din a doua relatie, s.a.m.d. Produsul cartezian se obtine dintr-o interogare executata asupra mai multor tabele.
Exemplu: Sa se afiseze produsul cartezian al tabelelor ,depart.dbf' si ,ang.dbf':
SELECT nume, functie,numedepart FROM ang, depart
DIVISION (operatorul diviziune) extrage valorile atributelor dintr-o relatie, care apar in toate valorile atributelor din cealalta relatie, fiind operator binar;
Fie doua relatii R(n) si S(m). Atunci DIVISION(R, S) (sau DIVIDE(R, S)) permite selectarea acelor tupluri de dimensiune n-m la care, adaugand orice tuplu din S, se obtine un tuplu din R.
JOIN (operatorul de compunere, de jonctiune) permite extragerea informatiilor din mai multe relatii corelate. Jonctiunea este o combinatie de produs cartezian si selectie. Exista urmatoarele tipuri de jonctiuni:
Theta-jonctiunea si echi-jonctiunea
Fie R1 si R2 relatii cu schemele relationale: R1( A, A1, .), R2(B, B1, .).
Theta-jonctiunea: |
Echi-jonctiunea: |
SELECT * FROM R1,R2 WHERE R1.A > R2.B |
SELECT *FROM R1,R2 WHERE R1.A = R2.B |
In limbajul SQL - Visual FoxPro, theta-jonctiunea si echi-jonctiunea se mai pot reprezenta utilizand jonctiunea interna (operatorul INNER JOIN):
Theta-jonctiunea: |
Echi-jonctiunea: |
SELECT * FROM R1 INNER JOIN R2 ON R1.A > R2.B |
SELECT * FROM R1 INNER JOIN R2 ON R1.A = R2.B |
Exemple
Ø Afisati numele angajatilor, departamentul si localitatea unde lucreaza :
Metoda 1 :
SELECT nume, numedepart,loc FROM depart, ang;
WHERE depart.nrdepart = ang.nrdepart
Metoda 2 - folosind operatorul INNER JOIN:
SELECT nume, numedepart,loc ;
FROM depart INNER JOIN ang ON depart. nrdepart = ang.nrdepart
Ø Sa se afiseze angajatii din Ploiesti :
Metoda 1 :
SELECT nume, loc FROM ang, depart;
WHERE depart.nrdepart =
ang.nrdepart and depart.loc='
Metoda 2 - folosind operatorul INNER JOIN:
SELECT nume, loc FROM ang INNER JOIN depart;
ON depart.nrdepart =
ang.nrdepart WHERE depart.loc='
Jonctiunea unui tabel cu el insusi (jonctiunea a doua instante ale tabelului)
Exemplu Sa se afiseze persoanele cu aceeasi functie ca si Toma :
Metoda 1 :
SELECT b.nume, b.functie FROM ang A, ang B;
WHERE A.functie = B.functie AND a.nume='Toma'
Metoda 2 - folosind operatorul INNER JOIN:
SELECT b.nume, b.functie FROM ang A INNER JOIN ang B;
ON A.functie = B.functie WHERE a.nume='Toma'
Jonctiunea externa include in rezultat si tupluri dintr-o relatie sau din ambele relatii, care prezinta valori ale atributului de legatura ce nu au corespondent in cea de-a doua relatie.
Jonctiunea externa foloseste operatorii :
LEFT OUTER JOIN (jonctiune externa la stanga);
RIGHT OUTER JOIN(jonctiune externa la dreapta);
FULL OUTER JOIN(jonctiune externa totala
Exemple
Ø Fie tabelele R1 si R2 cu schemele relationale: R1(A, B, C) si R2(C, D, E). Sa se realizeze jonctiunea externa (la stanga, la dreapta si totala) :
R1 R2
A |
B |
C |
xyz | ||
xxz | ||
yyz |
C |
D |
E |
xyz | ||
yyx | ||
xxz |
Jonctiune externa la stanga: R = LEFT OUTER JOIN (R1, R2; R1.C R2.C
SELECT * FROM R1 LEFT OUTER JOIN R2 ON R1.C R2.C
R
A |
B |
R1.C |
R2.C |
D |
E |
xyz |
xxz | ||||
xxz |
NULL |
NULL |
NULL |
||
yyz |
xyz |
Jonctiune externa la dreapta: R = RIGHT OUTER JOIN (R1,R2; R1.C R2.C
SELECT * FROM R1 RIGHT OUTER JOIN R2 ON R1.C R2.C
R
A |
B |
R1.C |
R2.C |
D |
E |
yyz |
xyz | ||||
NULL |
NULL |
NULL |
yyx | ||
xyz |
xxz |
Jonctiune externa totala: R = FULL OUTER JOIN (R1, R2; R1.C R2.C
SELECT * FROM R1 FULL OUTER JOIN R2 ON R1.C R2.C
R
A |
B |
R1.C |
R2.C |
D |
E |
xyz |
xxz | ||||
xxz |
NULL |
NULL |
NULL |
||
yyz |
xyz | ||||
NULL |
NULL |
NULL |
yyx |
Observatie: Jonctiunea externa totala reprezinta reuniunea jonctiunii externe la dreapta cu jonctiunea externa la stanga.
Programul care creeaza tabelele R1 si R2, insereaza datele si realizeaza jonctiunile externe este urmatorul :
CREATE TABLE R1(A number(2), B char(3), C number(2))
INSERT INTO R1 VALUES(20,'xyz',30)
INSERT INTO R1 VALUES(30,'xxz',20)
INSERT INTO R1 VALUES(40,'yyz',25)
BROWSE
CREATE TABLE R2(C number(2), D char(3), E number(2))
INSERT INTO R2 VALUES(25,'xyz',30)
INSERT INTO R2 VALUES(40,'yyx',25)
INSERT INTO R2 VALUES(30,'xxz',40)
BROWSE
&& jonctiune externa la stanga
SELECT * FROM R1 LEFT OUTER JOIN R2 ON R1.C = R2.C
&& jonctiune externa la dreapta
SELECT * FROM R1 RIGHT OUTER JOIN R2 ON R1.C = R2.C
&& jonctiune externa totala
SELECT * FROM R1 FULL OUTER JOIN R2 ON R1.C = R2.C
CLOSE ALL
Ø Fie baza de date FIRMA Sa se afiseze localitatile in care exista angajati:
SELECT DISTINCT loc as Localitate,numedepart as;
Nume_Departament, d.nrdepart as X, a.nrdepart as Y;
FROM depart d LEFT OUTER JOIN ang a;
ON d.nrdepart = a.nrdepart INTO CURSOR c1
SELECT * FROM c1 WHERE Y is not NULL
Observatii Exemplul de mai sus foloseste :
q un cursor c1 (tabel temporar), pentru pastrarea rezultatelor jonctiunii externe la stanga dintre tabelele DEPART si ANG.
q Operatorul IS NULL se foloseste sub formele: camp IS NULL sau camp IS not NULL. Atentie! Nu se foloseste sub forma : camp = NULL
Semijonctiunea presupune selectarea numai a liniilor din prima tabela care apar in jonctiune cu linii din tabela a doua.
Exemple
Ø Fie tabelele R1 si R2 cu schemele relationale: R1(A, B, C) si R2(C, D, E) de la paragraful - Jonctiunea externa. Sa se realizeze semijonctiunea tabelelor R1 si R2:
R = SEMIJONCTIUNE(R1, R2; R1.C R2.C
SELECT A, B, C FROM R1, R2 WHERE R1.C R2.C
R
A |
B |
.C |
xyz | ||
yyz |
Ø Fie baza de date FIRMA. Sa se afiseze localitatile unde sunt angajati :
SELECT DISTINCT numedepart as Departament,loc as Localitate;
FROM depart d,ang a WHERE d.nrdepart=a.nrdepart
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 2099
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved