Sunteți pe pagina 1din 14

EXTRAGEREA DATELOR DIN MAI MULT DE O TABELA

Join Join-ul este folosit cind o cerere SQL necesita date din mai multe tabele din baza de date. Liniile dintr-o tabela pot fi unite cu liniile din alta tabela in functie de valorile comune existente in coloanele corespunzatoare. Sint doua tipuri de conditie de join : 1. Equi-join 2. Non-equi-join

Equi-join

Pentru a determina angajatii din departamente, vom compara valorile din coloana DEPTNO a angajatului cu aceleasi valori din DEPTNO din tabela DEPT. Relatia dintre tabela EMP si DEPT este un equi-join, in care valorile din coloana DEPTNO din ambele tabele sint egale. (Operatorul de comparatie folosit este =.) O conditie de join este specificata in clauza WHERE:

SELECT column(s) FROM tables WHERE join condition is ...

Pentru a face join pe cele doua tabele EMP si DEPT, introducem:

SELECT ENAME, JOB, DNAME FROM EMP, DEPT WHERE EMP>DEPTNO + DEPT>DEPTNO;

ENAME ------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

JOB -----MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN

DNAME ------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Vom observa ca acum fiecare angajat are listat numele departamentului lui. Liniile din EMP sint combinate cu liniile din DEPT si sint intoarse doar liniile pentru care valorile EMP.DEPTNO si DEPT.DEPTNO sint eale. Observati ca, conditia de join specifica numele coloanei precedat de numele tabelei.Aceasta este o necesitate cind numele coloanelor sint aceleasi in ambele tabele.Este necesar sa specificam exact ce coloane sint referite. Aceasta necesitate este de asemenea aplicata coloanelor care pot fi ambigue in clauzele SELECT sau ORDER BY. Pentru a recunoaste diferentele dintre coloana DEPTNO din EMP si coloana DEPTNO din DEPT, introducem:

SELECT DEPT.DEPTNO, ENAME, JOB, DNAME

FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ORDER BY DEPT.DEPTNO;

DEPTNO -------10 10 10 20 20 20 20 20 30 30 30 30 30 30

ENAME ------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

JOB -----MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN

DNAME ------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Observati ca fiecarui numar de departament din tabela DEPT i se face join pentru a se potrivi cu numerele de departament din tabela EMP.De exemplu, trei angajati lucreaza in departamentul 10 - Accounting - deci exista trei potri- viri.Prin urmare ACCOUNTING este afisat pentru fiecare angajat din acel depar- tament.
Folosirea alias-urilor de tabela

Poate fi foarte plictisitor sa tiparesti numele tabelelor repetat.Etichete temporare (sau alias-uri) pot fi folosite in clauza FROM.Aceste nume temporare sint valide doar in instructiunea SELECT curenta.Alias-urile de tabele trebuie de asemenea sa fie

specificate in clauza SELECT.Aceasta creste efectiv viteza cererii, in care contextul contine informatii foarte exacte. Alias-urile de tabela sint folosite in urmatorul context:

SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY D.DEPTNO;

Alias-urile de tabele pot fi de lungime de maxim 30 de caractere, dar mai scurte sint mai bune.De asemenea incercati sa le faceti cit mai explicite. Daca un alias de tabela este folosit pentru un nume particular de tabela in clauza FROM, atunci acel alias trebuie sa fie substituit pentru numele tabelei in contextul din SELECT.
Produs

----------------------------------------------------------------------| EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO |

----------------------------------------------------------------------|=======================================================================| ----------------------------------------------------------------------| 7788 SCOTT ANALYST 7566 05-MAR-84 3000 20 |--| | | | | |

----------------------------------------------------------------------|=======================================================================| -----------------------------------------------------------------------

| ---------------------------------------------------------------------| | | | | | | | |--------| |--------| |--------| |--------| | ------------------------------DEPTNO DNAME LOC |

------------------------------10 20 30 40 ACCOUNTING RESEARCH SALES OPERATIONS NEW YORK DALLAS CHICAO BOSTON | | | |

-------------------------------

In absenta unei conditii WHERE, fiecare linie din EMP este unita in ordine cu fiecare linie din DEPT. Se vor afisa 53 de linii.
Produs

Cind o conditie de join este invalida sau este omisa, rezultatul este omis si toate combinatiile de linii vor fi listate. Un produs tinde sa genereze un numar mare de linii si rezultatul sau este rar folosit.Trebuie intotdeauna inclusa o conditie de join intr-o clauza WHERE, in afara de cazul in care este necesara combinarea tuturor liniilor din toate tabelele. Non-Equi-Join Relatia dintre tabelele EMP si SALGRADE este un non-equi-join, in care nici o coloana din EMP nu corespunde direct cu o coloana din SALGRADE.Relatia este obtinuta folosind un operator, altul decit operatorul de egalitate (=).Pentru a evalua

gradatia unui anajat, salariul lui trebuie sa fie intre salariul minim si salariul maxim. Operatorul BETWEEN este folosit pentru a construi conditia, introducem:

SELECT E.ENAME, E.SAL, S.GRADE FROM EMP E, SALGRADE S WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

ENAME --------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING

SAL ------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00

GRADE --------1 1 1 2 2 2 3 3 4 4 4 4 4 5

Alti operatori cum ar fi <= si >= pot fi folositi, oricum BETWEEN este cel mai simplu.Nu uitati sa specificati mai intii valoarea minima si ultima va- loarea maxima cind folositi BETWEEN.Din nou sint folosite alias-uri de tabele, nu din cauza posibilelor ambiguitati, dar din motive de performanta. Reguli pentru join-ul tabelelor

Pentru a face join pe cele trei tabele este necesar sa construim doua condi- tii de join.Pentru a face join pe patru tabele sint necesare minim trei condi- tii de join. O regula simpla este: numarul minim de conditii de join = numarul de tabele - 1 Aceasta regula nu poate fi aplicata daca tabela are o cheie primara, care identifica in mod unic fiecare linie (cheile primare sint explicate mai tirziu in manual). Sintaxa

SELECT [DISTINCT] {[tabela].* | expresie [alias], ...} FROM tabela [alias], ... WHERE [conditie de join] ... AND [conditie de linie] ... OR [alta conditie de linie] GROUP BY {expresie | coloana} HAVING {conditie de grup} ORDER BY {expresie | coloana} [ASC | DESC]

Observatii

Se pot specifica conditii de join impreuna cu alte conditii (non join); De asemenea trebuie sa fiti atenti la precedenta operatorilor cind folo- siti predicatul OR.

Exercitii - Join-uri simple

Aceste exxercitii au intentia de a va capata experienta practica in extrage- rea datelor din mai mult decit o tabela si includ teme discutate in capitolele anterioare.
Tema

1. Afisati numele tuturor angajatilor si numele departamentului lor, in ordi- nea numelui departamentelor.
2.

3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.

ENAME -------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

DNAME --------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Vor fi selectate 14 inregistrari.

39. Afisati numele tuturor angajatilor, numarul si numele departamentului.


40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.

ENAME -------CLARK MILLER KING

DEPTNO --------10 10 10

DNAME --------ACCOUNTING ACCOUNTING ACCOUNTING

55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.

SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

20 20 20 20 20 30 30 30 30 30 30

RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Vor fi selectate 14 inregistrari.

81. Afisati numele, localitatea si departamentul angajatilor al caror salariu lunar este mai mare ca 1500.
82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. ENAME -------CLARK KING JONES FORD SCOTT ALLEN BLAKE LOCATION ---------NEW YORK NEW YORK DALLAS DALLAS DALLAS CHICAGO CHICAGO DNAME --------ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH SALES SALES

Vor fi selectate 7 inregistrari.

105.
106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138.

Afisati lista salariilor, gradatiilor angajatilor.


ENAME ---------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING JOB ------CLERK CLERK CLERK SALESMAN SALESMAN CLERK SALESMAN SALESMAN MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT SAL ------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00 GRADE ---------1 1 1 2 2 2 3 3 4 4 4 4 4 5

139.
140. 141. 142. 143. 144. 145. 146. 147. 148.

Listati doar angajatii cu gradatia 3.


ENAME ---------ALLEN TURNER JOB ------SALESMAN SALESMAN SAL ------1,600.00 1,500.00 GRADE ---------3 3

149.

Listati toti angajatii din Dallas.

150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164.

ENAME ---------SMITH SCOTT JONES ADAMS FORD

SAL ------800.00 3,000.00 2,975.00 1,100.00 3,000.00

LOCATION ---------DALLAS DALLAS DALLAS DALLAS DALLAS

Alte exercitii daca aveti timp: 165. Afisati numele angajatilor, functia, salariul, gradatia si numele departamentului pentru toti angajatii din companie in afara de functionari.Sortati dupa salariu, afisind mai intii salariul cel mai mare.
166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197.

ENAME -------KING FORD SCOTT JONES BLAKE CLARK ALLEN TURNER MARTIN WARD

JOB --------PRESIDENT ANALYST ANALYST MANAGER MANAGER MANAGER SALESMAN SALESMAN SALESMAN SALESMAN

SAL -------5,000.00 3,000.00 3,000.00 2,975.00 2,850.00 2,450.00 1,600.00 1,500.00 1,250.00 1,250.00

GRADE --------5 4 4 4 4 4 3 3 2 2

DNAME --------ACCOUNTING RESEARCH RESEARCH RESEARCH SALES ACCOUNTING SALES SALES SALES SALES

Vor fi selectate 10 inregistrari.

198.

199. Afisati urmatoarele detalii pentru angajatii care cistiga 36000$ pe an sau care sint functionari.
200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. Solutii 1. 2. 3. 4. 5. 6. 7.

ENAME --------FORD SCOTT MILLER JAMES ADAMS SMITH

JOB

ANNUAL_SAL

DEPTNO --------20 20 10 30 20 20

DNAME --------RESEARCH RESEARCH ACCOUNTING SALES RESEARCH RESEARCH

GRADE -------4 4 2 1 1 1

------- -------------ANALYST ANALYST CLERK CLERK CLERK CLERK 36000 36000 15600 11400 13200 9600

Vor fi selectate 6 inregistrari.

SELECT ENAME, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;

8.
9. 10. 11. 12. 13. 14. 15. SELECT ENAME, E.DEPTNO, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO;

16.
17. 18. 19. 20. SELECT ENAME, LOC LOCATION, DNAME FROM EMP, DEPT

21. 22. 23. 24. 25.

WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL > 1500;

26.
27. 28. 29. 30. 31. 32. 33. SELECT ENAME, JOB, SAL, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL;

34.
35. 36. 37. 38. 39. 40. 41. 42. 43. SELECT ENAME, JOB, SAL, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL AND GRADE = 3;

44.
45. 46. 47. 48. 49. 50. 51. 52. 53. SELECT ENAME, SAL, LOC LOCATION FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND LOC = 'DALLAS';

54.
55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. SELECT ENAME, JOB, SAL, GRADE, DNAME FROM EMP, SALGRADE, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND JOB != 'CLERK' ORDER BY SAL DESC;

68.
69. 70. 71. 72. 73. 74. 75. SELECT ENAME, JOB, SAL * 12 ANNUAL_SAL, D.DEPTNO, DNAME, GRADE FROM EMP E, SALGRADE, DEPT D WHERE E.DEPTNO = D.DEPTNO

76. 77. 78. 79. 80.

AND SAL BETWEEN LOSAL AND HISAL AND (SAL * 12 + NVL(COMM, 0) = 3600 OR E.JOB = 'CLERK') ORDER BY E.JOB;

81.

S-ar putea să vă placă și