0% au considerat acest document util (0 voturi)
173 vizualizări6 pagini

Lab 4

Documentul conține 29 de întrebări SQL care vizează operații de agregare, join-uri, subcereri și alte operații pe baza de date employees. Fiecare întrebare este urmată de o soluție propunere de cerere SQL.

Încărcat de

Cristi Teodorescu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca TXT, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
173 vizualizări6 pagini

Lab 4

Documentul conține 29 de întrebări SQL care vizează operații de agregare, join-uri, subcereri și alte operații pe baza de date employees. Fiecare întrebare este urmată de o soluție propunere de cerere SQL.

Încărcat de

Cristi Teodorescu
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca TXT, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 6

1. a) Functiile grup includ valorile NULL in calcule?

b) Care este deosebirea dintre clauzele WHERE si HAVING?

--------------------------
2. Sa se afiseze cel mai mare salariu, cel mai mic salariu, suma si media
salariilor
tuturor angajatilor. Etichetati coloanele Maxim, Minim, Suma, respectiv Media. Sa
se
rotunjeasca rezultatele.

SELECT MAX(salary) maxim,MIN(salary) minim, SUM(salary) suma, AVG(salary) media


FROM employees;
--------------------------
3. Sa se afiseze minimul, maximul, suma si media salariilor pentru fiecare job.

SELECT MAX(salary) maxim,MIN(salary) minim, SUM(salary) suma, AVG(salary)


media,job_id
FROM employees
GROUP BY job_id;
--------------------------
4. Sa se afiseze numarul de angajati pentru fiecare job.

SELECT COUNT(employee_id),job_id
FROM employees
GROUP BY job_id;
--------------------------
5. Sa se determine numarul de angajati care sunt sefi. Etichetati coloana �Nr.
manageri�.

SELECT COUNT(DISTINCT manager_id)


FROM employees;
--------------------------
6. Sa se afiseze diferenta dintre cel mai mare si cel mai mic salariu. Etichetati
coloana.

SELECT MAX(salary)-MIN(salary)
FROM employees;
--------------------------
7. Scrieti o cerere pentru a se afisa numele departamentului, locatia, numarul de
angajati si salariul mediu pentru angajatii din acel departament. Coloanele vor fi
etichetate corespunzator.

SELECT department_name,location_id, count(employee_id),avg(salary)


FROM employees JOIN departments USING (department_id)
GROUP BY department_name, location_id;
-------------------------
8. Sa se afiseze codul si numele angajatilor care c�stiga mai mult dec�t salariul
mediu
din firma. Se va sorta rezultatul �n ordine descrescatoare a salariilor.

SELECT employee_id, last_name,salary


FROM employees
GROUP BY employee_id, last_name, salary
HAVING salary>(SELECT avg(salary)
FROM employees)
ORDER BY salary DESC;
-------------------------
9. Pentru fiecare sef, sa se afiseze codul sau si salariul celui mai prost platit
subordonat. Se vor exclude cei pentru care codul managerului nu este cunoscut. De
asemenea, se vor exclude grupurile �n care salariul minim este mai mic de 1000$.
Sortati rezultatul �n ordine descrescatoare a salariilor.

SELECT ang.manager_id, ang.last_name, ang.salary


FROM employees ang
JOIN employees sef
ON ang.manager_id=sef.employee_id
WHERE ang.salary>=1000 and ang.salary<=(SELECT min(salary)
FROM employees
WHERE manager_id=sef.employee_id);
SAU
SELECT manager_id, last_name,salary
FROM employees ceva
GROUP BY ceva.manager_id,ceva.last_name,ceva.salary
HAVING ceva.salary>=1000 and ceva.salary<=(SELECT min(salary)
FROM employees
WHERE manager_id=ceva.manager_id);
-------------------------
10. Pentru departamentele in care salariul maxim depaseste 3000$, sa se obtina
codul,
numele acestor departamente si salariul maxim pe departament.

SELECT department_id, department_name,max(salary)


FROM employees join departments using (department_id)
GROUP BY department_id, department_name
HAVING max(salary)>9000;
-------------------------
11. Care este salariul mediu minim al job-urilor existente? Salariul mediu al unui
job va fi
considerat drept media arirmetica a salariilor celor care �l practica.

SELECT min(avg(salary))
FROM employees
GROUP BY job_id;
-------------------------
12. Sa se afiseze codul, numele departamentului si suma salariilor pe departamente.

SELECT department_id, department_name, sum(salary)


FROM employees JOIN departments USING (department_id)
GROUP BY department_id, department_name;
-------------------------
13. Sa se afiseze maximul salariilor medii pe departamente.

SELECT max(avg(salary))
FROM employees
GROUP BY department_id;
-------------------------
14. Sa se obtina codul, titlul si salariul mediu al job-ului pentru care salariul
mediu este
minim.

SELECT job_id, job_title,avg(salary)


FROM employees JOIN jobs USING (job_id)
GROUP BY job_id,job_title
HAVING avg(salary)<=(SELECT min(avg(salary))
FROM employees
GROUP BY job_id);
-------------------------
15. Sa se afiseze salariul mediu din firma doar daca acesta este mai mare dec�t
2500.
(clauza HAVING fara GROUP BY)

SELECT AVG(salary)
FROM employees
HAVING avg(salary)>2500;
-------------------------
16. Sa se afiseze suma salariilor pe departamente si, �n cadrul acestora, pe job-
uri.

SELECT department_id,job_id, sum(salary)


FROM employees
GROUP BY department_id,job_id;
-------------------------
17. Sa se afiseze numele departamentului si cel mai mic salariu din departamentul
avand cel mai mare salariu mediu.

SELECT department_id, department_name,min(salary)


FROM employees join departments using (department_id)
GROUP BY department_id, department_name
HAVING avg(salary)>=(SELECT max(avg(salary))
FROM employees
GROUP BY department_id);
-------------------------
18. Sa se afiseze codul, numele departamentului si numarul de angajati care
lucreaza
in acel departament pentru:
a) departamentele in care lucreaza mai putin de 4 angajati;
b) departamentul care are numarul maxim de angajati.

a)
SELECT department_id, department_name,count(employee_id)
FROM employees RIGHT JOIN departments USING (department_id)
GROUP BY department_id, department_name
HAVING count(employee_id)<4;
b)
SELECT department_id, department_name,count(employee_id)
FROM employees RIGHT JOIN departments USING (department_id)
GROUP BY department_id, department_name
HAVING count(employee_id)>=(SELECT max(count(employee_id))
FROM employees
GROUP BY department_id);
-------------------------
AICI AM RAMAS: 19. Sa se afiseze salariatii care au fost angajati �n aceeasi zi a
lunii �n care cei mai multi
dintre salariati au fost angajati.

SELECT *
FROM employees
WHERE TO_CHAR(hire_date,'dd')IN (SELECT to_char(hire_date,'dd')
FROM employees
GROUP BY to_char(hire_date,'dd')
HAVING count(employee_id) IN (SELECT
max(count(employee_id))
FROM employees
GROUP BY
to_char(hire_date,'dd')));
-------------------------
20. Sa se obtina numarul departamentelor care au cel putin 15 angajati.

SELECT count(*)
FROM (SELECT department_id, count(employee_id)
FROM employees
GROUP BY department_id
HAVING count(employee_id)>=15);
-------------------------
21. Sa se obtina codul departamentelor si suma salariilor angajatilor care lucreaza
�n
acestea, �n ordine crescatoare. Se considera departamentele care au mai mult de 10
angajati si al caror cod este diferit de 30.

SELECT department_id, sum(salary), count(employee_id)


FROM employees
WHERE department_id<>30
GROUP BY department_id
HAVING count(employee_id)>10;
-------------------------
22. Sa se afiseze codul, numele departamentului, numarul de angajati si salariul
mediu
din departamentul respectiv, impreuna cu numele, salariul si jobul angajatilor din
acel
departament. Se vor afisa si departamentele fara angajati (outer join).

SELECT d.department_id, department_name,count(coleg.employee_id),


round(avg(coleg.salary),2),ang.last_name,ang.salary,ang.job_id
FROM employees ang
JOIN employees coleg
ON ang.department_id=coleg.department_id
RIGHT JOIN departments d
ON ang.department_id=d.department_id
GROUP BY d.department_id,department_name,ang.last_name,ang.salary,ang.job_id;
------------------------
23. Scrieti o cerere pentru a afisa, pentru departamentele avand codul > 80,
salariul total
pentru fiecare job din cadrul departamentului. Se vor afisa orasul, numele
departamentului, jobul si suma salariilor. Se vor eticheta coloanele corespunzator.

SELECT department_id,department_name,city,job_id,sum(salary)
FROM employees JOIN departments USING (department_id)
JOIN locations USING (location_id)
--WHERE department_id>80
GROUP BY department_id,department_name, job_id,city
HAVING department_id>80;
------------------------
24. Care sunt angajatii care au mai avut cel putin doua joburi?

SELECT employee_id
FROM job_history
GROUP BY employee_id
HAVING count(job_id)>=2;
------------------------
25. Sa se calculeze comisionul mediu din firma, lu�nd �n considerare toate liniile
din
tabel.
SELECT avg(commission_pct), count(commission_pct)
FROM employees;
????Asta?????
------------------------
26. Analizati cele 2 exemple prezentate mai sus (III � IV), referitor la operatorii
ROLLUP
si CUBE.

------------------------
27. Scrieti o cerere pentru a afisa job-ul, salariul total pentru job-ul respectiv
pe departamente
si salariul total pentru job-ul respectiv pe departamentele 30, 50, 80.
Se vor eticheta coloanele corespunzator. Rezultatul va aparea sub forma de mai
jos:
Job Dep30 Dep50 Dep80 Total
------------------------------------------------------------------------------
����.

------------------------
28. Sa se creeze o cerere prin care sa se afiseze numarul total de angajati si, din
acest total,
numarul celor care au fost angajati �n 1997, 1998, 1999 si 2000. Denumiti capetele
de
tabel in mod corespunzator.

SELECT COUNT(*) total,


(SELECT COUNT(*)
FROM employees
WHERE to_char(hire_date,'yyyy')=1997) "1997"
,
(SELECT COUNT(*)
FROM employees
WHERE to_char(hire_date,'yyyy')=1998) "1998"
,
(SELECT COUNT(*)
FROM employees
WHERE to_char(hire_date,'yyyy')=1999) "1999"
,
(SELECT COUNT(*)
FROM employees
WHERE to_char(hire_date,'yyyy')=2000) "2000"
FROM employees
GROUP BY 'mancare';
------------------------
29. Rezolvati problema 22 cu ajutorul subcererilor specificate �n clauza SELECT.

SELECT d.department_id, department_name


,ang.last_name,ang.salary,ang.job_id,
(select count(employee_id)
FROM employees
WHERE department_id=ang.department_id) NUMAR,
(select round(avg(salary),2)
FROM employees
WHERE department_id=ang.department_id) medie
FROM employees ang
RIGHT JOIN departments d
ON ang.department_id=d.department_id;
------------------------
30. Sa se afiseze codul, numele departamentului si suma salariilor pe departamente.

SELECT department_id, department_name, sum(salary)


FROM employees JOIN departments USING (department_id)
GROUP BY department_id, department_name
------------------------
31. Sa se afiseze numele, salariul, codul departamentului si salariul mediu din
departamentul
respectiv.

SELECT last_name,salary,e.department_id,
(SELECT avg(salary)
FROM employees
WHERE department_id=d.department_id) medie
FROM employees e join departments d
ON e.department_id=d.department_id;
------------------------
32. Modificati cererea anterioara, pentru a determina si listarea numarului de
angajati din
departamente.

SELECT last_name,salary,e.department_id,
(SELECT avg(salary)
FROM employees
WHERE department_id=d.department_id) medie,
(SELECT count(employee_id)
FROM employees
WHERE department_id=d.department_id) nr
FROM employees e join departments d
ON e.department_id=d.department_id;
------------------------
33. Pentru fiecare departament, sa se afiseze numele acestuia, numele si salariul
celor mai
prost platiti angajati din cadrul sau.

SELECT last_name, salary, department_id


FROM employees e
WHERE salary = (SELECT min(salary)
FROM employees
WHERE department_id=e.department_id);
-----------------------
34. Rezolvati problema 22 cu ajutorul subcererilor specificate �n clauza FROM.

SELECT d.department_id, department_name


,ang.last_name,ang.salary,ang.job_id,nr,medie
FROM employees ang
RIGHT JOIN departments d
ON ang.department_id=d.department_id
LEFT JOIN (SELECT department_id, count(employee_id) nr ,round(avg(salary),2) medie
FROM employees
GROUP BY department_id) aux
ON aux.department_id=ang.department_id;
-----------------------

S-ar putea să vă placă și