Table of Contents

Laborator 09 - Subcereri SQL (II)

Obiective

Materiale ajutătoare

Resurse BD

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

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.

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

Ordonați după numele departamentului.

Să se rezolve fără a folosi funcții agregate (de grup).

Rezolvati in 3 metode, folosind: