Documente Academic
Documente Profesional
Documente Cultură
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 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:
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
----------------------------------------------------------------------|=======================================================================| -----------------------------------------------------------------------
------------------------------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.
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
DEPTNO --------10 10 10
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
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
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.
139.
140. 141. 142. 143. 144. 145. 146. 147. 148.
149.
150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164.
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
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.
JOB
ANNUAL_SAL
DEPTNO --------20 20 10 30 20 20
GRADE -------4 4 2 1 1 1
------- -------------ANALYST ANALYST CLERK CLERK CLERK CLERK 36000 36000 15600 11400 13200 9600
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
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
AND SAL BETWEEN LOSAL AND HISAL AND (SAL * 12 + NVL(COMM, 0) = 3600 OR E.JOB = 'CLERK') ORDER BY E.JOB;
81.