Fundamentos de Consultas SQL: Ejercicios Prácticos de Agregación y Joins
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en
español con un tamaño de 5,15 KB
Repaso de Consultas SQL
Este documento presenta una serie de ejercicios prácticos de SQL, cubriendo desde la inserción de datos hasta consultas complejas que involucran múltiples tablas, agregación y subconsultas. Los ejercicios se dividen en dos secciones principales: Gestión de Alojamientos y Gestión de Recursos Humanos (HR).
1. Configuración Inicial de Datos (DML)
A continuación, se muestran las sentencias INSERT utilizadas para poblar las tablas ALOJAMIENTO, HABITACIONES, PERSONAL, ACTIVIDADES y ACT_ALO.
INSERT INTO ALOJAMIENTO VALUES (1, 'ALOJA', 'C/ Los Borrowers', 676879623, 'JABY');
INSERT INTO ALOJAMIENTO VALUES (2, 'LA HUERTA', 'C/ El Tuerto', 676899923, 'FONSO');
INSERT INTO HABITACIONES VALUES (1, 1, 'SIMPLE', 'SI', 40, 2);
INSERT INTO HABITACIONES VALUES (1, 1, 'SIMPLE', 'SI', 40, 2);
INSERT INTO PERSONAL VALUES ('71883579V', 4 , 'JESUS', 'MONTOYA', 'C/ Andalucía Nº 9', 2);
INSERT INTO ACTIVIDADES VALUES (1, 'PUENTING', 'TIRARSE DESDE UN PUENTE', 2);
INSERT INTO ACTIVIDADES VALUES (2, 'SENDERISMO', 'Caminar por el barranco', 2);
INSERT INTO ACT_ALO VALUES (1, 2, 'SABADO');2. Consultas sobre Gestión de Alojamientos
1) Nombre y descripción de las actividades que se realizan en el alojamiento denominado La Huerta.
SELECT C.NOMBRE, C.DESCRIPCION
FROM ACT_ALO A, ALOJAMIENTO B, ACTIVIDADES C
WHERE A.CODIGO_ALO = B.COD_ALO
AND A.CODIGO_ACT = C.CODIGO_ACT
AND B.NOMBRE = 'LA HUERTA';2) Nombre de los alojamientos que tienen habitaciones dobles y realizan actividades de senderismo.
SELECT A.NOMBRE
FROM ALOJAMIENTO A, HABITACIONES B, ACTIVIDADES C, ACT_ALO D
WHERE A.COD_ALO = B.CODIGO_ALO
AND D.CODIGO_ACT = C.CODIGO_ACT
AND B.TIPO = 'DOBLE'
AND C.NOMBRE = 'SENDERISMO';3) Nombre del alojamiento y el nombre del personal.
Nota: La consulta original estaba repetida. Se proporciona la consulta correcta para unir Alojamiento y Personal.
SELECT A.NOMBRE AS NombreAlojamiento, P.NOMBRE AS NombrePersonal
FROM ALOJAMIENTO A, PERSONAL P
WHERE A.COD_ALO = P.CODIGO_ALO;4) Nombre del alojamiento y el número de habitaciones.
SELECT NOMBRE, COUNT(*)
FROM ALOJAMIENTO, HABITACIONES
WHERE COD_ALO = CODIGO_ALO
GROUP BY NOMBRE;5) Nombre de los alojamientos y el número de personas que trabajan en ellos.
SELECT A.NOMBRE, COUNT(*) AS "Nº Personas"
FROM ALOJAMIENTO A, PERSONAL B
WHERE A.COD_ALO = B.CODIGO_ALO
GROUP BY A.NOMBRE;6) Nombre de los alojamientos y el nombre de las personas que trabajan en ellos.
Nota: La consulta proporcionada originalmente cuenta las personas, agrupadas por alojamiento. Si se deseara el nombre de cada persona, se omitiría la función COUNT y el GROUP BY.
SELECT A.NOMBRE, COUNT(*) AS "Nº Personas"
FROM ALOJAMIENTO A, PERSONAL B
WHERE A.COD_ALO = B.CODIGO_ALO
GROUP BY A.NOMBRE;3. Consultas sobre Esquema de Recursos Humanos (HR Schema)
7) ¿Cuántos oficios diferentes existen?
SELECT COUNT(DISTINCT job_id) FROM employees;
-- O, alternativamente, consultando la tabla de oficios:
SELECT COUNT(job_id) FROM jobs;8) ¿Cuántos oficios diferentes tiene el departamento 60?
SELECT COUNT(DISTINCT job_id)
FROM employees
WHERE department_id = 60;9) Nombre del departamento y contar los empleados.
SELECT department_name, COUNT(employee_id)
FROM departments A, employees B
WHERE A.department_id = B.department_id
GROUP BY department_name;10) Número de oficios diferentes por departamento.
SELECT department_name, COUNT(DISTINCT job_id)
FROM departments A, employees B
WHERE A.department_id = B.department_id
GROUP BY department_name;11) Nombre del empleado, oficio, fecha de inicio y fecha de fin (historial laboral).
SELECT
first_name AS Empleado,
job_title AS Oficio,
start_date AS Desde,
end_date AS Hasta
FROM employees A, jobs B, job_history C
WHERE A.job_id = B.job_id
AND B.job_id = C.job_id;12) Mostrar las ciudades ubicadas en Europa.
SELECT city, country_name, region_name
FROM countries C, locations L, regions R
WHERE C.country_id = L.country_id
AND R.region_id = C.region_id
AND C.region_id = 1;13) Empleados activos en Roma.
SELECT COUNT(EMPLOYEE_ID) AS "EMPLEADOS ACTIVOS EN ROMA"
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID
AND LOCATION_ID = (SELECT LOCATION_ID FROM LOCATIONS WHERE CITY = 'ROMA');14) Nombre y apellidos, antigüedad (años) y oficio actual del empleado.
SELECT
first_name AS Nombre,
last_name AS Apellidos,
TRUNC(MONTHS_BETWEEN(SYSDATE, hire_date) / 12) AS Antigüedad_Años,
job_title AS Oficio
FROM employees E, jobs J
WHERE E.job_id = J.job_id;