PRACTICA TEMA 5 SQL GBD
1-
Verdadero
2-
Falso
3-
Verdadero
4-
SELECT ROUND (MAX(salary), 0)
“Maximum” , ROUND(MIN(salary), 0)
“Minimum” , ROUND(MAX(salary), 0)
ROUND (AVG(salary), 0) “Average”
FROM employees;
5-
SELECTjob_id,
ROUND(MAX(salary),0) "Maximum",
ROUND(MIN(salary),0) "Minimum",
ROUND(SUM(salary),0) "Sum",
ROUND(AVG(salary),0) "Average"
FROM employees
GROUP BY job_id;
6-
SELECTjob_id, COUNT(*)
FROM employees
GROUP BY job_id;
7-
SELECTCOUNT(DISTINCT manager_id) "Number of Managers"
FROM employees;
8-
SELECTMAX(salary) - MIN(salary)
DIFFERENCE FROM employees;
9-
SELECTmanager_id, MIN(salary)
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary) > 6000
ORDER BY MIN(salary) DESC;
10-
SELECT d.department_name "Name", d.location_id "Location ",
COUNT(*) "Number of People",
ROUND(AVG(salary),2) "Salary"
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.department_name, d.location_id;
11-
SELECTCOUNT(*) total,
SUM(DECODE(TO_CHAR(hire_date, 'YYYY'),1995,1,0))"1 995",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1996,1,0))"1 996",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1997,1,0))"1 997",
SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1998,1,0))"1 998"
FROM employees;
12-
SELECTjob_id "Job",
SUM(DECODE(department_id , 20, salary)) "Dept 20" ,
SUM(DECODE(department_id , 50, salary)) "Dept 50" ,
SUM(DECODE(department_id , 80, salary)) "Dept 80" ,
SUM(DECODE(department_id , 90, salary)) "Dept 90" , SUM(salary)
"Total"
FROM employees
GROUP BY job_id;
EJERCICIOS ADICIONALES TEMA 5 ORACLE
1. Mostrar la comisión más alta, el empleado con el último apellido (orden
alfabético) y la fecha de contratación más reciente.
SELECT max(comisión_pct),max(last_name),max(hire_date)
FROM employees;
2. Idem pero para los empleados del departamento 50.
SELECT max(comisión_pct),max(last_name),max(hire_date)
FROM employees
WHERE department_id=50;
SELECT max(comisión_pct),max(last_name),max(hire_date)
FROM employees
GROUP BY department_id=50
HAVING department_id=50
3. Mostrar la fecha más antigua de inicio de contrato y la más nueva de final de
contrato para cada departamento (departamento_id). Ordenar por
departamento.
SELECT max(hire_date), min(hire_date)
FROM employees
GROUP BY department_id
ORDER BY department_id;
4. Idem pero mostrando el nombre del departamento y ordenando por éste.
SELECT d.department_name, max(j.start_date), min(j.end_date)
FROM job_history, j departments d
GROUP BY department_name
ORDER BY department_name
5. Mostrar los nombres de los países para cada región (nombre) ordenado por
nombre de región.
SELECT c.country_name, r.region_name
FROM countries c, regions r
WHERE r.region_id= c.region_id
ORDER BY r.region_name;
SELECT c.country_name, r.region_name
FROM countries c
JOIN regiONs r
ON r.region_id= c.region_id
ORDER BY r.region_name;
6. Mostrar la media de dias de contrato (redondeado a 0 decimales) para cada
categoría laboral. Ordenar por esta última.
SELECT avg(jh.end_date-jh.start_date), j.job_title
FROM job_history jh, jobs j
WHERE jh.job_id = j.job_id
GROUP BY job_title
ORDER BY job_title;
SELECT avg(jh.end_date-jh.start_date), j.job_title
FROM job_history jh
JOIN jobs j
USING(job_id)
GROUP BY job_title
ORDER BY job_title;
7. Mostrar el nombre de cada departamento con el apellido de su jefe. Ordenar
por nombre de departamento.
SELECT d.department_name, e.last_name
FROM departments d, employees e
WHERE d.manager_id=e.employee_id(+)
ORDER BY d.department_name;
SELECT d.department_name, e.last_name
FROM departments d
LEFT OUTER JOIN employees e
ON d.manager_id=e.employee_id
ORDER BY d.department_name;
8. Idem pero mostrANDo también los departamentos sin jefe. En este caso que
diga ‘Sin jefe’ en lugar del apellido.
SELECT d.department_name, nvl(e.last_name, ‘no tiene jefe’)
FROM departments d
LEFT OUTER JOIN employees e
ON d.manager_id=e.employee_id
GROUP BY d.department_name, e.last_name
ORDER BY d.department_name;
9. Idem pero sólo para los departamentos ‘Accounting’ y ‘Benefits’.
SELECT d.department_name, nvl(e.last_name, ‘no tiene jefe’)
FROM departments d
LEFT OUTER JOIN employees e
ON d.manager_id=e.employee_id
GROUP BY d.department_name, e.last_name
HAVING d.department_name in (‘Accounting’, ‘Benefits’)
ORDER BY d.department_name;
EXERCICIS ADICIONALS TEMA 5 ORACLE (II)
1. Mostra el nom de la categoria laboral i el salari mitjà de cada empleat que té
aquesta categoria (ordena per aquesta última).
SELECT j.job_title, avg(salary)
FROM employees e jobs j
WHERE j.job_id=e.job_id
GROUP BY j.job_title
ORDER BY j.job_title;
SELECT j.job_title, avg(salary)
FROM employees e
JOIN jobs j
USING (job_id)
GROUP BY j.job_title
ORDER BY j.job_title;
SELECT j.job_title, avg(salary)
FROM employees e
JOIN jobs j
ON e.job_id=j.job_id
GROUP BY j.job_title
ORDER BY j.job_title;
2. Per a cada ciutat mostra el nombre de departaments que tenen seu en ella.
SELECT l.city, count(d.department_name)
FROM locations l, departments d
WHERE l.location_id = d.location_id
GROUP BY l.city;
SELECT l.city, count(d.department_name)
FROM locations l
JOIN departments d
ON l.location_id = d.location_id
GROUP BY l.city;
SELECT l.city, count(d.department_name)
FROM locations l
JOIN departments d
USING (location_id)
GROUP BY l.city;
3. Ídem del 2 però només de les ciutats que pertanyin als ‘United States of America’.
SELECT l.city, count(d.department_name)
FROM locations l
JOIN departments d
USING (location_id)
JOIN countries c
USING (country_id)
WHERE c.country_name = ‘United States of America’
GROUP BY l.city;
SELECT l.city, count(d.department_name)
FROM locations l, departments d, countries c
WHERE l.location_id=d.location_id
AND l.country_id=c.country_id
AND c.country_name = ‘United States of America’
GROUP BY l.city;
4. Contar quants empleats cobren el matexi salari dintre de cada departament (nom).
SELECT d.department_name, e.salary, count(*)
FROM employees e
CROSS JOIN employees e2
JOIN departments d
ON d.department_id = e.department_id
WHERE e.salary = e2.salary
GROUP BY d.department_name, e.salary;
SELECT d.department_name, e.salary, count(*)
FROM employees e, employees e2, departments d
WHERE d.department_id = e.department_id
AND e.salary = e2.salary
GROUP BY d.department_name, e.salary;
EXERCICIS ADICIONALS TEMA 5 ORACLE (III)
1. Listar cuántos empleados tienen fecha de inicio de cONtrato (JOB_HISTORY) el
año 87.
SELECT count(employee_id)
FROM job_history
WHERE start_date like ‘%/%/87’;
2. Listar el nombre de departamento y cuántos empleados tienen fecha de inicio
de contrato los años 98 y 99.
SELECT d.department_name, count(j.employee_id)
FROM departments d
JOIN job_history j
USING (department_id)
WHERE j.start_date like ‘%98’
OR j.start_date like ‘%99’
GROUP BY department_name;
3. Listar el número total de empleados y cuántos empleados tienen fecha de inicio
de contrato los años 98 y 99.
SELECT COUNT(DISTINCT employee_id),
COUNT(DECODE(SUBSTR(start_date,7),’99’,’1’,’98’,’1’ ))
FROM job_history;
4. Listar para cada last_name de jefe, el salario medio de los empleados que
dependen de él.
SELECT j.last_name, avg(e.salary)
FROM employees j
JOIN employees e
ON j.manager_id = e.employee_id
GROUP BY j.last_name;
5. Listar el nombre de departamento y el año más reciente en que se ha hecho
contrato (hire_date) a algún empleado de ese departamento. Ordenar el
resultado por nombre de departamento.
SELECT d.department_name, max(e.hire_date)
FROM departments d, employees e
WHERE d.department_id = e.department_id
GROUP BY department_name
ORDER BY d.department_name;
SELECT d.department_name, max(e.hire_date)
FROM departments d
JOIN employees e
ON d.department_id = e.department_id
GROUP BY department_name
ORDER BY d.department_name;
SELECT d.department_name, max(e.hire_date)
FROM departments d
JOIN employees e
USING (department_id)
GROUP BY department_name
ORDER BY d.department_name;
6. Listar el nombre de los países y el número de empleados total de los
departamentos ubicados en esos países. Mostrar el resultado solo para ‘United
States of America’ , para ‘Canada’ y para ‘Japan’.