A continuación, se presentan posibles preguntas que pueden caer en un examen de Oracle SQL, acompañadas de soluciones detalladas que no utilizan la cláusula JOIN
. Estas preguntas están diseñadas para cubrir consultas básicas, subconsultas, valores nulos, funciones agregadas y manejo de datos.
1. Consultas Básicas
Pregunta 1: Mostrar el apellido y salario de los empleados que ganan más de 2000.
Solución:
SELECT apellido, salario
FROM emple
WHERE salario > 2000;
Pregunta 2: Recuperar los nombres y localidades de los departamentos que no están en «MADRID».
Solución:
SELECT dnombre, loc
FROM depart
WHERE loc <> 'MADRID';
2. Subconsultas Simples
Pregunta 3: Mostrar los empleados que trabajan en el departamento «VENTAS».
Solución:
SELECT *
FROM emple
WHERE dept_no = (SELECT dept_no
FROM depart
WHERE dnombre = 'VENTAS');
Pregunta 4: Obtener los temas de la tabla LIBRERIA con más ejemplares que el tema «BIOLOGIA».
Solución:
SELECT tema
FROM libreria
WHERE ejemplares > (SELECT ejemplares
FROM libreria
WHERE tema = 'BIOLOGIA');
3. Funciones Agregadas y Agrupamiento
Pregunta 5: Calcular el salario promedio de los empleados en el departamento 30.
Solución:
SELECT AVG(salario) AS salario_promedio
FROM emple
WHERE dept_no = 30;
Pregunta 6: Contar cuántos empleados hay en cada departamento.
Solución:
SELECT dept_no, COUNT(*) AS num_empleados
FROM emple
GROUP BY dept_no;
4. Subconsultas Correlacionadas
Pregunta 7: Seleccionar empleados cuyo salario sea superior al salario promedio de su departamento.
Solución:
SELECT apellido, salario
FROM emple e
WHERE salario > (SELECT AVG(salario)
FROM emple
WHERE dept_no = e.dept_no);
Pregunta 8: Mostrar los temas de LIBRERIA que tienen más ejemplares que cualquier tema en el estante «B».
Solución:
SELECT tema
FROM libreria
WHERE ejemplares > ALL (SELECT ejemplares
FROM libreria
WHERE estante = 'B');
5. Condicionales y Transformación de Datos
Pregunta 9: Mostrar los apellidos de empleados y una columna indicando «ALTO» si su salario es mayor a 2000, o «BAJO» si no lo es.
Solución:
SELECT apellido,
CASE
WHEN salario > 2000 THEN 'ALTO'
ELSE 'BAJO'
END AS nivel_salario
FROM emple;
Pregunta 10: Recuperar los temas de LIBRERIA y reemplazar «MEDICINA» por «SALUD» en los resultados.
Solución:
SELECT CASE
WHEN tema = 'MEDICINA' THEN 'SALUD'
ELSE tema
END AS tema_modificado
FROM libreria;
6. Manipulación de Fechas
Pregunta 11: Mostrar los apellidos de los empleados y los años que han pasado desde su contratación.
Solución:
SELECT apellido,
ROUND((SYSDATE - fecha_alt) / 365, 1) AS anios_trabajados
FROM emple;
Pregunta 12: Recuperar los nombres de los alumnos nacidos antes del 1 de enero de 1990.
Solución:
SELECT nombre
FROM alum0405
WHERE fecha_nac < TO_DATE('01/01/1990', 'DD/MM/YYYY');
7. Relaciones entre Tablas
Pregunta 13: Mostrar los nombres y apellidos de los alumnos que tienen una nota mayor a 7 en «FOL».
Solución:
SELECT apenom
FROM alumnos
WHERE dni IN (SELECT dni
FROM notas
WHERE cod = (SELECT cod
FROM asignaturas
WHERE nombre = 'FOL')
AND nota > 7);
Pregunta 14: Recuperar las asignaturas que no tienen alumnos matriculados.
Solución:
SELECT *
FROM asignaturas
WHERE cod NOT IN (SELECT cod
FROM notas);
8. Uso de Valores Nulos
Pregunta 15: Mostrar los empleados que no tienen comisiones asignadas.
Solución:
SELECT apellido, salario
FROM emple
WHERE comision IS NULL;
Pregunta 16: Recuperar los temas de LIBRERIA y reemplazar los valores nulos en «EJEMPLARES» con 0.
Solución:
SELECT tema, NVL(ejemplares, 0) AS ejemplares_modificados
FROM libreria;
9. Ordenación y Límite de Resultados
Pregunta 17: Mostrar los temas de LIBRERIA ordenados por número de ejemplares en orden descendente.
Solución:
SELECT tema, ejemplares
FROM libreria
ORDER BY ejemplares DESC;
Pregunta 18: Recuperar los 3 empleados con los salarios más altos.
Solución:
SELECT *
FROM (SELECT apellido, salario
FROM emple
ORDER BY salario DESC)
WHERE ROWNUM <= 3;
10. Escenarios Combinados
Pregunta 19: Mostrar los apellidos y salarios de los empleados cuyo salario supere al promedio de su departamento y tengan comisiones asignadas.
Solución:
SELECT apellido, salario
FROM emple
WHERE salario > (SELECT AVG(salario)
FROM emple
WHERE dept_no = emple.dept_no)
AND comision IS NOT NULL;
Pregunta 20: Contar cuántos alumnos de «Madrid» tienen asignaturas suspendidas y cuántos no.
Solución:
SELECT COUNT(*) AS alumnos_suspendidos
FROM alumnos
WHERE pobla = 'Madrid'
AND dni IN (SELECT dni
FROM notas
WHERE nota < 5);
SELECT COUNT(*) AS alumnos_no_suspendidos
FROM alumnos
WHERE pobla = 'Madrid'
AND dni NOT IN (SELECT dni
FROM notas
WHERE nota < 5);
Conclusión
Estas preguntas abarcan aspectos clave de Oracle SQL y se resuelven sin usar JOIN
, empleando subconsultas y funciones avanzadas. Practicar estas preguntas te ayudará a consolidar tus conocimientos y estar preparado para cualquier examen de SQL.