This shows you the differences between two versions of the page.
bd:laboratoare:09 [2019/03/22 14:19] fbratiloveanu [Laborator 09 - Subcereri SQL (II)] |
bd:laboratoare:09 [2023/11/16 17:38] (current) sorin.ciolofan [Noțiuni teoretice] |
||
---|---|---|---|
Line 44: | Line 44: | ||
=== Subcereri pe clauza SELECT === | === Subcereri pe clauza SELECT === | ||
- | Aceste subcereri pot fi necorelate , sau corelate dar trebuie să returneze întotdeauna o singură valoare. Sintaxa este următoarea: | + | Aceste subcereri pot fi necorelate sau corelate dar trebuie să returneze întotdeauna o singură valoare. Sintaxa este următoarea: |
<code sql> | <code sql> | ||
SELECT expressions_select, | SELECT expressions_select, | ||
Line 78: | Line 78: | ||
=== Operatori în subcereri === | === Operatori în subcereri === | ||
* Operatorii prezentați pentru cereri sunt valabili și pentru subcereri; | * Operatorii prezentați pentru cereri sunt valabili și pentru subcereri; | ||
- | * Operatorii **SOME(ANY)** și **ALL** sunt folosiți în subcereri care întorc mai multe linii și sunt folosiți împreună cu operatorii logici în clauzele **WHERE** și **HAVING**; | + | * Operatorii **SOME(ANY)** și **ALL** sunt folosiți în subcereri care întorc mai multe linii și sunt folosiți împreună cu operatorii logici (de comparatie) în clauzele **WHERE** și **HAVING**; |
- | * Operatorul **SOME** (sau sinoninul lui **ANY**) compară o expresie cu fiecare valoare returnată de o subcerere și păstrează înregistrările unde expresia îndeplinește condiția impusă de operatorul logic; | + | * Operatorul **SOME (sau sinonimul lui ANY)** este un operator care returneaza o valoare booleana, respectiv TRUE daca exista cel putin o valoare returnata de subcerere care respecta conditia impusa de operatorul logic |
- | * Acești operatori pot fi folosiți cu toate operațiile de comparație; | + | * Operatorul **ALL** este un operator care returneaza o valoare booleana, respectiv TRUE daca TOATE valorile returnate de subcerere respecta conditia impusa de operatorul logic |
* Dacă se folosește operatorul **SOME(ANY)** împreună cu operatorul logic **%%>(=)%%** atunci are semnificația de **mai mare(sau egal) decât minim**, iar cu operatorul logic **%%<(=)%%** are semnificația de **mai mic(sau egal) decât maxim**; | * Dacă se folosește operatorul **SOME(ANY)** împreună cu operatorul logic **%%>(=)%%** atunci are semnificația de **mai mare(sau egal) decât minim**, iar cu operatorul logic **%%<(=)%%** are semnificația de **mai mic(sau egal) decât maxim**; | ||
- | * Operatorul **ALL** lucrează similar cu operatorii **SOME(ANY)**, iar dacă este folosit cu operatorul logic **%%>(=)%%** atunci are semnificația **mai mare(sau egal) decât maxim**, iar cu operatorul logic **%%<(=)%%** are semnificația **mai mic(sau egal) decât minim**. | + | * Operatorul **ALL** folosit cu operatorul logic **%%>(=)%%** are semnificația **mai mare(sau egal) decât maxim**, iar cu operatorul logic **%%<(=)%%** are semnificația **mai mic(sau egal) decât minim**. |
- | * | + | |
<color red>Ex. 6.</color> Să se afle care sunt angajații care au salariul mai mare decât salariul cel mai mic pentru funcția de SALESMAN. | <color red>Ex. 6.</color> Să se afle care sunt angajații care au salariul mai mare decât salariul cel mai mic pentru funcția de SALESMAN. | ||
Line 102: | Line 102: | ||
{{:bd:laboratoare:bd_carbon_lab9_ex9.png?nolink&450|}} | {{:bd:laboratoare:bd_carbon_lab9_ex9.png?nolink&450|}} | ||
- | * O construcție cu **[NOT] EXISTS** este mult mai performantă decât o construcție cu **IN**, **SOME(ANY)** sau **ALL**, deoarece, în cazul în care folosim tabele temporale, acestea nu sunt indexate, ducând la scăderea considerabilă a performanțelor. | + | * O construcție cu **[NOT] EXISTS** este mult mai performantă decât o construcție cu **IN**, **SOME(ANY)** sau **ALL**, deoarece, în cazul în care folosim tabele temporare, acestea nu sunt indexate, ducând la scăderea considerabilă a performanțelor. |
* Performațele depind de folosirea indexărilor, de dimensiunea tabelelor din baza de date, de numărul de linii returnate de subcere și dacă sunt necesare tabele temporare pentru a evalua rezultatele returnate. | * Performațele depind de folosirea indexărilor, de dimensiunea tabelelor din baza de date, de numărul de linii returnate de subcere și dacă sunt necesare tabele temporare pentru a evalua rezultatele returnate. | ||
* Deși o subcerere cu o construcție pe operatorul **NOT IN** poate fi la fel de eficient ca și în cazul unei construcții pe **NOT EXISTS**, cea din urmă este totuși mult mai sigură, dacă cererea întoarce și valori **NULL**. | * Deși o subcerere cu o construcție pe operatorul **NOT IN** poate fi la fel de eficient ca și în cazul unei construcții pe **NOT EXISTS**, cea din urmă este totuși mult mai sigură, dacă cererea întoarce și valori **NULL**. | ||
Line 110: | Line 110: | ||
{{:bd:laboratoare:bd_carbon_lab9_ex10.png?nolink&450|}} | {{:bd:laboratoare:bd_carbon_lab9_ex10.png?nolink&450|}} | ||
+ | ==== Exerciții individuale ==== | ||
+ | <color blue>1.</color> Să se calculeze și afișeze funcția și venitul mediu lunar pentru fiecare funcție. Să se folosească o subcerere în clauza select. | ||
+ | |||
+ | <color blue>2.</color> Să se facă o listă cu funcție, gradul salarial, salariul mediu angajați calculat după funcție și grad unde salariul mediu angajați este mai mare sau egal cu salariu mediu pentru grad. | ||
+ | |||
+ | |||
+ | |||
+ | <color blue>3.</color> Să se selecteze angajatul/angajații cu cel mai mare venit lunar din departamentul în care lucrează. | ||
+ | Afișați | ||
+ | * numele angajatului | ||
+ | * numele departamentului în care lucrează angajatul | ||
+ | * funcția angajatului | ||
+ | * venitul lunar | ||
+ | |||
+ | Ordonați după numele departamentului. | ||
+ | Să se rezolve fără a folosi funcții agregate (de grup). | ||
+ | Rezolvati in 3 metode, folosind: | ||
+ | * operatorul some/any | ||
+ | * operatorul all | ||
+ | * operatorul exists |