BASES DE DATOS I ALTERNATIVA DE SOLUCIÓN AL TALLER 1: SQL (2017.02) Dados los siguiente esquemas: Estudiante ( codigo, nombre, direccion, area_interes ) Curso (, ) Registrado ( codigo,, periodo_academico ) La relación Registrado se refiere a los estudiantes matriculados en determinados cursos. Al respecto, escriba las consultas SQL que den respuesta a las siguientes preguntas: (Para ver los datos de ejemplo, ir a la última página). 01. Se requiere saber los códigos de los cursos que tengan estudiantes matriculados en el período 2017-2. A partir de los datos de ejemplo, se verá que el resultado es: SELECT DISTINCT R. R.periodo_academico = "2017-2" ORDER BY R.; 46003 46004 46007 46008 46009 46010 46011 46012 46013 x 02. Se requiere saber los NOMBRES de los cursos que tengan estudiantes matriculados en el período académico 2017-2. SELECT DISTINCT C., Curso AS C Registrado AS R periodo_academico = "2017-2" ORDER BY C.; ON C. = R. 46003 Programación Orientada a Objetos 46004 Lab. Prog. Orientada a Objetos 46007 46008 46009 Bases de Datos I 46010 Lab. Bases de Datos I 46011 Análisis Numérico 46012 Teoría de la Computación 46013 Arquitectura Computacional 1
03. Se requiere saber los NOMBRES de los cursos que NO tengan estudiantes matriculados en el período académico 2017-2. SELECT AS C ( SELECT C. AS C C. NOT IN ) AS T1 ( SELECT DISTINCT R. periodo_academico = "2017-2") ON C. = T1.; Introducción a la Informatica Lab. Introduccion a la Informática Estructuras de Datos I Lab. Estructuras de Datos I 04. Se requiere saber los NOMBRES de los estudiantes matriculados y los NOMBRES de los cursos en los que están matriculados en el período académico 2017-2. SELECT E.nombre, C. (Curso AS C Registrado AS R ON C. = R.) Estudiante AS E ON R.codigo = E.codigo R.periodo_academico = "2017-2"; nombre Estudiante_1003 Estudiante_1003 Estudiante_1004 Estudiante_1004 Estudiante_1004 Estudiante_1005 Estudiante_1005 Bases de Datos I Lab. Bases de Datos I Bases de Datos I Lab. Bases de Datos I Programación Orientada a Objetos Lab. Prog. Orientada a Objetos Análisis Numérico Teoría de la Computación Arquitectura Computacional 2
05. Se requiere saber los códigos de los estudiantes que estén matriculados en "Bases de Datos I" Ó en "" en el período académico 2017-2. Curso as C Registrado as R ON (C. = R.) C. IN ( SELECT Curso. = "Bases de Datos I" ) AND R.periodo_academico = "2017-2" UNION Curso as C Registrado as R ON (C. = R.) C. IN ( SELECT Curso. = "" ) AND R.periodo_academico = "2017-2"; Que también se puede elaborar de la siguiente manera (sin los ): Registrado as R R. IN (SELECT Curso. = "Bases de Datos I") AND R.periodo_academico = "2017-2" UNION Registrado as R R. IN (SELECT Curso. = "") AND R.periodo_academico = "2017-2"; codigo 1001 1002 1005 3
Ahora, si se desea saber los nombres en lugar de los códigos, se puede hacer lo siguiente: SELECT E.nombre Estudiante AS E UNION ( Registrado as R R. IN ( SELECT Curso. = "Bases de Datos I") AND R.periodo_academico = "2017-2") as T1 ON E.codigo = T1.codigo SELECT E.nombre Estudiante AS E ( Registrado as R R. IN ( SELECT Curso. = "") AND R.periodo_academico = "2017-2") as T2 ON E.codigo = T2.codigo; nombre Estudiante_1005 06. Se requiere saber los NOMBRES de los estudiantes que estén matriculados en "Bases de Datos I" Y en "" en el período académico 2017-2. En este caso, solo basta con reemplazar UNION por INTERSECT en la consulta mostrada en el punto anterior. nombre 4
07. Se requiere saber el listado de cursos en los que TODOS los estudiantes del area de interés "Inteligencia computacional" están matriculados en el período académico 2017-2. Podemos buscar primero los códigos de los cursos, y hacemos la división: SELECT R. R.periodo_academico = "2017-2" AND R.codigo IN ( SELECT E.codigo Estudiante as E E.area_interes = "Inteligencia Computacional" ) GROUP BY R. HAVING COUNT(*)= ( SELECT COUNT (*) Estudiante as E E.area_interes = "Inteligencia Computacional"); Y ahora buscamos los nombres: 46007 46008 SELECT C. AS C (SELECT R. R.periodo_academico = "2017-2" AND R.codigo IN( SELECT E.codigo Estudiante as E E.area_interes = "Inteligencia Computacional" ) GROUP BY R. HAVING COUNT(*) = ( SELECT COUNT (*) Estudiante as E E.area_interes = "Inteligencia Computacional" ) ) AS Resultado ON C. = Resultado.; 5
08. Se requiere saber cuántos estudiantes hay matriculados en cada curso en el período académico 2017-2. Debe indicarse nombre del curso y la cantidad de estudiantes matriculados. Podemos obtener los códigos de los cursos y sus correspondientes conteos: SELECT R., Count(R.codigo) AS Conteos R.periodo_academico = "2017-2" GROUP BY R.; Conteos 46003 1 46004 1 46007 3 46008 3 46009 2 46010 2 46011 1 46012 1 46013 1 Ahora, buscamos los nombres: SELECT C., RCC.conteos Curso AS C ( SELECT R., Count(R.codigo) AS Conteos R.periodo_academico = "2017-2" GROUP BY R. ON C. = RCC.; conteos Programación Orientada a Objetos 1 Lab. Prog. Orientada a Objetos 1 3 3 Bases de Datos I 2 Lab. Bases de Datos I 2 Análisis Numérico 1 Teoría de la Computación 1 Arquitectura Computacional 1 ) AS RCC 6
DATOS: Registrado codigo periodo_ academico Registrado codigo periodo_ academico 1001 46001 2016-1 1004 46001 2015-1 1001 46002 2016-1 1004 46002 2015-1 1001 46003 2016-2 1004 46003 2015-2 1001 46004 2016-2 1004 46004 2015-2 1001 46005 2017-1 1004 46005 2016-1 1001 46006 2017-1 1004 46006 2016-1 1001 46007 2017-2 1004 46007 2016-2 1001 46008 2017-2 1004 46008 2016-2 1001 46009 2017-2 1004 46009 2016-2 1001 46010 2017-2 1004 46010 2016-2 1002 46001 2016-1 1004 46011 2017-2 1002 46002 2016-1 1004 46012 2017-2 1002 46003 2016-2 1004 46013 2017-2 1002 46004 2016-2 1005 46001 2016-1 1002 46005 2017-1 1005 46002 2016-1 1002 46006 2017-1 1005 46003 2016-2 1002 46007 2017-2 1005 46004 2016-2 1002 46008 2017-2 1005 46005 2017-1 1002 46009 2017-2 1005 46006 2017-1 1002 46010 2017-2 1005 46007 2017-2 1003 46001 2016-1 1005 46008 2017-2 1003 46002 2016-1 1006 46001 2017-1 1003 46003 2016-2 1006 46002 2017-1 1003 46004 2016-2 1003 46005 2017-1 1003 46006 2017-1 1004 46001 2017-1 1003 46002 2017-1 1003 46003 2017-2 Estudiante Curso codigo nombre direccion area_interes 1001 Direccion_1001 Tecnologias Informacion 46001 Introducción a la Informatica 1002 Direccion_1002 Inteligencia Computacional 46002 Lab. Introduccion a la Informática 1003 Estudiante_1003 Direccion_1003 Ingenieria Software 46003 Programación Orientada a Objetos 1004 Estudiante_1004 Direccion_1004 Ingenieria Software 46004 Lab. Prog. Orientada a Objetos 1005 Estudiante_1005 Direccion_1005 Inteligencia Computacional 46005 Estructuras de Datos I 1006 Estudiante_1006 Direccion_1006 Tecnologias Informacion 46006 Lab. Estructuras de Datos I 46007 46008 46009 Bases de Datos I 46010 Lab. Bases de Datos I 46011 Análisis Numérico 46012 Teoría de la Computación 46013 Arquitectura Computacional --------------------------------------------------------------- FIN DEL DOCUMENTO 7