This is an old revision of the document!


Laborator 09 - Subcereri SQL (II)

Obiective

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. <color> Să se determine care departament are cei mai mulți angajați pe aceeași funcție. <color red> Ex. 2. <color> Să se determine angajații care au comisionul maxim pentru un departament introdus de la tastatură. <note>Clauza Having poate fi folosită și într-o subcerere pe tabela temporală.</note> <color red> 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 î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;
  • Acești operatori pot fi folosiți cu toate operațiile de comparație;
  • 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.

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 temporale, 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.

bd/laboratoare/09.1539027135.txt.gz · Last modified: 2018/10/08 22:32 by fbratiloveanu
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