Consultas SQL Prácticas: Ejercicios Resueltos sobre Carreras, Asignaturas y Alumnos

Inglés6,2 KB

Ejercicios Resueltos de Consultas SQL

A continuación se presentan una serie de consultas SQL resueltas sobre un modelo de base de datos académica que incluye las tablas CARRERA, ASIGNATURA, PERIODO, ASIGNATURA_PERIODO y ALUMNO. Cada ejercicio indica si la consulta funciona correctamente o si presenta errores que deben corregirse.

1. Asignaturas dictadas en primavera de 2008

Estado: Correcta

SELECT *
FROM carrera c
INNER JOIN (
    asignatura a
    INNER JOIN (
        asignatura_periodo ap
        INNER JOIN periodo p ON (ap.idp = p.idp)
    ) ON (a.ida = ap.ida)
) ON (c.idc = a.idc)
WHERE p.semestrep = 'primavera'
  AND p.anop = 2008;

2. Carreras de ingeniería

Estado: Correcta

SELECT C.NOMBREC AS "Nombre de Carrera"
FROM CARRERA C
WHERE C.NOMBREC LIKE 'Ingenier%';

3. Carreras con duración mayor a 3 años

Estado: Correcta

SELECT *
FROM CARRERA C
WHERE C.DURACIONC > 3;

4. Duración de carreras en años y semestres

Estado: Correcta

SELECT C.NOMBREC AS "Nombre de carrera",
       C.DURACIONC AS "Duración Carrera (Años)",
       C.DURACIONC * 2 AS "Semestres"
FROM CARRERA C;

5. Periodo académico según la fecha actual

Estado: No ejecuta (sintaxis incorrecta)

Observaciones: La cláusula CASE está mal construida, la subconsulta tiene paréntesis desbalanceados y falta la estructura CASE WHEN ... THEN ... ELSE ... END correcta. Además, el valor 'OTOÑO' no coincide con 'Otoño' u otras variantes usadas en el resto del ejercicio.

SELECT *
FROM PERIODO P
WHERE P.ANOP = TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))
  AND P.SEMESTREP IN (
      SELECT CASE
                 WHEN TO_NUMBER(TO_CHAR(SYSDATE, 'MM')) BETWEEN 1 AND 8 THEN 'Otoño'
                 ELSE 'Primavera'
             END
      FROM DUAL
  );

6. Carreras con créditos entre 200 y 600

Estado: Correcta

SELECT NOMBREC AS "Nombre de Carrera"
FROM CARRERA
WHERE CREDITOS BETWEEN 200 AND 600;

7. Asignaturas de ingenierías en el periodo actual

Estado: No ejecuta (errores de sintaxis)

Observaciones: Existe una doble cláusula FROM PERIODO P en la subconsulta, la cláusula CASE presenta errores de estructura y los nombres con caracteres especiales (tildes mal codificadas, como "IngenierÃa") deben corregirse a "Ingeniería".

SELECT C.NOMBREC AS "Nombre Carrera",
       A.NOMBREA
FROM CARRERA C
INNER JOIN (
    ASIGNATURA A
    INNER JOIN (
        ASIGNATURA_PERIODO AP
        INNER JOIN PERIODO P ON (AP.IDP = P.IDP)
    ) ON (A.IDA = AP.IDA)
) ON (C.IDC = A.IDC)
WHERE C.NOMBREC IN (
        'Ingeniería en Mecánica',
        'Ingeniería Agrícola',
        'Ingeniería Forestal',
        'Ingeniería en Computación e Informática'
      )
  AND AP.IDP IN (
      SELECT P.IDP
      FROM PERIODO P
      WHERE P.ANOP = TO_NUMBER(TO_CHAR(SYSDATE, 'YYYY'))
        AND P.SEMESTREP IN (
            SELECT CASE
                       WHEN TO_NUMBER(TO_CHAR(SYSDATE, 'MM')) BETWEEN 1 AND 8 THEN 'Otoño'
                       ELSE 'Primavera'
                   END
            FROM DUAL
        )
  );

8. Cantidad de carreras relacionadas con Civil

Estado: Correcta

Observación: La consulta cuenta carreras, por lo que el alias "Cantidad Asignaturas" es incorrecto; se sugiere "Cantidad de Carreras".

SELECT COUNT(NOMBREC) AS "Cantidad de Carreras"
FROM CARRERA
WHERE NOMBREC LIKE '%Civil%';

9. Alumnos y su carrera ordenados alfabéticamente

Estado: Correcta

SELECT A.IDAL AS "Código",
       A.NOMBREAL AS "Alumno",
       C.NOMBREC AS "Carrera"
FROM ALUMNO A
INNER JOIN CARRERA C ON (A.IDC = C.IDC)
ORDER BY C.NOMBREC;

10. Alumnos con más del 50% de créditos de su carrera

Estado: Requiere revisión

Observaciones: La cláusula HAVING hace referencia a C.CREDITOS, que no forma parte del agrupamiento ni de una función de agregación. Además, falta un espacio entre AL.NOMBREAL y el alias "Nombre". Una alternativa es calcular el total de créditos de la carrera en una subconsulta.

SELECT AL.IDAL AS "Código",
       AL.NOMBREAL AS "Nombre",
       SUM(A.CREDITOSA) AS "Créditos"
FROM ALUMNO AL
INNER JOIN (
    CARRERA C
    INNER JOIN ASIGNATURA A ON (C.IDC = A.IDC)
) ON (AL.IDC = C.IDC)
GROUP BY AL.IDAL, AL.NOMBREAL, C.CREDITOS
HAVING SUM(A.CREDITOSA) > (C.CREDITOS * 0.5);

11. Cantidad de alumnos por carrera

Estado: Correcta

SELECT C.NOMBREC AS "Carrera",
       COUNT(AL.IDAL) AS "Cantidad de Alumnos"
FROM CARRERA C
INNER JOIN ALUMNO AL ON (C.IDC = AL.IDC)
GROUP BY C.NOMBREC;

12. Cantidad de alumnos en carreras que no son ingenierías

Estado: Requiere corrección

Observaciones: La columna C.NOMBRE no existe; debe ser C.NOMBREC.

SELECT C.NOMBREC AS "Carrera",
       COUNT(AL.IDAL) AS "Cantidad Alumnos"
FROM CARRERA C
INNER JOIN ALUMNO AL ON (C.IDC = AL.IDC)
WHERE C.NOMBREC NOT LIKE '%Ingenier%'
GROUP BY C.NOMBREC;

13. Alumnos con situación congelada por carrera

Estado: Sin datos

Observaciones: La consulta es sintácticamente válida, pero no devuelve resultados porque no existen registros con situación "congelado" en la tabla o el campo SITUACIONAL tiene un valor distinto. Se recomienda verificar los valores almacenados.

SELECT C.NOMBREC AS "Carrera",
       COUNT(AL.IDAL) AS "Cantidad Alumnos"
FROM CARRERA C
INNER JOIN ALUMNO AL ON (AL.IDC = C.IDC)
WHERE AL.SITUACIONAL = 'congelado'
GROUP BY C.NOMBREC;

Descargar

PDF Word HTML