Documente Academic
Documente Profesional
Documente Cultură
Funcţiile de grup mai utilizate sunt: AVG, MIN, MAX, COUNT, SUM.
Exemple:
1. Extragerea salariului minim, maxim şi mediu din tabelul “personal” se face cu comanda:
SELECT MIN(salariu), MAX(salariu), AVG(salariu)
FROM personal
Atenţie valorile NULL sunt ignorate.
2. Extragerea salariilor anuale minim, maxim şi mediu care iau în consideraţie şi sporul se face cu comanda:
SELECT MIN(salariu*(1+NZ(spor,0)),MAX(salariu*(1+NZ(spor,0)), AVG(salariu*(1+NZ(spor,0))
FROM personal
Deoarece o expresie care are un operand NULL are ca rezultat o valoare NULL, se utilizează funcţia
NZ(expr,val) care asociază valoarea specificată de al doilea argument valorilor NULL ale expresiei expr
dată ca prim argument.
Greşeala cea mai frecventă la utilizarea funcţiilor de grup este aceea de asociere a unei coloane (cu valori
individuale pe fiecare linie) cu o funcţie de grup în clauza SELECT. Exemplu:
SELECT nume, MAX(salariu) FROM personal;
Comanda este greşită deoarece coloana nume are valori diferite pentru fiecare linie, iar funcţia MAX întoarce o
valoare pentru toate liniile din tabel.
1.2.SQL. SUBINTEROGĂRI
Subinterogările sunt interogări incluse în alte interogări. Rezultatul subinterogării, furnizat dinamic la execuţie, este
utilizat în interogare Subinterogarea se numeşte interogare interioară, iar interogarea în care se utilizează
interogare exterioară.
Clauzele în care se pot utiliza subinterogări sunt: WHERE, HAVING, FROM.
Subinterogările din clauzele WHERE, FROM sunt utilizate în operaţii de comparaţie astfel:
WHERE <expresie> <operator> (SELECT ……)
Operatorii de comparaţie asociaţi tipurilor de date se utilizează pentru compararea cu o valoare nu cu o mulţime de
valori. În cazul utilizării lor, subinterogarea trebuie să întoarcă o singură valoare. Operatorii sunt: >, <, >=, <=, <>,
BETWEEN…AND…, LIKE
Exemple:
1. Afişaţi angajaţii cu salariul egal cu salariul minim din tabelul “personal”:
SELECT nume, salariu FROM personal WHERE salariu = (SELECT MIN(salariu) FROM personal)
2. Afişaţi salariile minime pe facultăţi mai mari decât salariul minim al facultăţii 2:
SELECT id_facultate,MIN(salariu) FROM personal GROUP BY id_facultate HAVING MIN(salariu) >
(SELECT MIN(salariu) FROM personal WHERE id_facultate=2)
3. Afişaţi angajaţii cu salariul mai mare sau egal decât al angajatului cu codul 3 şi funcţia egală cu cea a
angajatului 8.
SELECT nume, salariu FROM personal
WHERE salariu > (SELECT salariu FROM personal WHERE id_personal=3)
AND functie = (SELECT functie FROM personal WHERE id_personal=8)
Operatorul IN
Operatorul IN este utilizat pentru a compara un operand cu elemente unei mulţimi. Valoarea returnată este true dacă
operandul este egal cu unul din elementele mulţimii. Altfel răspunsul este false.
Exemplu: Afişaţi angajaţii cu salariul egal cu salariul minim din fiecare facultate:
SELECT nume, salariu, id_facultate
FROM personal
WHERE salariu IN (select MIN(salariu) FROM personal GROUP BY id_faculatate)
Operatorul EXISTS
Operatorul EXISTS testeazǎ existenţa elementelor unei mulţimi şi întoarce FALSE pentru o mulţime vidǎ şi TRUE
dacǎ mulţimea are elemente.
Exemplu: Afişaţi facultǎţile fǎrǎ angajaţi :
SELECT id_facultate, nume_facultate
FROM facultati AS f
WHERE NOT EXISTS (SELECT 1
FROM personal
WHERE id_facultate = f.id_facultate);
2. PARTE PRACTICA
1. Afişaţi cel mai mare salariu pentru fiecare functie in ordinea descrescǎtoare a
salariilor.
SELECT functie, MAX(salariu)
FROM personal
GROUP BY functie
ORDER BY MAX(salariu) DESC;
3. Afişaţi, în ordine descrescǎtoare dupǎ salariu, angajatii cu cel mai mare salariu pe
fiecare functie.
SELECT personal.nume,personal.functie,personal.salariu
FROM (SELECT functie,MAX(salariu) AS sal FROM personal
GROUP BY functie) AS t INNER JOIN personal ON
t.functie=personal.functie AND t.sal=personal.salariu
ORDER BY personal.salariu DESC
5. Afişaţi angajaţii cu salariul mai mare decât media salariilor pe fiecare functie.
SELECT nume,functie,salariu
FROM personal
WHERE salariu > ANY (SELECT AVG(salariu) FROM personal GROUP BY
functie)
ORDER BY salariu
6. Afişaţi ultimii angajati din fiecare facultate. Ordonati dupa data angajarii.
SELECT nume, id_facultate, data_angajare
FROM personal
WHERE data_angajare IN (SELECT MAX(data_angajare)
FROM personal
GROUP BY id_facultate)
ORDER BY data_angajare;
11. Afişaţi totalul salariilor pe fiecare funcţie pentru facultatea de “Stiinte Economice”.
SELECT functie, SUM(salariu)
FROM personal
GROUP BY id_facultate,functie
HAVING id_facultate = (SELECT id_facultate FROM facultati WHERE
UCASE(TRIM(nume_facultate))="STIINTE ECONOMICE")
ORDER BY id_facultate,functie
16. Afisati numele angajatilor si gradul salariilor cele mai mici pe fiecare facultate.
SELECT nume, salariu,id_facultate FROM personal AS p WHERE salariu =
(SELECT MAX(salariu) FROM personal WHERE id_facultate=p.id_facultate);
A doua interogare afiseaza functia din total_functii cu cea mai mare suma a a
salariilor:
SELECT functie FROM total_functii WHERE total=(select max(total) From
total_functii);
21. Afisati angajatii care au salariul mai mare decat al lectorilor si nu sunt lectori.
SELECT * from personal WHERE salariu >ANY (SELECT salariu FROM personal
WHERE functie="lector") AND functie<>"lector"
22. Afisati functia care are totalul salariilor mai mare dacat totalul salariilor
conferentiarilor.
SELECT functie,SUM(salariu) FROM personal GROUP BY functie HAVING
SUM(salariu) > (SELECT SUM(salariu) FROM personal WHERE
functie="conferentiar")
A doua interogare:
SELECT nume_facultate
FROM suma_facultati
WHERE suma=(SELECT MAX(suma) FROM suma_facultati);