Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Sql


Index » educatie » » informatica » Sql
» Interogarea mai multor tabele


Interogarea mai multor tabele


Interogarea mai multor tabele

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

Equijoin

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 .

Non-Equijoin

Avand 2 tabele EMP si SALGRADE:

EMP:

Empno

Ename

Sal

7839

7698

7782

7566

7654

7499

7844

7900

KING

BLAKE

CLARK

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.

Outer-join

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

CLARK

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

Self-join

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.





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate