Ejercicios Prácticos de Consultas SQL con Joins y Agregación en Bases de Datos Relacionales
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 6,66 KB
Ejercicios Prácticos de Consultas SQL Avanzadas
A continuación, se presentan las correcciones y optimizaciones de una serie de consultas SQL enfocadas en la manipulación de datos entre las tablas EMP y DEPT, utilizando diferentes tipos de uniones (joins) y funciones de agregación.
1. Mostrar Nombre de Empleado y Departamento
Objetivo: Obtener el nombre del empleado y el nombre del departamento al que pertenece.
-- 1 MOSTRAR EL NOMBRE DE EMPLEADO Y EL NOMBRE DEL DPTO AL QUE PERTENECEN
SELECT
E.ENAME,
D.DNAME
FROM
EMP E,
DEPT D;
2. Producto Cartesiano Filtrado por Inicial del Nombre
Objetivo: Mostrar el producto cartesiano de las tablas EMP y DEPT, filtrando únicamente los registros donde el nombre del empleado empiece por 'M'.
-- 2 MOSTRAR EL PRODUCTO CARTESIANO DE LAS TABLAS EMP Y DEPT, MOSTRANDO UNICAMENTE LOS REGISTROS
-- QUE EL NOMBRE DE EMPLEADO EMPIECE POR M.
SELECT
E.ENAME,
D.DNAME
FROM
EMP E,
DEPT D
WHERE
E.ENAME LIKE 'M%';
3. Filtrado por Longitud Combinada de Nombres
Objetivo: Mostrar las filas del producto cartesiano que cumplan que la suma de las longitudes de los nombres de empleado y departamento sean mayores que 10 caracteres.
-- 3 MOSTRAR LAS FILAS DEL PRODUCTO CARTESIANO QUE CUMPLAN QUE LA SUMA DE LAS
-- LONGITUDES DE LOS NOMBRES DE EMPLEADO Y DEPARTAMENTO SEAN MAYORES QUE 10 CARACTERES.
SELECT
E.ename AS "EMPLEADO",
D.dname AS "DPTO"
FROM
emp E,
dept D
WHERE
LENGTH(E.ename || D.dname) > 10;
4. Listado de Partidos entre Managers
Objetivo: Organizar un torneo entre todos los managers. Mostrar un listado de los partidos con el nombre de los managers (Local vs. Visitante).
-- 4 SE PRETENDE ORGANIZAR UN TORNEO ENTRE TODOS LOS MANAGER. MOSTRAR UN LISTADO
-- DE LOS PARTIDOS CON EL NOMBRE DE LOS MANAGER.
SELECT
E1.ENAME AS "LOCAL",
E2.ENAME AS "VISITANTE"
FROM
EMP E1,
EMP E2
WHERE
E1.JOB = 'MANAGER'
AND E2.JOB = 'MANAGER'
AND E1.ENAME <> E2.ENAME; -- Evita que un manager juegue contra sí mismo
5. Parejas Manager-Empleado con Suma de Salarios Restringida
Objetivo: Mostrar las parejas formadas por un manager y un empleado cualquiera cuya suma de salarios sea menor que 3500.
-- 5 MOSTRAR LAS PAREJAS FORMADAS POR UN MANAGER Y UN EMPLEADO CUALQUIERA CUYA
-- SUMA DE SALARIOS SEA MENOR QUE 3500
SELECT
E1.ename AS "MANAGER",
E2.ename AS "EMPLEADO"
FROM
emp E1,
emp E2
WHERE
E1.job = 'MANAGER'
AND E1.sal + E2.sal < 3500
AND E1.ename <> E2.ename; -- Se asume que no deben ser la misma persona, aunque el requisito no lo especifica explícitamente.
6. Combinaciones de Nombres de Departamento (CROSS JOIN)
Objetivo: Mostrar las combinaciones de nombres de departamento usando CROSS JOIN.
-- 6 MOSTRAR LAS COMBINACIONES DE NOMBRES DE DPTO, USANDO CROSS JOIN
SELECT
D1.DNAME,
D2.DNAME
FROM
DEPT D1
CROSS JOIN
DEPT D2;
7. Informe Detallado de Empleados y Departamentos (NATURAL JOIN)
Objetivo: Mostrar nombre de empleado, salario, nombre de departamento y localización, utilizando NATURAL JOIN.
-- 7 MOSTRAR NOMBRE DE EMPLEADO, SALARIO, NOMBRE DE DPTO Y LOCALIZACION
SELECT
E.ENAME AS "NOMB EMP",
E.SAL AS "SALARIO",
D.DNAME AS "NOMB DPTO",
D.LOC AS "LOCALIZACION"
FROM
EMP E
NATURAL JOIN
DEPT D;
8. Empleados que Trabajan en New York
Objetivo: Obtener el nombre y salario de los empleados que trabajan en 'NEW YORK'.
-- 8 NOMBRE Y SALARIO DE LOS EMPLEADOS QUE TRABAJAN EN NEW YORK
SELECT
E.ENAME,
E.SAL
FROM
EMP E
NATURAL JOIN
DEPT D
WHERE
D.LOC = 'NEW YORK';
9. Conteo de Empleados por Ciudad
Objetivo: Contar cuántos empleados trabajan en cada ciudad.
-- 9 CUANTOS EMPLEADOS TRABAJAN EN CADA CIUDAD?
SELECT
D.LOC AS "CIUDAD",
COUNT(*) AS "NUM EMP"
FROM
EMP E
NATURAL JOIN
DEPT D
GROUP BY
D.LOC;
10. Ciudades con Más de Tres Empleados
Objetivo: Mostrar en qué ciudades trabajan más de tres empleados.
-- 10 MOSTRAR EN QUE CIUDADES TRABAJAN MAS DE TRES EMPLEADOS.
SELECT
D.LOC AS "CIUDAD",
COUNT(*) AS "NUM EMP"
FROM
EMP E
NATURAL JOIN
DEPT D
GROUP BY
D.LOC
HAVING
COUNT(*) > 3;
11. Empleados Contratados en 1981
Objetivo: Mostrar nombre, oficio y nombre del departamento de los empleados que entraron en la compañía en 1981.
-- 11 MOSTRAR NOMBRE, OFICIO Y NOMBRE DEL DEPARTAMENTO DE LOS EMPLEADOS QUE ENTRARON
-- EN LA COMPAÑÍA EN 1981.
SELECT
E.ENAME AS "NOMB EMP",
E.JOB AS "PUESTO",
D.DNAME AS "NOMB DEPT"
FROM
EMP E
JOIN
DEPT D USING (DEPTNO)
WHERE
TO_CHAR(E.HIREDATE, 'YYYY') = '1981';
12. Conteo de 'CLERK' por Departamento
Objetivo: Mostrar un informe que muestre el nombre del dpto y cuántos 'CLERK' hay en él.
-- 12 MOSTRAR UN INFORME QUE MUESTRE EL NOMBRE DEL DPTO Y CUANTOS CLERK HAY EN EL.
SELECT
D.DNAME AS "NOMB DPTO",
COUNT(*) AS "NUM CLERK"
FROM
EMP E
JOIN
DEPT D USING(DEPTNO)
WHERE
E.JOB = 'CLERK'
GROUP BY
D.DNAME;
13. Conteo de Managers y Analysts por Localidad
Objetivo: Mostrar para cada localidad cuántos 'MANAGER' y cuántos 'ANALYST' hay.
-- 13 MOSTRAR PARA CADA NOMBRE DE DPTO CUANTOS MANAGER Y CUANTOS ANALYST HAY
SELECT
D.LOC AS "LOCALIDAD",
E.JOB AS "OFICIO",
COUNT(*) AS "NUM EMP"
FROM
EMP E
JOIN
DEPT D USING (DEPTNO)
WHERE
E.JOB IN ('MANAGER', 'ANALYST')
GROUP BY
D.LOC, E.JOB
ORDER BY
D.LOC;
14. Conteo de Empleados por Oficio y Localidad
Objetivo: Mostrar para cada localidad cuántos empleados hay de cada oficio.
-- 14 MOSTRAR PARA CADA NOMBRE DE DPTO CUANTOS EMPLEADOS HAY DE CADA OFICIO
SELECT
D.LOC AS "LOCALIDAD",
E.JOB AS "OFICIO",
COUNT(*) AS "NUM EMP"
FROM
EMP E
JOIN
DEPT D ON (E.DEPTNO = D.DEPTNO)
GROUP BY
D.LOC, E.JOB
ORDER BY
D.LOC;
15. Relación Empleado y su Jefe (Auto-Join)
Objetivo: Mostrar el nombre del empleado y el nombre de su jefe.
-- 15 MOSTRAR EL NOMBRE DEL EMPLEADO Y EL NOMBRE DE SU JEFE
SELECT
EMPLEADO.ENAME AS "EMPLEADO",
JEFE.ENAME AS "SUPERVISOR"
FROM
EMP EMPLEADO
JOIN
EMP JEFE ON (EMPLEADO.MGR = JEFE.EMPNO);