Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Folosind o conditie de join putem obtine date din mai multe tabele. Scrierea unei conditii de join se face intr-o clauza WHERE.
Randuri dintr-o tabela pot fi legate cu randuri dintr-o alta tabela continand aceasi valoare in coloane corespondente, de obicei coloane care contin chei primare si chei externe. Exista doua tipuri principale de conditii join :
equijoin
non-equijoin
In plus metodele join includ urmatoarele:
outer join
self join
set operators
O conditie de equijoin se va scrie astfel:
SELECT tabel1.coloana, tabel2.coloana
FROM tabel1, tabel2
WHERE tabel1.coloana = tabel2.coloana;
Afiseaza numele angajatului, numele departamentului precum si localitatea unde se afla departamentul, pentru toti angajati.
SELECT emp.empno, emp.ename, emp.depno,
dept.dname, dept.loc
FROM emp, dept
WHERE emp.depno = dept.depno;
Relatia dintre tabela EMP si DEPT este un equijoin, valorile din coloana depno din ambele tabele trebuie sa fie egale.
Deoarece coloana depno are acelasi nume in ambele tabele, ea trebuie prefixata cu numele tabelei pentru a nu exista ambiguitati.
In plus, de conditia de join se poate adauga un criteriu de cautare in clauza WHERE.
Afiseaza numele angajatului, numele departamentului precum si localitatea unde se afla departamentul, pentru angajatul cu numele King.
SELECT ename, emp.depno, dname, loc
FROM emp, dept
WHERE emp.depno = dept.depno
AND INICAP(ename) = 'King';
Nu este necesara prefixarea coloanelor cu numele tabelei in cazul in care nu sunt comune in ambele tabele .
Se pot utiliza aliasuri pentru tabele, simplificand astfel scrierea interogarii:
SELECT ename, e.depno, dname, loc
FROM emp e, dept d
WHERE e.depno = d.depno
AND INICAP(ename) = 'King';
OBS: Aliasul tabelei este valid numai in SELECT-ul curent.
Daca folosim un alias pentru o tabela atunci numele tabelei trebuie inlocuit cu aliasul specific tabelei .
Avand 2 tabele EMP si SALGRADE:
EMP:
Empno |
Ename |
Sal |
7839 7698 7782 7566 7654 7499 7844 7900 |
KING BLAKE JONES MARTIN ALLEN TURNER JAMES |
5000 2850 2450 2975 1250 1600 1500 950 |
SALGRADE:
Grade |
Losal |
Hisal |
1 2 3 4 5 |
700 1201 1401 2001 3001 |
1200 1400 2000 3000 9999 |
Relatia dintre tabela EMP si tabela SALGRADE este de non-equijoin in sensul ca, coloana sal din tabela EMP este intre valorile coloanele Losal si Hisal din tabela SALGRADE.
Afisam numele angajatilor, salariul si gradul de salarizare pentru fiecare angajat din tabela EMP.
SELECT e.ename, e.sal, s.grade
FROM emp e, salgrade s
WHERE e.sal BETWEEN s.losal AND s.hisal;
Obs: Se poate folosi >= AND <= inlocuind astfel BETWEEN.
Vom utiliza operatia de outer-join pentru a vizualiza randuri care nu sunt vizualizate intr-o conditie de join. Operatorul outer-join este semnul (+). Scrierea unei conditii de outer-join se va realiza folosind urmatoarea sintaxa:
SELECT table.column, table.column
FROM table1, table2
WHERE table1.column(+) = table2.column;
sau
SELECT table.column, table.column
FROM table1, table2
WHERE tabel1.column = tabel2column(+);
Randurile care nu apar la o conditie de join pot fi returnate folosind operatorul outer-join intr-o conditie de join.
Operatorul outer-join este plasat in partea deficienta in informatie. Acest operator va avea ca efect crearea unor randuri NULL in tabela deficitara in informatie pentru infomatia existenta in tabela care contine informetie in plus. Operatorul outer-join (+) poate fi plasat in oricare dintre tabele dar nu in ambele simultan.
Vom considera tabele EMP si DEPT:
EMP: DEPT:
ENAME |
DEPTNO |
DEPTNO |
DNAME |
|
KING |
10 |
10 |
RESEARCH |
|
BLAKE |
20 |
20 |
SALES |
|
|
30 |
30 |
OPERATIONS |
|
JONES |
10 |
40 |
ACCOUNTING |
Afisarea tuturor angajatilor si numele tuturor departamentelor vom scrie urmatoarea secventa :
SELECT e.ename, d.depno, d.dname
FROM emp e, dept d
WHERE e.depno (+) = d.depno
ORDER BY e.depno;
Obs: Departamentul ACCOUNTING care nu are angajati va fi si el afisat.
O conditie care implica outer-join nu poate sa contina operatoeul IN si nici o alta conditie folosind operatorul OR
Cateodata este nevoie sa interoghezi o tabela cu ea insasi. Vom lua spre exemplificare urmatoarea tabela:
EMP(ANGAJATI): EMP (MANAGERI):
EMPNO |
ENAME |
MGR |
EMPNO |
ENAME |
|
7839 |
KING | ||||
7698 |
BLAKE |
7839 |
7839 |
KING |
|
7782 |
CLARK |
7839 |
7839 |
KING |
|
7566 |
JONES |
7698 |
7698 |
BLAKE |
De exemplu, pentru a gasi numele managerului lui Blake va trebui sa parcurgem urmatorii pasi :
gasirea lui Blake in tabela EMP, cautand in coloana ename
gasirea codului managerului pentru Blake adica mgr, care este 7839.
gasirea persoanei care are empno=7839 si afisarea numelui acestei persoane. Deci persoana care are empno=7839 este KING.
Afisam numele angajatului si numele managerului angajatului. Este necesar sa simulam doua tabele in clauza FROM, sunt doua aliasuri ANGAJATI si MANAGER, pentru aceeasi tabela EMP.
SELECT angajati.ename || ' works for ' || manager.ename
FROM emp angajati, emp manager
WHERE angajati.mgr = manager.empno;
In acest exemplu tabela EMP a fost interogata cu ea insasi prin folosirea unor aliasuri cu nume diferit pentru aceesi tabela.
Copyright © 2024 - Toate drepturile rezervate