This shows you the differences between two versions of the page.
bd:laboratoare:09 [2018/10/08 22:37] fbratiloveanu |
bd:laboratoare:09 [2023/11/16 17:38] (current) sorin.ciolofan [Noțiuni teoretice] |
||
---|---|---|---|
Line 2: | Line 2: | ||
==== Obiective ==== | ==== Obiective ==== | ||
+ | * Subcereri pe clauza HAVING | ||
+ | * Subcereri pe clauza SELECT | ||
+ | * Subcereri pe clauza ORDER BY | ||
+ | * Operatori în subcereri | ||
+ | |||
==== Materiale ajutătoare ==== | ==== Materiale ajutătoare ==== | ||
+ | [[bd:resurse:tables|Resurse BD]] | ||
+ | |||
==== Noțiuni teoretice ==== | ==== Noțiuni teoretice ==== | ||
Line 9: | Line 16: | ||
<code sql> | <code sql> | ||
SELECT | SELECT | ||
- | [table_1.]expr_1, [table_1.]expr_2, ..., [table_1.]expr_n | + | [table_1.]expr_1, [table_1.]expr_2, ..., [table_1.]expr_n |
FROM table_1 | FROM table_1 | ||
WHERE conditions | WHERE conditions | ||
Line 21: | Line 28: | ||
</code> | </code> | ||
<color red> Ex. 1. </color> Să se determine care departament are cei mai mulți angajați pe aceeași funcție. | <color red> Ex. 1. </color> Să se determine care departament are cei mai mulți angajați pe aceeași funcție. | ||
- | {{ :bd:laboratoare:lab09.ex1.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex1a.png?nolink&450|}} | ||
+ | |||
+ | {{:bd:laboratoare:bd_carbon_lab9_ex1b.png?nolink&550|}} | ||
<color red> Ex. 2. </color> Să se determine angajații care au comisionul maxim pentru un departament introdus de la tastatură. | <color red> Ex. 2. </color> Să se determine angajații care au comisionul maxim pentru un departament introdus de la tastatură. | ||
- | {{ :bd:laboratoare:lab09.ex2.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex2.png?nolink&450|}} | ||
<note>Clauza Having poate fi folosită și într-o subcerere pe tabela temporală.</note> | <note>Clauza Having poate fi folosită și într-o subcerere pe tabela temporală.</note> | ||
+ | |||
<color red> Ex. 3. </color> Să se afle ce angajat are salariul maxim în firmă | <color red> Ex. 3. </color> Să se afle ce angajat are salariul maxim în firmă | ||
- | {{ :bd:laboratoare:lab09.ex3.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex3.png?nolink&460|}} | ||
=== 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 41: | Line 57: | ||
</code> | </code> | ||
<color red>Ex. 4. </color> Să se afișeze șefii angajaților din departamentul 20. | <color red>Ex. 4. </color> Să se afișeze șefii angajaților din departamentul 20. | ||
- | {{ :bd:laboratoare:lab09.ex4.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex4.png?nolink&450|}} | ||
=== Subcereri pe clauza ORDER BY === | === Subcereri pe clauza ORDER BY === | ||
Sintaxa este următoarea: | Sintaxa este următoarea: | ||
Line 55: | Line 73: | ||
</code> | </code> | ||
<color red>Ex. 5. </color> Să se facă o listă cu angajații din departamentele 10 și 20, ordonați descrescător după numărul de angajați din fiecare departament. | <color red>Ex. 5. </color> Să se facă o listă cu angajații din departamentele 10 și 20, ordonați descrescător după numărul de angajați din fiecare departament. | ||
- | {{ :bd:laboratoare:lab09.ex5.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex5.png?nolink&450|}} | ||
=== 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. | ||
- | {{ :bd:laboratoare:lab09.ex6.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex6.png?nolink&500|}} | ||
<color red> Ex. 7.</color> Să se afle care sunt angajații care au salariul mai mare decât salariul cel mai mare pentru funcția de SALESMAN. | <color red> Ex. 7.</color> Să se afle care sunt angajații care au salariul mai mare decât salariul cel mai mare pentru funcția de SALESMAN. | ||
- | {{ :bd:laboratoare:lab09.ex7.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex7.png?nolink&500|}} | ||
Operatorul [NOT] EXISTS este folosit adesea în subcereri corelate și testează dacă subcererea returnează cel puțin o valoare, pentru **EXISTS**, sau niciuna, în cazul lui **NOT EXISTS**, returnând **TRUE** sau **FALSE**. | Operatorul [NOT] EXISTS este folosit adesea în subcereri corelate și testează dacă subcererea returnează cel puțin o valoare, pentru **EXISTS**, sau niciuna, în cazul lui **NOT EXISTS**, returnând **TRUE** sau **FALSE**. | ||
+ | |||
<color red> Ex. 8.</color> Să se determine departamentele care au cel puțin un angajat. | <color red> Ex. 8.</color> Să se determine departamentele care au cel puțin un angajat. | ||
- | {{ :bd:laboratoare:lab09.ex8.png?nolink&300 |}} | + | |
+ | {{:bd:laboratoare:bd_carbon_lab9_ex8.png?nolink&400|}} | ||
<color red> Ex. 9.</color> Să se determine care angajați nu au șef. | <color red> Ex. 9.</color> Să se determine care angajați nu au șef. | ||
- | {{ :bd:laboratoare:lab09.ex9.png?nolink&300 |}} | + | |
- | * 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. | + | {{: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 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**. | ||
* În cazul operatorului **NOT IN**, condiția se evaluează la **FALSE** când în lista de valori sunt incluse valori **NULL**. | * În cazul operatorului **NOT IN**, condiția se evaluează la **FALSE** când în lista de valori sunt incluse valori **NULL**. | ||
<color red> Ex 10. </color>Dacă ex. 9 se rescrie astfel încât cererea să folosească NOT IN în loc de NOT EXISTS, atunci cererea nu va returna nimic. | <color red> Ex 10. </color>Dacă ex. 9 se rescrie astfel încât cererea să folosească NOT IN în loc de NOT EXISTS, atunci cererea nu va returna nimic. | ||
- | {{ :bd:laboratoare:lab09.ex10.png?nolink&300 |}} | ||
+ | {{: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 |