Laborator 09 - Subcereri SQL (II)

Obiective

  • Subcereri pe clauza HAVING
  • Subcereri pe clauza SELECT
  • Subcereri pe clauza ORDER BY
  • Operatori în subcereri

Materiale ajutătoare

Noțiuni teoretice

Subcereri pe clauza HAVING

Sintaxa este următoarea:

SELECT 
   [table_1.]expr_1,  [table_1.]expr_2, ..., [table_1.]expr_n
FROM table_1
WHERE conditions
[GROUP BY expression_group]
HAVING expressions_having operator 
(SELECT  expressions_nested_query
	FROM table_nested_query
	[WHERE conditions_where_nq]
	[[GROUP BY expressions_group_nq] [HAVING conditions_having_nq]])
 [ORDER BY expression_order]

Ex. 1. Să se determine care departament are cei mai mulți angajați pe aceeași funcție.

Ex. 2. Să se determine angajații care au comisionul maxim pentru un departament introdus de la tastatură.

Clauza Having poate fi folosită și într-o subcerere pe tabela temporală.

Ex. 3. Să se afle ce angajat are salariul maxim în firmă

Subcereri pe clauza SELECT

Aceste subcereri pot fi necorelate sau corelate dar trebuie să returneze întotdeauna o singură valoare. Sintaxa este următoarea:

SELECT  expressions_select,
	(SELECT  expressions_nested_query
	FROM table_nested_query
	[WHERE conditions_where_nq]
	[[GROUP BY expressions_group_nq] [HAVING conditions_having_nq]]) alias
FROM TABLE
[WHERE conditions_where]
[[GROUP BY expressions_group] [HAVING conditions_having]]
[ORDER BY expressions_order]

Ex. 4. Să se afișeze șefii angajaților din departamentul 20.

Subcereri pe clauza ORDER BY

Sintaxa este următoarea:

SELECT  expressions_select,
FROM TABLE
[WHERE conditions_where]
[[GROUP BY expressions_group] [HAVING conditions_having]]
ORDER BY (SELECT  expressions_nested_query
	FROM table_nested_query
	[WHERE conditions_where_nq]
	[[GROUP BY expressions_group_nq] [HAVING conditions_having_nq]]) [ACS|DESC]

Ex. 5. 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.

Operatori în 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 (de comparatie) în clauzele WHERE și HAVING;
  • 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
  • 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;
  • 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.

Ex. 6. Să se afle care sunt angajații care au salariul mai mare decât salariul cel mai mic pentru funcția de SALESMAN.

Ex. 7. Să se afle care sunt angajații care au salariul mai mare decât salariul cel mai mare pentru funcția de SALESMAN.

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.

Ex. 8. Să se determine departamentele care au cel puțin un angajat.

Ex. 9. Să se determine care angajați nu au șef.

  • 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.
  • 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.

Ex 10. Dacă ex. 9 se rescrie astfel încât cererea să folosească NOT IN în loc de NOT EXISTS, atunci cererea nu va returna nimic.

Exerciții individuale

1. Să se calculeze și afișeze funcția și venitul mediu lunar pentru fiecare funcție. Să se folosească o subcerere în clauza select.

2. 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.

3. 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
bd/laboratoare/09.txt · Last modified: 2023/11/16 17:38 by sorin.ciolofan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0